From: Sage Weil Date: Thu, 12 Sep 2013 01:00:09 +0000 (-0700) Subject: include: add Spinlock X-Git-Tag: v0.72-rc1~42^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=87577753f4bc1043016bfdb548c43214a7d58f4e;p=ceph.git include: add Spinlock Signed-off-by: Sage Weil --- diff --git a/src/include/Makefile.am b/src/include/Makefile.am index c8823ce523dd..34976a6cc299 100644 --- a/src/include/Makefile.am +++ b/src/include/Makefile.am @@ -21,6 +21,7 @@ noinst_HEADERS += \ include/Context.h \ include/CompatSet.h \ include/Distribution.h \ + include/Spinlock.h \ include/addr_parsing.h \ include/assert.h \ include/atomic.h \ diff --git a/src/include/Spinlock.h b/src/include/Spinlock.h new file mode 100644 index 000000000000..6154ae1124b5 --- /dev/null +++ b/src/include/Spinlock.h @@ -0,0 +1,57 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2013 Inktank + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + * @author Sage Weil + */ + +#ifndef CEPH_SPINLOCK_H +#define CEPH_SPINLOCK_H + +#include + +class Spinlock { + mutable pthread_spinlock_t _lock; + +public: + Spinlock() { + pthread_spin_init(&_lock, PTHREAD_PROCESS_PRIVATE); + } + ~Spinlock() { + pthread_spin_destroy(&_lock); + } + + // don't allow copying. + void operator=(Spinlock& s); + Spinlock(const Spinlock& s); + + /// acquire spinlock + void lock() const { + pthread_spin_lock(&_lock); + } + /// release spinlock + void unlock() const { + pthread_spin_unlock(&_lock); + } + + class Locker { + const Spinlock& spinlock; + public: + Locker(const Spinlock& s) : spinlock(s) { + spinlock.lock(); + } + ~Locker() { + spinlock.unlock(); + } + }; +}; + +#endif