diff options
author | crupest <crupest@outlook.com> | 2021-06-10 11:12:25 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-06-10 11:12:25 +0800 |
commit | 3128281e50d30d12a053bc06018df4efcc8e988e (patch) | |
tree | e6b4cadff0d9b7d7fd055225e78a7013b100e38c /operating-system-experiment/Mutex.cpp | |
parent | a440d1c5648492b24d1a56ec2e841f2309aad3fd (diff) | |
download | life-3128281e50d30d12a053bc06018df4efcc8e988e.tar.gz life-3128281e50d30d12a053bc06018df4efcc8e988e.tar.bz2 life-3128281e50d30d12a053bc06018df4efcc8e988e.zip |
...
Diffstat (limited to 'operating-system-experiment/Mutex.cpp')
-rw-r--r-- | operating-system-experiment/Mutex.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/operating-system-experiment/Mutex.cpp b/operating-system-experiment/Mutex.cpp new file mode 100644 index 0000000..6a91885 --- /dev/null +++ b/operating-system-experiment/Mutex.cpp @@ -0,0 +1,78 @@ +#include "Mutex.h" + +#include <cassert> +#include <pthread.h> + +#ifndef CRU_WINDOWS +#include <errno.h> +#endif + +namespace cru { +Mutex::Mutex() { +#ifdef CRU_WINDOWS +#else + mutex_ = std::make_unique<pthread_mutex_t>(); + + auto c = pthread_mutex_init(mutex_.get(), nullptr); + assert(c == 0); +#endif +} + +Mutex::Mutex(Mutex &&other) +#ifdef CRU_WINDOWS +#else + : mutex_(std::move(other.mutex_)) +#endif +{ +} + +Mutex &Mutex::operator=(Mutex &&other) { + if (this != &other) { + Destroy(); + mutex_ = std::move(other.mutex_); + } + return *this; +} + +Mutex::~Mutex() { Destroy(); } + +void Mutex::Lock() { +#ifdef CRU_WINDOWS +#else + assert(mutex_); + auto c = pthread_mutex_lock(mutex_.get()); + assert(c == 0); +#endif +} + +bool Mutex::TryLock() { +#ifdef CRU_WINDOWS +#else + assert(mutex_); + auto c = pthread_mutex_trylock(mutex_.get()); + assert(c == 0 || c == EBUSY); + return c == 0 ? true : false; +#endif +} + +void Mutex::Unlock() { +#ifdef CRU_WINDOWS +#else + assert(mutex_); + auto c = pthread_mutex_unlock(mutex_.get()); + assert(c == 0); +#endif +} + +void Mutex::Destroy() { +#ifdef CRU_WINDOWS +#else + if (mutex_ != nullptr) { + auto c = pthread_mutex_destroy(mutex_.get()); + assert(c); + mutex_ = nullptr; + } +#endif +} + +} // namespace cru |