| |
| /* |
| * 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; |
| } |
| |
| #if __osf__ /* Tru64 UNIX */ |
| |
| if (err == NGX_EACCESS) { |
| return 0; |
| } |
| |
| #endif |
| |
| ngx_log_abort(err, ngx_trylock_fd_n " %s failed", mtx->name); |
| |
| 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 " %s failed", mtx->name); |
| } |
| |
| |
| 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 " %s failed", mtx->name); |
| } |
| |
| |
| void ngx_shmtx_destory(ngx_shmtx_t *mtx); |
| |
| #endif |
| |
| |
| #endif /* _NGX_SHMTX_H_INCLUDED_ */ |