blob: 57fe0b9f5ae6f70b26a924eec6330f239b1c25f1 [file] [log] [blame]
Igor Sysoevffe71442006-02-08 15:33:12 +00001
2/*
3 * Copyright (C) Igor Sysoev
4 */
5
6
7#ifndef _NGX_SHMTX_H_INCLUDED_
8#define _NGX_SHMTX_H_INCLUDED_
9
10
11#include <ngx_config.h>
12#include <ngx_core.h>
13
14
15typedef struct {
16#if (NGX_HAVE_ATOMIC_OPS)
17 ngx_atomic_t *lock;
18#else
19 ngx_fd_t fd;
20 u_char *name;
Igor Sysoevffe71442006-02-08 15:33:12 +000021#endif
22} ngx_shmtx_t;
23
24
Igor Sysoev67cd3362006-11-20 08:51:45 +000025ngx_int_t ngx_shmtx_create(ngx_shmtx_t *mtx, void *addr, u_char *name);
Igor Sysoevffe71442006-02-08 15:33:12 +000026
27
28#if (NGX_HAVE_ATOMIC_OPS)
29
30static ngx_inline ngx_uint_t
31ngx_shmtx_trylock(ngx_shmtx_t *mtx)
32{
Igor Sysoev896b5e42007-01-11 16:07:03 +000033 return (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid));
Igor Sysoevffe71442006-02-08 15:33:12 +000034}
35
36#define ngx_shmtx_lock(mtx) ngx_spinlock((mtx)->lock, ngx_pid, 1024)
37
38#define ngx_shmtx_unlock(mtx) (void) ngx_atomic_cmp_set((mtx)->lock, ngx_pid, 0)
39
40#define ngx_shmtx_destory(mtx)
41
42
43#else
44
45static ngx_inline ngx_uint_t
46ngx_shmtx_trylock(ngx_shmtx_t *mtx)
47{
48 ngx_err_t err;
49
50 err = ngx_trylock_fd(mtx->fd);
51
52 if (err == 0) {
53 return 1;
54 }
55
56 if (err == NGX_EAGAIN) {
57 return 0;
58 }
59
Igor Sysoevda0a5312009-03-13 14:53:30 +000060#if __osf__ /* Tru64 UNIX */
61
62 if (err == NGX_EACCESS) {
63 return 0;
64 }
65
66#endif
67
68 ngx_log_abort(err, ngx_trylock_fd_n " %s failed", mtx->name);
Igor Sysoev0ddd9d62007-02-14 13:52:47 +000069
70 return 0;
Igor Sysoevffe71442006-02-08 15:33:12 +000071}
72
73
74static ngx_inline void
75ngx_shmtx_lock(ngx_shmtx_t *mtx)
76{
77 ngx_err_t err;
78
79 err = ngx_lock_fd(mtx->fd);
80
81 if (err == 0) {
82 return;
83 }
84
Igor Sysoevda0a5312009-03-13 14:53:30 +000085 ngx_log_abort(err, ngx_lock_fd_n " %s failed", mtx->name);
Igor Sysoevffe71442006-02-08 15:33:12 +000086}
87
88
89static ngx_inline void
90ngx_shmtx_unlock(ngx_shmtx_t *mtx)
91{
92 ngx_err_t err;
93
94 err = ngx_unlock_fd(mtx->fd);
95
96 if (err == 0) {
97 return;
98 }
99
Igor Sysoevda0a5312009-03-13 14:53:30 +0000100 ngx_log_abort(err, ngx_unlock_fd_n " %s failed", mtx->name);
Igor Sysoevffe71442006-02-08 15:33:12 +0000101}
102
103
104void ngx_shmtx_destory(ngx_shmtx_t *mtx);
105
106#endif
107
108
109#endif /* _NGX_SHMTX_H_INCLUDED_ */