Browse Source

counting semaphore: add comments, cosmetic changes

pull/10/head
Luca Saiu 4 years ago
parent
commit
e6fc833bef
  1. 17
      src/CountingSemaphore.hh

17
src/CountingSemaphore.hh

@ -19,6 +19,7 @@ namespace pEp {
public: public:
CountingSemaphore(unsigned count = 0) : _count(count) {} CountingSemaphore(unsigned count = 0) : _count(count) {}
// Change the stored count.
CountingSemaphore& operator=(unsigned count) CountingSemaphore& operator=(unsigned count)
{ {
std::unique_lock<std::mutex> lock(mtx); std::unique_lock<std::mutex> lock(mtx);
@ -28,29 +29,35 @@ namespace pEp {
return *this; return *this;
} }
// Return the current stored count.
unsigned load() unsigned load()
{ {
return _count.load (); return _count.load ();
} }
// Atomically decrement the stored count, blocking in case the count
// is currently zero. When the method terminates the counter is
// guaranteed to have been decremented by one unit.
//
// This is Dijkstra's P operation, used to atomically acquire a resource.
void p() void p()
{ {
std::unique_lock<std::mutex> lock(mtx); std::unique_lock<std::mutex> lock(mtx);
// FIXME: is the loop even needed? Any received notification will // FIXME: is the loop even needed? Any received notification will
// wake up ony one thread, which will see the count as non-zero... // wake up ony one thread, which will see the count as non-zero...
while (_count.load() == 0) { while (_count.load() == 0)
//std::cout << "p: waiting...\n";
cv.wait(lock); cv.wait(lock);
}
_count --; _count --;
//std::cout << "after p: " << _count.load () << "\n";
} }
// Atomically increment the stored count. This may wake up one thread
// which is currently executing the p method.
//
// This is Dijkstra's V operation, used to atomically release a resource.
void v() void v()
{ {
std::unique_lock<std::mutex> lock(mtx); std::unique_lock<std::mutex> lock(mtx);
_count ++; _count ++;
//std::cout << "after v: " << _count.load () << "\n";
cv.notify_one(); cv.notify_one();
} }
}; };

Loading…
Cancel
Save