aboutsummaryrefslogtreecommitdiff
path: root/src/core/ngx_shmtx.h
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2006-02-08 15:33:12 +0000
committerIgor Sysoev <igor@sysoev.ru>2006-02-08 15:33:12 +0000
commitffe714403d604b385c89daa7fe5a83860a672a54 (patch)
tree24ce46a2354a79212f91fdbc3d6045ea340c3f12 /src/core/ngx_shmtx.h
parent2446d5d6adf67d81883024ffb20ec21d146c0450 (diff)
downloadnginx-ffe714403d604b385c89daa7fe5a83860a672a54.tar.gz
nginx-ffe714403d604b385c89daa7fe5a83860a672a54.zip
nginx-0.3.27-RELEASE importrelease-0.3.27
*) Change: the "variables_hash_max_size" and "variables_hash_bucket_size" directives. *) Feature: the $body_bytes_sent variable can be used not only in the "log_format" directive. *) Feature: the $ssl_protocol and $ssl_cipher variables. *) Feature: the cache line size detection for widespread CPUs at start time. *) Feature: now the "accept_mutex" directive is supported using fcntl(2) on platforms different from i386, amd64, sparc64, and ppc. *) Feature: the "lock_file" directive and the --with-lock-path=PATH autoconfiguration directive. *) Bugfix: if the HTTPS protocol was used in the "proxy_pass" directive then the requests with the body was not transferred.
Diffstat (limited to 'src/core/ngx_shmtx.h')
-rw-r--r--src/core/ngx_shmtx.h111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/core/ngx_shmtx.h b/src/core/ngx_shmtx.h
new file mode 100644
index 000000000..fdd62e192
--- /dev/null
+++ b/src/core/ngx_shmtx.h
@@ -0,0 +1,111 @@
+
+/*
+ * 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;
+ ngx_log_t *log;
+#endif
+} ngx_shmtx_t;
+
+
+ngx_int_t ngx_shmtx_create(ngx_shmtx_t *mtx, void *addr, u_char *name,
+ ngx_log_t *log);
+
+
+#if (NGX_HAVE_ATOMIC_OPS)
+
+static ngx_inline ngx_uint_t
+ngx_shmtx_trylock(ngx_shmtx_t *mtx)
+{
+ if (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid)) {
+ return 1;
+ }
+
+ return 0;
+}
+
+#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_error(NGX_LOG_ALERT, mtx->log, err, ngx_trylock_fd_n " failed");
+
+ ngx_abort();
+}
+
+
+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_error(NGX_LOG_ALERT, mtx->log, err, ngx_lock_fd_n " failed");
+
+ ngx_abort();
+}
+
+
+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_error(NGX_LOG_ALERT, mtx->log, err, ngx_unlock_fd_n " failed");
+
+ ngx_abort();
+}
+
+
+void ngx_shmtx_destory(ngx_shmtx_t *mtx);
+
+#endif
+
+
+#endif /* _NGX_SHMTX_H_INCLUDED_ */