aboutsummaryrefslogtreecommitdiffstats
path: root/lib/utils/semaphore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/utils/semaphore.cpp')
-rw-r--r--lib/utils/semaphore.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/utils/semaphore.cpp b/lib/utils/semaphore.cpp
new file mode 100644
index 000000000..f4f5b2b53
--- /dev/null
+++ b/lib/utils/semaphore.cpp
@@ -0,0 +1,39 @@
+/*
+* Semaphore
+* by Pierre Gaston (http://p9as.blogspot.com/2012/06/c11-semaphores.html)
+* modified by Joel Low for Botan
+*
+*/
+
+#include <botan/internal/semaphore.h>
+
+namespace Botan {
+
+void Semaphore::release(size_t n)
+ {
+ for(size_t i = 0; i != n; ++i)
+ {
+ std::lock_guard<std::mutex> lock(m_mutex);
+
+ ++m_value;
+
+ if(m_value <= 0)
+ {
+ ++m_wakeups;
+ m_cond.notify_one();
+ }
+ }
+ }
+
+void Semaphore::acquire()
+ {
+ std::unique_lock<std::mutex> lock(m_mutex);
+ --m_value;
+ if(m_value < 0)
+ {
+ m_cond.wait(lock, [this] { return m_wakeups > 0; });
+ --m_wakeups;
+ }
+ }
+
+}