Update and clean Tomato RAF files
[tomato.git] / release / src / router / nginx / src / core / ngx_spinlock.c
blob9c93afaf1b1488ef192c7a7ea72302dac22c1553
2 /*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
5 */
8 #include <ngx_config.h>
9 #include <ngx_core.h>
12 void
13 ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin)
16 #if (NGX_HAVE_ATOMIC_OPS)
18 ngx_uint_t i, n;
20 for ( ;; ) {
22 if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
23 return;
26 if (ngx_ncpu > 1) {
28 for (n = 1; n < spin; n <<= 1) {
30 for (i = 0; i < n; i++) {
31 ngx_cpu_pause();
34 if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
35 return;
40 ngx_sched_yield();
43 #else
45 #if (NGX_THREADS)
47 #error ngx_spinlock() or ngx_atomic_cmp_set() are not defined !
49 #endif
51 #endif