ARC SDK
IntraProcessCounter.h
1 // -*- indent-tabs-mode: nil -*-
2 
3 // IntraProcessCounter.h
4 
5 #ifndef __IntraProcessCounter__
6 #define __IntraProcessCounter__
7 
8 #include <map>
9 #include <queue>
10 
11 #include <arc/Thread.h>
12 
13 #include <arc/Counter.h>
14 
15 namespace Arc {
16 
18 
25  : public Counter {
26 
27  public:
28 
30 
37  IntraProcessCounter(int limit, int excess);
38 
40 
43  virtual ~IntraProcessCounter();
44 
46 
51  virtual int getLimit();
52 
54 
58  virtual int setLimit(int newLimit);
59 
61 
66  virtual int changeLimit(int amount);
67 
68 
70 
74  virtual int getExcess();
75 
77 
81  virtual int setExcess(int newExcess);
82 
84 
89  virtual int changeExcess(int amount);
90 
92 
101  virtual int getValue();
102 
104 
118  virtual CounterTicket reserve(int amount = 1,
119  Glib::TimeVal duration = ETERNAL,
120  bool prioritized = false,
121  Glib::TimeVal timeOut = ETERNAL);
122 
123  protected:
124 
125 
127 
132  virtual void cancel(IDType reservationID);
133 
135 
148  virtual void extend(IDType& reservationID,
149  Glib::TimeVal& expiryTime,
150  Glib::TimeVal duration = ETERNAL);
151 
152  private:
153 
155 
160 
162 
167  void operator=(const IntraProcessCounter& unique);
168 
170 
176  int unsafeGetValue();
177 
179 
189  int unsafeCancel(IDType reservationID);
190 
192 
203  IDType unsafeReserve(int amount, Glib::TimeVal duration);
204 
206 
211  Glib::TimeVal unsafeGetNextExpiration();
212 
214 
217  int limit;
218 
220 
223  int excess;
224 
226 
229  int value;
230 
232 
238  IDType nextReservationID;
239 
241 
244  std::map<IDType, int> reservations;
245 
247 
251  std::priority_queue<ExpirationReminder> selfExpiringReservations;
252 
254 
258  Glib::Mutex synchMutex;
259 
261 
265  Glib::Cond synchCond;
266 
267  };
268 
269 }
270 
271 #endif