summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-09-11 18:00:09 -0700
committerSage Weil <sage@inktank.com>2013-09-11 23:02:55 -0700
commit759edd07b35abf42562c9925f40f81779c4cd444 (patch)
tree87a496d74d663e89b2594a4a547bb2c001528e66
parent91375d09f78ddf5c7590eaed60f4758a5f36878e (diff)
downloadceph-759edd07b35abf42562c9925f40f81779c4cd444.tar.gz
include: add Spinlock
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/include/Makefile.am1
-rw-r--r--src/include/Spinlock.h57
2 files changed, 58 insertions, 0 deletions
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
index d702ebd2795..b411cfe23f6 100644
--- a/src/include/Makefile.am
+++ b/src/include/Makefile.am
@@ -22,6 +22,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 00000000000..6154ae1124b
--- /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 <sage@inktank.com>
+ */
+
+#ifndef CEPH_SPINLOCK_H
+#define CEPH_SPINLOCK_H
+
+#include <pthread.h>
+
+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