Tree @release-0.2.4 (Download .tar.gz)
- ..
- nginx.c
- nginx.h
- ngx_array.c
- ngx_array.h
- ngx_buf.c
- ngx_buf.h
- ngx_conf_file.c
- ngx_conf_file.h
- ngx_config.h
- ngx_connection.c
- ngx_connection.h
- ngx_core.h
- ngx_crc.h
- ngx_cycle.c
- ngx_cycle.h
- ngx_file.c
- ngx_file.h
- ngx_garbage_collector.c
- ngx_garbage_collector.h
- ngx_hash.c
- ngx_hash.h
- ngx_inet.c
- ngx_inet.h
- ngx_list.c
- ngx_list.h
- ngx_log.c
- ngx_log.h
- ngx_output_chain.c
- ngx_palloc.c
- ngx_palloc.h
- ngx_parse.c
- ngx_parse.h
- ngx_radix_tree.c
- ngx_radix_tree.h
- ngx_rbtree.c
- ngx_rbtree.h
- ngx_regex.c
- ngx_regex.h
- ngx_slab.c
- ngx_slab.h
- ngx_spinlock.c
- ngx_string.c
- ngx_string.h
- ngx_times.c
- ngx_times.h
- ngx_unix_domain.c
- ngx_unix_domain.h
ngx_spinlock.c @release-0.2.4 — raw · history · blame
/*
* Copyright (C) Igor Sysoev
*/
#include <ngx_config.h>
#include <ngx_core.h>
/*
* TODO: the P4 optimized assembler version with the "pause" operation
*/
void ngx_spinlock(ngx_atomic_t *lock, ngx_uint_t spin)
{
#if (NGX_HAVE_ATOMIC_OPS)
ngx_uint_t tries;
tries = 0;
for ( ;; ) {
if (*lock) {
if (ngx_ncpu > 1 && tries++ < spin) {
continue;
}
ngx_sched_yield();
tries = 0;
} else {
if (ngx_atomic_cmp_set(lock, 0, 1)) {
return;
}
}
}
#else
#if (NGX_THREADS)
#error ngx_spinlock() or ngx_atomic_cmp_set() are not defined !
#endif
#endif
}
|