Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ngx_spinlock.c
Go to the documentation of this file.
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
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 
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 }