diff src/os/unix/ngx_atomic.h @ 373:018569a8f09c

nginx-0.0.7-2004-06-30-19:30:41 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 30 Jun 2004 15:30:41 +0000
parents src/core/ngx_atomic.h@780e93985b93
children bd39260a1383
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/os/unix/ngx_atomic.h	Wed Jun 30 15:30:41 2004 +0000
@@ -0,0 +1,90 @@
+#ifndef _NGX_ATOMIC_H_INCLUDED_
+#define _NGX_ATOMIC_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+#if ( __i386__ || __amd64__ )
+
+typedef volatile uint32_t  ngx_atomic_t;
+
+#if (NGX_SMP)
+#define NGX_SMP_LOCK  "lock;"
+#else
+#define NGX_SMP_LOCK
+#endif
+
+
+static ngx_inline uint32_t ngx_atomic_inc(ngx_atomic_t *value)
+{
+    uint32_t  old;
+
+    __asm__ volatile (
+
+        NGX_SMP_LOCK
+    "   xaddl  %0, %2;   "
+    "   incl   %0;       "
+
+    : "=q" (old) : "0" (1), "m" (*value));
+
+    return old;
+}
+
+
+static ngx_inline uint32_t ngx_atomic_dec(ngx_atomic_t *value)
+{
+    uint32_t  old;
+
+    __asm__ volatile (
+
+        NGX_SMP_LOCK
+    "   xaddl  %0, %1;   "
+    "   decl   %0;       "
+
+    : "=q" (old) : "0" (-1), "m" (*value));
+
+    return old;
+}
+
+
+static ngx_inline uint32_t ngx_atomic_cmp_set(ngx_atomic_t *lock,
+                                              ngx_atomic_t old,
+                                              ngx_atomic_t set)
+{
+    uint32_t  res;
+
+    __asm__ volatile (
+
+        NGX_SMP_LOCK
+    "   cmpxchgl  %3, %1;   "
+    "   setz      %%al;     "
+    "   movzbl    %%al, %0; "
+
+    : "=a" (res) : "m" (*lock), "a" (old), "q" (set));
+
+    return res;
+}
+
+
+#else
+
+typedef volatile uint32_t  ngx_atomic_t;
+
+/* STUB */
+#define ngx_atomic_inc(x)   (*(x))++;
+#define ngx_atomic_dec(x)   (*(x))--;
+#define ngx_atomic_cmp_set(lock, old, set)   1
+/**/
+
+#endif
+
+
+void ngx_spinlock(ngx_atomic_t *lock, ngx_uint_t spin);
+
+#define ngx_trylock(lock)  (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1))
+#define ngx_unlock(lock)    *(lock) = 0
+
+
+#endif /* _NGX_ATOMIC_H_INCLUDED_ */