blob: f6c80f76941e2fd2525903eaca21e76c0902c0b3 [file] [log] [blame]
Igor Sysoev078d1b22004-06-30 15:30:41 +00001
Igor Sysoevd90282d2004-09-28 08:34:51 +00002/*
Igor Sysoevff8da912004-09-29 16:00:49 +00003 * Copyright (C) Igor Sysoev
Igor Sysoevd90282d2004-09-28 08:34:51 +00004 */
5
6
Igor Sysoev078d1b22004-06-30 15:30:41 +00007#include <ngx_config.h>
8#include <ngx_core.h>
9
10
Igor Sysoevc2068d02005-10-19 12:33:58 +000011void
Igor Sysoevffe71442006-02-08 15:33:12 +000012ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin)
Igor Sysoev078d1b22004-06-30 15:30:41 +000013{
Igor Sysoev85080d02004-09-22 16:18:21 +000014
15#if (NGX_HAVE_ATOMIC_OPS)
16
Igor Sysoevffe71442006-02-08 15:33:12 +000017 ngx_uint_t i, n;
Igor Sysoev078d1b22004-06-30 15:30:41 +000018
19 for ( ;; ) {
20
Igor Sysoevffe71442006-02-08 15:33:12 +000021 if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
22 return;
23 }
Igor Sysoev078d1b22004-06-30 15:30:41 +000024
Igor Sysoevffe71442006-02-08 15:33:12 +000025 if (ngx_ncpu > 1) {
Igor Sysoev078d1b22004-06-30 15:30:41 +000026
Igor Sysoevffe71442006-02-08 15:33:12 +000027 for (n = 1; n < spin; n <<= 1) {
Igor Sysoev078d1b22004-06-30 15:30:41 +000028
Igor Sysoevffe71442006-02-08 15:33:12 +000029 for (i = 0; i < n; i++) {
30 ngx_cpu_pause();
31 }
32
33 if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
34 return;
35 }
Igor Sysoev078d1b22004-06-30 15:30:41 +000036 }
37 }
Igor Sysoevffe71442006-02-08 15:33:12 +000038
39 ngx_sched_yield();
Igor Sysoev078d1b22004-06-30 15:30:41 +000040 }
Igor Sysoev85080d02004-09-22 16:18:21 +000041
42#else
43
44#if (NGX_THREADS)
45
46#error ngx_spinlock() or ngx_atomic_cmp_set() are not defined !
47
48#endif
49
50#endif
51
Igor Sysoev078d1b22004-06-30 15:30:41 +000052}