summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/threads/threads_kernel_1.h
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/threads/threads_kernel_1.h')
-rw-r--r--ml/dlib/dlib/threads/threads_kernel_1.h158
1 files changed, 158 insertions, 0 deletions
diff --git a/ml/dlib/dlib/threads/threads_kernel_1.h b/ml/dlib/dlib/threads/threads_kernel_1.h
new file mode 100644
index 000000000..586a21b7e
--- /dev/null
+++ b/ml/dlib/dlib/threads/threads_kernel_1.h
@@ -0,0 +1,158 @@
+// Copyright (C) 2003 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#ifndef DLIB_THREADS_KERNEl_1_
+#define DLIB_THREADS_KERNEl_1_
+
+#ifdef DLIB_ISO_CPP_ONLY
+#error "DLIB_ISO_CPP_ONLY is defined so you can't use this OS dependent code. Turn DLIB_ISO_CPP_ONLY off if you want to use it."
+#endif
+
+#include "threads_kernel_abstract.h"
+
+#include "../windows_magic.h"
+#include <windows.h>
+#include "../algs.h"
+#include <condition_variable>
+#include <mutex>
+#include <chrono>
+
+
+namespace dlib
+{
+
+// ----------------------------------------------------------------------------------------
+
+ typedef DWORD thread_id_type;
+
+ inline thread_id_type get_thread_id (
+ )
+ {
+ return GetCurrentThreadId();
+ }
+
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+ // mutex object
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+
+ // forward declaration of signaler
+ class signaler;
+
+ class mutex
+ {
+ public:
+
+ mutex (
+ )
+ {
+ }
+
+ ~mutex (
+ ) { }
+
+ void lock (
+ ) const { cs.lock(); }
+
+ void unlock (
+ ) const { cs.unlock(); }
+
+ private:
+
+ friend class signaler;
+
+ mutable std::mutex cs;
+
+ // restricted functions
+ mutex(mutex&); // copy constructor
+ mutex& operator=(mutex&); // assignment operator
+ };
+
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+ // signaler object
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+
+ class signaler
+ {
+
+ public:
+ signaler (
+ const mutex& associated_mutex
+ ) :
+ m(associated_mutex)
+ {
+
+ }
+
+ ~signaler (
+ ) { }
+
+ void wait (
+ ) const
+ {
+ std::unique_lock<std::mutex> cs(m.cs, std::defer_lock);
+ cv.wait(cs);
+ }
+
+ bool wait_or_timeout (
+ unsigned long milliseconds
+ ) const
+ {
+ std::unique_lock<std::mutex> cs(m.cs, std::defer_lock);
+ auto status = cv.wait_until(cs, std::chrono::system_clock::now() + std::chrono::milliseconds(milliseconds));
+ return status == std::cv_status::no_timeout;
+ }
+
+ void signal (
+ ) const
+ {
+ cv.notify_one();
+ }
+
+ void broadcast (
+ ) const
+ {
+ cv.notify_all();
+ }
+
+ const mutex& get_mutex (
+ ) const { return m; }
+
+ private:
+
+ mutable std::condition_variable cv;
+
+ const mutex& m;
+
+ // restricted functions
+ signaler(signaler&); // copy constructor
+ signaler& operator=(signaler&); // assignment operator
+ };
+
+// ----------------------------------------------------------------------------------------
+
+ namespace threads_kernel_shared_helpers
+ {
+ bool spawn_thread (
+ void (*funct)(void*),
+ void* param
+ );
+ /*!
+ is identical to create_new_thread() but just doesn't use any thread pooling.
+ !*/
+ }
+
+// ----------------------------------------------------------------------------------------
+
+}
+
+#include "threads_kernel_shared.h"
+
+#ifdef NO_MAKEFILE
+#include "threads_kernel_1.cpp"
+#endif
+
+#endif // DLIB_THREADS_KERNEl_1_
+