Annotation of embedaddon/nginx/src/core/ngx_spinlock.c, revision 1.1
1.1 ! misho 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
! 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: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>