diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-07-31 17:14:21 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-07-31 17:14:21 +0100 |
commit | 6b9fdc6ad3ac84cf8b8543b6e46b0ca8c4d61860 (patch) | |
tree | 1152b920b5b6481f9b4a9d31927ece6de658f93b /test/semaphore.cpp | |
parent | before and afterEvents virtual/protected (diff) | |
download | mygrate-6b9fdc6ad3ac84cf8b8543b6e46b0ca8c4d61860.tar.bz2 mygrate-6b9fdc6ad3ac84cf8b8543b6e46b0ca8c4d61860.tar.xz mygrate-6b9fdc6ad3ac84cf8b8543b6e46b0ca8c4d61860.zip |
Build a basic hacky semaphore for compilers that don't support std::binary_semaphore yet
Diffstat (limited to 'test/semaphore.cpp')
-rw-r--r-- | test/semaphore.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/test/semaphore.cpp b/test/semaphore.cpp new file mode 100644 index 0000000..09124ee --- /dev/null +++ b/test/semaphore.cpp @@ -0,0 +1,37 @@ +#include "semaphore.h" + +#ifndef __cpp_lib_semaphore +# include <thread> + +semaphore::semaphore(unsigned int v_) : v {v_} { } + +void +semaphore::release(unsigned int n) +{ + std::lock_guard lk {m}; + v += n; +} + +void +semaphore::acquire() +{ + while (!try_dec()) { } +} + +bool +semaphore::try_dec() +{ + std::lock_guard lk {m}; + if (v) { + v--; + m.unlock(); + return true; + } + else { + m.unlock(); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + return false; + } +} + +#endif |