00001 #ifndef QPID_SYS_WAITABLE_H
00002 #define QPID_SYS_WAITABLE_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "Monitor.h"
00025
00026 #include <assert.h>
00027
00028 namespace qpid {
00029 namespace sys {
00030
00036 class Waitable : public Monitor {
00037 public:
00038 Waitable() : waiters(0) {}
00039
00043 struct ScopedWait {
00044 Waitable& w;
00045 ScopedWait(Waitable& w_) : w(w_) { ++w.waiters; }
00046 ~ScopedWait() { if (--w.waiters==0) w.notifyAll(); }
00047 };
00048
00052 void waitWaiters() {
00053 while (waiters != 0)
00054 wait();
00055 }
00056
00060 size_t hasWaiters() { return waiters; }
00061
00062 private:
00063 friend struct ScopedWait;
00064 size_t waiters;
00065 };
00066
00067 }}
00068
00069
00070
00071 #endif