Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:csbuild:DBA
dba-nginx-180-stream
nginx-lock.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File nginx-lock.patch of Package dba-nginx-180-stream
# HG changeset patch # User Ruslan Ermilov <ru@nginx.com> # Date 1426935908 -10800 # Node ID 682d8222c6b19d3f581d463e1cdc6f7c5c57059b # Parent c44459611d91e1359d1705c501ab97f66ad61f22 Core: read/write locks. diff -r c44459611d91 -r 682d8222c6b1 auto/sources --- a/auto/sources Fri Apr 10 14:48:36 2015 +0300 +++ b/auto/sources Sat Mar 21 14:05:08 2015 +0300 @@ -28,6 +28,7 @@ src/core/ngx_sha1.h \ src/core/ngx_rbtree.h \ src/core/ngx_radix_tree.h \ + src/core/ngx_rwlock.h \ src/core/ngx_slab.h \ src/core/ngx_times.h \ src/core/ngx_shmtx.h \ @@ -65,6 +66,7 @@ src/core/ngx_connection.c \ src/core/ngx_cycle.c \ src/core/ngx_spinlock.c \ + src/core/ngx_rwlock.c \ src/core/ngx_cpuinfo.c \ src/core/ngx_conf_file.c \ src/core/ngx_resolver.c \ diff -r c44459611d91 -r 682d8222c6b1 src/core/ngx_core.h --- a/src/core/ngx_core.h Fri Apr 10 14:48:36 2015 +0300 +++ b/src/core/ngx_core.h Sat Mar 21 14:05:08 2015 +0300 @@ -68,6 +68,7 @@ #endif #include <ngx_radix_tree.h> #include <ngx_times.h> +#include <ngx_rwlock.h> #include <ngx_shmtx.h> #include <ngx_slab.h> #include <ngx_inet.h> diff -r c44459611d91 -r 682d8222c6b1 src/core/ngx_rwlock.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/core/ngx_rwlock.c Sat Mar 21 14:05:08 2015 +0300 @@ -0,0 +1,112 @@ + +/* + * Copyright (C) Ruslan Ermilov + * Copyright (C) Nginx, Inc. + */ + + +#include <ngx_config.h> +#include <ngx_core.h> + + +#if (NGX_HAVE_ATOMIC_OPS) + + +#define NGX_RWLOCK_SPIN 2048 +#define NGX_RWLOCK_WLOCK ((ngx_atomic_uint_t) -1) + + +void +ngx_rwlock_wlock(ngx_atomic_t *lock) +{ + ngx_uint_t i, n; + + for ( ;; ) { + + if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, NGX_RWLOCK_WLOCK)) { + return; + } + + if (ngx_ncpu > 1) { + + for (n = 1; n < NGX_RWLOCK_SPIN; n <<= 1) { + + for (i = 0; i < n; i++) { + ngx_cpu_pause(); + } + + if (*lock == 0 + && ngx_atomic_cmp_set(lock, 0, NGX_RWLOCK_WLOCK)) + { + return; + } + } + } + + ngx_sched_yield(); + } +} + + +void +ngx_rwlock_rlock(ngx_atomic_t *lock) +{ + ngx_uint_t i, n; + ngx_atomic_uint_t readers; + + for ( ;; ) { + readers = *lock; + + if (readers != NGX_RWLOCK_WLOCK + && ngx_atomic_cmp_set(lock, readers, readers + 1)) + { + return; + } + + if (ngx_ncpu > 1) { + + for (n = 1; n < NGX_RWLOCK_SPIN; n <<= 1) { + + for (i = 0; i < n; i++) { + ngx_cpu_pause(); + } + + readers = *lock; + + if (readers != NGX_RWLOCK_WLOCK + && ngx_atomic_cmp_set(lock, readers, readers + 1)) + { + return; + } + } + } + + ngx_sched_yield(); + } +} + + +void +ngx_rwlock_unlock(ngx_atomic_t *lock) +{ + ngx_atomic_uint_t readers; + + readers = *lock; + + if (readers == NGX_RWLOCK_WLOCK) { + *lock = 0; + return; + } + + for ( ;; ) { + + if (ngx_atomic_cmp_set(lock, readers, readers - 1)) { + return; + } + + readers = *lock; + } +} + + +#endif diff -r c44459611d91 -r 682d8222c6b1 src/core/ngx_rwlock.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/core/ngx_rwlock.h Sat Mar 21 14:05:08 2015 +0300 @@ -0,0 +1,21 @@ + +/* + * Copyright (C) Ruslan Ermilov + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_RWLOCK_H_INCLUDED_ +#define _NGX_RWLOCK_H_INCLUDED_ + + +#include <ngx_config.h> +#include <ngx_core.h> + + +void ngx_rwlock_wlock(ngx_atomic_t *lock); +void ngx_rwlock_rlock(ngx_atomic_t *lock); +void ngx_rwlock_unlock(ngx_atomic_t *lock); + + +#endif /* _NGX_RWLOCK_H_INCLUDED_ */
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor