summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/threads/rmutex_extension.h
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/threads/rmutex_extension.h')
-rw-r--r--ml/dlib/dlib/threads/rmutex_extension.h109
1 files changed, 109 insertions, 0 deletions
diff --git a/ml/dlib/dlib/threads/rmutex_extension.h b/ml/dlib/dlib/threads/rmutex_extension.h
new file mode 100644
index 000000000..b7bf998be
--- /dev/null
+++ b/ml/dlib/dlib/threads/rmutex_extension.h
@@ -0,0 +1,109 @@
+// Copyright (C) 2005 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#ifndef DLIB_RMUTEX_EXTENSIOn_
+#define DLIB_RMUTEX_EXTENSIOn_
+
+#include "threads_kernel.h"
+#include "rmutex_extension_abstract.h"
+
+namespace dlib
+{
+
+// ----------------------------------------------------------------------------------------
+
+ class rmutex
+ {
+ /*!
+ INITIAL VALUE
+ count == 0
+ thread_id == 0
+
+ CONVENTION
+ - count == lock_count()
+
+ - if (no thread currently has a lock on this mutex) then
+ - count == 0
+ - else
+ - count == the number of times the thread that owns this mutex has
+ called lock()
+ - thread_id == the id of this thread.
+ !*/
+ public:
+
+ rmutex (
+ ) : s(m),
+ thread_id(0),
+ count(0)
+ {}
+
+ ~rmutex (
+ )
+ {}
+
+ unsigned long lock_count (
+ ) const
+ {
+ return count;
+ }
+
+ void lock (
+ unsigned long times = 1
+ ) const
+ {
+ const thread_id_type current_thread_id = get_thread_id();
+ m.lock();
+ if (thread_id == current_thread_id)
+ {
+ // we already own this mutex in this case
+ count += times;
+ }
+ else
+ {
+ // wait for our turn to claim this rmutex
+ while (count != 0)
+ s.wait();
+
+ count = times;
+ thread_id = current_thread_id;
+ }
+ m.unlock();
+ }
+
+ void unlock (
+ unsigned long times = 1
+ ) const
+ {
+ const thread_id_type current_thread_id = get_thread_id();
+ m.lock();
+ if (thread_id == current_thread_id)
+ {
+ if (count <= times)
+ {
+ count = 0;
+ s.signal();
+ }
+ else
+ {
+ count -= times;
+ }
+ }
+ m.unlock();
+ }
+
+ private:
+ mutex m;
+ signaler s;
+ mutable thread_id_type thread_id;
+ mutable unsigned long count;
+
+ // restricted functions
+ rmutex(rmutex&); // copy constructor
+ rmutex& operator=(rmutex&); // assignment operator
+ };
+
+// ----------------------------------------------------------------------------------------
+
+}
+
+#endif // DLIB_RMUTEX_EXTENSIOn_
+