1
2 /*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
5 */
6
7
8 #include <ngx_config.h>
9 #include <ngx_core.h>
10
11
12 void
ngx_spinlock(ngx_atomic_t * lock,ngx_atomic_int_t value,ngx_uint_t spin)13 ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin)
14 {
15
16 #if (NGX_HAVE_ATOMIC_OPS)
17
18 ngx_uint_t i, n;
19
20 for ( ;; ) {
21
22 if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
23 return;
24 }
25
26 if (ngx_ncpu > 1) {
27
28 for (n = 1; n < spin; n <<= 1) {
29
30 for (i = 0; i < n; i++) {
31 ngx_cpu_pause();
32 }
33
34 if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
35 return;
36 }
37 }
38 }
39
40 ngx_sched_yield();
41 }
42
43 #else
44
45 #if (NGX_THREADS)
46
47 #error ngx_spinlock() or ngx_atomic_cmp_set() are not defined !
48
49 #endif
50
51 #endif
52
53 }
54