From 6b9fdc6ad3ac84cf8b8543b6e46b0ca8c4d61860 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 31 Jul 2021 17:14:21 +0100 Subject: Build a basic hacky semaphore for compilers that don't support std::binary_semaphore yet --- test/semaphore.cpp | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 test/semaphore.cpp (limited to 'test/semaphore.cpp') 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 + +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 -- cgit v1.2.3