12 #if (NGX_HAVE_ATOMIC_OPS)
21 mtx->lock = &addr->
lock;
29 #if (NGX_HAVE_POSIX_SEM)
31 mtx->wait = &addr->wait;
33 if (sem_init(&mtx->sem, 1, 0) == -1) {
49 #if (NGX_HAVE_POSIX_SEM)
52 if (sem_destroy(&mtx->sem) == -1) {
54 "sem_destroy() failed");
65 return (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0,
ngx_pid));
78 if (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0,
ngx_pid)) {
84 for (n = 1; n < mtx->
spin; n <<= 1) {
86 for (i = 0; i < n; i++) {
91 && ngx_atomic_cmp_set(mtx->lock, 0,
ngx_pid))
98 #if (NGX_HAVE_POSIX_SEM)
100 if (mtx->semaphore) {
101 (void) ngx_atomic_fetch_add(mtx->wait, 1);
103 if (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0,
ngx_pid)) {
108 "shmtx wait %uA", *mtx->wait);
110 while (sem_wait(&mtx->sem) == -1) {
117 "sem_wait() failed while waiting on shmtx");
142 if (ngx_atomic_cmp_set(mtx->lock,
ngx_pid, 0)) {
143 ngx_shmtx_wakeup(mtx);
152 "shmtx forced unlock");
154 if (ngx_atomic_cmp_set(mtx->lock, pid, 0)) {
155 ngx_shmtx_wakeup(mtx);
166 #if (NGX_HAVE_POSIX_SEM)
169 if (!mtx->semaphore) {
181 if (ngx_atomic_cmp_set(mtx->wait, wait, wait - 1)) {
187 "shmtx wake %uA", wait);
189 if (sem_post(&mtx->sem) == -1) {
191 "sem_post() failed while wake shmtx");
261 if (err == NGX_EACCESS) {