From: Yehuda Sadeh Date: Mon, 31 Mar 2014 21:49:50 +0000 (-0700) Subject: atomic_t: add atomic64_t X-Git-Tag: v0.82~44^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bf3ba6001c7b4cf37edfe6551d3ef298ebcbf421;p=ceph.git atomic_t: add atomic64_t Signed-off-by: Yehuda Sadeh --- diff --git a/configure.ac b/configure.ac index d507d160c3d..8e583056a2a 100644 --- a/configure.ac +++ b/configure.ac @@ -483,9 +483,14 @@ AS_IF([test "x$with_libatomic_ops" != xno], [no libatomic-ops found (use --without-libatomic-ops to disable)]) ])]) AS_IF([test "$HAVE_ATOMIC_OPS" = "1"], - [], + [ + AC_CHECK_SIZEOF(AO_t, [], [ + #include + ]) + ], [AC_DEFINE([NO_ATOMIC_OPS], [1], [Defined if you do not have atomic_ops])]) + AM_CONDITIONAL(WITH_LIBATOMIC, [test "$HAVE_ATOMIC_OPS" = "1"]) # newsyn? requires mpi. diff --git a/src/include/atomic.h b/src/include/atomic.h index 537fa989cd3..b03e0293e64 100644 --- a/src/include/atomic.h +++ b/src/include/atomic.h @@ -21,6 +21,61 @@ #endif #include +#include "include/Spinlock.h" + +namespace ceph { + template + class atomic_spinlock_t { + mutable ceph_spinlock_t lock; + T val; + public: + atomic_spinlock_t(T i=0) + : val(i) { + ceph_spin_init(&lock); + } + ~atomic_spinlock_t() { + ceph_spin_destroy(&lock); + } + void set(size_t v) { + ceph_spin_lock(&lock); + val = v; + ceph_spin_unlock(&lock); + } + T inc() { + ceph_spin_lock(&lock); + T r = ++val; + ceph_spin_unlock(&lock); + return r; + } + T dec() { + ceph_spin_lock(&lock); + T r = --val; + ceph_spin_unlock(&lock); + return r; + } + void add(T d) { + ceph_spin_lock(&lock); + val += d; + ceph_spin_unlock(&lock); + } + void sub(T d) { + ceph_spin_lock(&lock); + val -= d; + ceph_spin_unlock(&lock); + } + T read() const { + signed long ret; + ceph_spin_lock(&lock); + ret = val; + ceph_spin_unlock(&lock); + return ret; + } + private: + // forbid copying + atomic_spinlock_t(const atomic_spinlock_t &other); + atomic_spinlock_t &operator=(const atomic_spinlock_t &rhs); + }; +} #ifndef NO_ATOMIC_OPS @@ -62,7 +117,15 @@ namespace ceph { atomic_t(const atomic_t &other); atomic_t &operator=(const atomic_t &rhs); }; + +#if SIZEOF_AO_T == 8 + typedef atomic_t atomic64_t; +#else + typedef atomic_spinlock_t atomic64_t; +#endif + } + #else /* * crappy slow implementation that uses a pthreads spinlock. @@ -70,56 +133,9 @@ namespace ceph { #include "include/Spinlock.h" namespace ceph { - class atomic_t { - mutable ceph_spinlock_t lock; - signed long val; - public: - atomic_t(int i=0) - : val(i) { - ceph_spin_init(&lock); - } - ~atomic_t() { - ceph_spin_destroy(&lock); - } - void set(size_t v) { - ceph_spin_lock(&lock); - val = v; - ceph_spin_unlock(&lock); - } - int inc() { - ceph_spin_lock(&lock); - int r = ++val; - ceph_spin_unlock(&lock); - return r; - } - int dec() { - ceph_spin_lock(&lock); - int r = --val; - ceph_spin_unlock(&lock); - return r; - } - void add(int d) { - ceph_spin_lock(&lock); - val += d; - ceph_spin_unlock(&lock); - } - void sub(int d) { - ceph_spin_lock(&lock); - val -= d; - ceph_spin_unlock(&lock); - } - int read() const { - signed long ret; - ceph_spin_lock(&lock); - ret = val; - ceph_spin_unlock(&lock); - return ret; - } - private: - // forbid copying - atomic_t(const atomic_t &other); - atomic_t &operator=(const atomic_t &rhs); - }; + typedef atomic_spinlock_t atomic_t; + typedef atomic_spinlock_t atomic64_t; } + #endif #endif