41 #ifndef Core_Thread_Mailbox_h
42 #define Core_Thread_Mailbox_h
44 #include <Core/Thread/Legacy/Legacy/ConditionVariable.h>
45 #include <Core/Thread/Legacy/Legacy/Mutex.h>
46 #include <Core/Thread/Legacy/Legacy/Semaphore.h>
47 #include <Core/Thread/Legacy/Legacy/Thread.h>
112 bool (*checker)(
const Item &a,
const Item &b));
141 std::vector<Item> ring_buffer_;
150 inline int ringNext(
int inc);
157 template<
class Item>
inline
161 return max_==0?0:((head_+inc)%max_);
166 : name_(name), mutex_(
"Mailbox lock"), ring_buffer_(size==0?1:size),
167 empty_(
"Mailbox empty condition"), full_(
"Mailbox full condition"),
168 rendezvous_(
"Mailbox rendezvous semaphore", 0)
195 int rmax=max_==0?1:max_;
201 ring_buffer_[ringNext(len_)]=
msg;
204 empty_.conditionSignal();
217 int rmax=max_==0?1:max_;
222 if(max_ == 0 && recv_wait_==0){
228 ring_buffer_[ringNext(len_)]=
msg;
231 empty_.conditionSignal();
243 bool (*checker)(
const Item &a,
const Item &b))
248 int rmax=max_==0?1:max_;
254 if (len_ < 1 || checker(ring_buffer_[ringNext(len_-1)], msg))
256 ring_buffer_[ringNext(len_)]=
msg;
259 empty_.conditionSignal();
286 Item val=ring_buffer_[head_];
287 ring_buffer_[head_] = 0;
291 full_.conditionSignal();
308 item=ring_buffer_[head_];
309 ring_buffer_[head_] = 0;
313 full_.conditionSignal();
#define msg(m)
Definition: PiecewiseInterp.h:55
Item receive()
Definition: Mailbox.h:277
int numItems() const
Return the number of items currently in the queue.
Definition: Mailbox.h:329
bool sendIfNotSentLast(const Item &msg, bool(*checker)(const Item &a, const Item &b))
Definition: Mailbox.h:242
bool tryReceive(Item &item)
Definition: Mailbox.h:301
Definition: ConditionVariable.h:80
static void couldBlockDone(int restore)
~Mailbox()
Definition: Mailbox.h:178
const char * name[]
Definition: BoostGraphExampleTests.cc:87
int size() const
Definition: Mailbox.h:322
Definition: Semaphore.h:67
bool trySend(const Item &msg)
Definition: Mailbox.h:213
Mailbox(const char *name, int size)
Definition: Mailbox.h:165
static int couldBlock(const char *why)
void send(const Item &msg)
Definition: Mailbox.h:190
int size
Definition: eabLatVolData.py:2