|  | 
 | /* | 
 |  * Copyright (C) Igor Sysoev | 
 |  */ | 
 |  | 
 |  | 
 | #ifndef _NGX_SHMTX_H_INCLUDED_ | 
 | #define _NGX_SHMTX_H_INCLUDED_ | 
 |  | 
 |  | 
 | #include <ngx_config.h> | 
 | #include <ngx_core.h> | 
 |  | 
 |  | 
 | typedef struct { | 
 | #if (NGX_HAVE_ATOMIC_OPS) | 
 |     ngx_atomic_t  *lock; | 
 | #else | 
 |     ngx_fd_t       fd; | 
 |     u_char        *name; | 
 | #endif | 
 | } ngx_shmtx_t; | 
 |  | 
 |  | 
 | ngx_int_t ngx_shmtx_create(ngx_shmtx_t *mtx, void *addr, u_char *name); | 
 |  | 
 |  | 
 | #if (NGX_HAVE_ATOMIC_OPS) | 
 |  | 
 | static ngx_inline ngx_uint_t | 
 | ngx_shmtx_trylock(ngx_shmtx_t *mtx) | 
 | { | 
 |     return (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid)); | 
 | } | 
 |  | 
 | #define ngx_shmtx_lock(mtx)   ngx_spinlock((mtx)->lock, ngx_pid, 1024) | 
 |  | 
 | #define ngx_shmtx_unlock(mtx) (void) ngx_atomic_cmp_set((mtx)->lock, ngx_pid, 0) | 
 |  | 
 | #define ngx_shmtx_destory(mtx) | 
 |  | 
 |  | 
 | #else | 
 |  | 
 | static ngx_inline ngx_uint_t | 
 | ngx_shmtx_trylock(ngx_shmtx_t *mtx) | 
 | { | 
 |     ngx_err_t  err; | 
 |  | 
 |     err = ngx_trylock_fd(mtx->fd); | 
 |  | 
 |     if (err == 0) { | 
 |         return 1; | 
 |     } | 
 |  | 
 |     if (err == NGX_EAGAIN) { | 
 |         return 0; | 
 |     } | 
 |  | 
 |     ngx_log_abort(err, ngx_trylock_fd_n " failed"); | 
 |  | 
 |     return 0; | 
 | } | 
 |  | 
 |  | 
 | static ngx_inline void | 
 | ngx_shmtx_lock(ngx_shmtx_t *mtx) | 
 | { | 
 |     ngx_err_t  err; | 
 |  | 
 |     err = ngx_lock_fd(mtx->fd); | 
 |  | 
 |     if (err == 0) { | 
 |         return; | 
 |     } | 
 |  | 
 |     ngx_log_abort(err, ngx_lock_fd_n " failed"); | 
 | } | 
 |  | 
 |  | 
 | static ngx_inline void | 
 | ngx_shmtx_unlock(ngx_shmtx_t *mtx) | 
 | { | 
 |     ngx_err_t  err; | 
 |  | 
 |     err = ngx_unlock_fd(mtx->fd); | 
 |  | 
 |     if (err == 0) { | 
 |         return; | 
 |     } | 
 |  | 
 |     ngx_log_abort(err, ngx_unlock_fd_n " failed"); | 
 | } | 
 |  | 
 |  | 
 | void ngx_shmtx_destory(ngx_shmtx_t *mtx); | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | #endif /* _NGX_SHMTX_H_INCLUDED_ */ |