0
|
1
|
|
2 /*
|
|
3 * Copyright (C) Igor Sysoev
|
644
|
4 * Copyright (C) Nginx, Inc.
|
0
|
5 */
|
|
6
|
|
7
|
|
8 #include <ngx_config.h>
|
|
9 #include <ngx_core.h>
|
|
10
|
|
11
|
112
|
12 void
|
160
|
13 ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin)
|
0
|
14 {
|
|
15
|
|
16 #if (NGX_HAVE_ATOMIC_OPS)
|
|
17
|
160
|
18 ngx_uint_t i, n;
|
0
|
19
|
|
20 for ( ;; ) {
|
|
21
|
160
|
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) {
|
0
|
29
|
160
|
30 for (i = 0; i < n; i++) {
|
|
31 ngx_cpu_pause();
|
|
32 }
|
0
|
33
|
160
|
34 if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
|
|
35 return;
|
|
36 }
|
0
|
37 }
|
|
38 }
|
160
|
39
|
|
40 ngx_sched_yield();
|
0
|
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 }
|