+// A stack to keep track of semaphores. When destroyed, semaphores remaining on stack are automatically released.
+class SemStack {
+ std::vector<sg4::Semaphore*> to_release;
+
+public:
+ void push(sg4::SemaphorePtr& sem) { to_release.push_back(sem.get()); }
+ void pop() { to_release.pop_back(); }
+ ~SemStack()
+ {
+ for (auto* sem : to_release) {
+ sem->release();
+ XBT_INFO("Released a semaphore on exit. It's now %d", sem->get_capacity());
+ }
+ }
+};
+