1 /**
2 * Semaphore implementation for basefilt.d
3 *
4 * Copyright:
5 * (C) 2014-2015 Jack Lloyd
6 * (C) 2014-2015 Etienne Cimon
7 *
8 * License:
9 * Botan is released under the Simplified BSD License (see LICENSE.md)
10 */
11 module botan.utils.semaphore;
12
13 import core.sync.mutex;
14 import core.sync.condition;
15
16 class Semaphore
17 {
18 public:
19 this(int value = 0)
20 {
21 m_value = value;
22 m_wakeups = 0;
23 m_mutex = new Mutex;
24 m_cond = new Condition(m_mutex);
25 }
26
27 void acquire()
28 {
29 synchronized(m_mutex) {
30 --m_value;
31 if (m_value < 0)
32 {
33 m_cond.wait();
34 --m_wakeups;
35 }
36 }
37 }
38
39 void release(size_t n = 1)
40 {
41 for(size_t i = 0; i != n; ++i)
42 {
43 synchronized(m_mutex) {
44
45 ++m_value;
46
47 if (m_value <= 0)
48 {
49 ++m_wakeups;
50 m_cond.notify();
51 }
52 }
53 }
54 }
55
56 private:
57 int m_value;
58 int m_wakeups;
59 Mutex m_mutex;
60 Condition m_cond;
61 }