summaryrefslogtreecommitdiff
path: root/libcult/cult/sched/lock.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'libcult/cult/sched/lock.hxx')
-rw-r--r--libcult/cult/sched/lock.hxx58
1 files changed, 58 insertions, 0 deletions
diff --git a/libcult/cult/sched/lock.hxx b/libcult/cult/sched/lock.hxx
new file mode 100644
index 0000000..1ecf3fb
--- /dev/null
+++ b/libcult/cult/sched/lock.hxx
@@ -0,0 +1,58 @@
+// file : cult/sched/lock.hxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef CULT_SCHED_LOCK_HXX
+#define CULT_SCHED_LOCK_HXX
+
+#include <cult/types/fundamental.hxx>
+
+namespace Cult
+{
+ namespace Sched
+ {
+ class Lock: public NonCopyable
+ {
+ public:
+ ~Lock ()
+ {
+ unlock ();
+ }
+
+ template <typename X>
+ Lock (X& x)
+ : x_ (reinterpret_cast<Void*>(&x)),
+ unlock_ (&unlock<X>),
+ locked_ (true)
+ {
+ x.lock ();
+ }
+
+ Void
+ unlock ()
+ {
+ if (locked_)
+ {
+ unlock_ (x_);
+ locked_ = false;
+ }
+ }
+
+ private:
+ template <typename X>
+ static Void
+ unlock (Void* p)
+ {
+ reinterpret_cast<X*> (p)->unlock ();
+ }
+
+ private:
+ Void* x_;
+ Void (*unlock_) (Void*);
+ Boolean locked_;
+ };
+ }
+}
+
+#endif // CULT_SCHED_LOCK_HXX