| /* | |
| * 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_ */ |