diff options
author | Justin Berger <j.david.berger@gmail.com> | 2017-08-21 18:27:10 (GMT) |
---|---|---|
committer | Justin Berger <j.david.berger@gmail.com> | 2017-11-01 17:32:11 (GMT) |
commit | 2636d86ce2f45f06bdcf4cb60c15df55838a3aa7 (patch) | |
tree | 9fc1b25bc02cea022d762c7786a9a35d027a3b7a /Source/cm_thread.hxx | |
parent | d46b4ba83532d8954e473a26112288cd8e693775 (diff) | |
download | CMake-2636d86ce2f45f06bdcf4cb60c15df55838a3aa7.zip CMake-2636d86ce2f45f06bdcf4cb60c15df55838a3aa7.tar.gz CMake-2636d86ce2f45f06bdcf4cb60c15df55838a3aa7.tar.bz2 |
utility: Added minimal std::thread drop-in
Diffstat (limited to 'Source/cm_thread.hxx')
-rw-r--r-- | Source/cm_thread.hxx | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/Source/cm_thread.hxx b/Source/cm_thread.hxx new file mode 100644 index 0000000..b8c25c7 --- /dev/null +++ b/Source/cm_thread.hxx @@ -0,0 +1,78 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#ifndef CM_THREAD_HXX +#define CM_THREAD_HXX + +#include "cmConfigure.h" // IWYU pragma: keep +#include "cm_uv.h" + +namespace cm { +class mutex +{ + uv_mutex_t _M_; + +public: + mutex() { uv_mutex_init(&_M_); } + ~mutex() { uv_mutex_destroy(&_M_); } + + void lock() { uv_mutex_lock(&_M_); } + + void unlock() { uv_mutex_unlock(&_M_); } +}; + +template <typename T> +class lock_guard +{ + T& _mutex; + +public: + lock_guard(T& m) + : _mutex(m) + { + _mutex.lock(); + } + ~lock_guard() { _mutex.unlock(); } +}; + +class shared_mutex +{ + uv_rwlock_t _M_; + +public: + shared_mutex() { uv_rwlock_init(&_M_); } + ~shared_mutex() { uv_rwlock_destroy(&_M_); } + + void lock() { uv_rwlock_wrlock(&_M_); } + + void unlock() { uv_rwlock_wrunlock(&_M_); } + + void lock_shared() { uv_rwlock_rdlock(&_M_); } + + void unlock_shared() { uv_rwlock_rdunlock(&_M_); } +}; + +template <typename T> +class shared_lock +{ + T& _mutex; + +public: + shared_lock(T& m) + : _mutex(m) + { + _mutex.lock_shared(); + } + ~shared_lock() { _mutex.unlock_shared(); } +}; + +template <typename T> +class unique_lock : public lock_guard<T> +{ +public: + unique_lock(T& m) + : lock_guard<T>(m) + { + } +}; +} +#endif |