A _multiple_ producer (MP) _single_ consumer (SC) event queue for a process. Note that we don't _enforce_ the MP/SC semantics during runtime but we have explicitly separated out the `Producer` interface and the `Consumer` interface in order to help avoid incorrect usage. Notable semantics: Consumers _must_ call `empty()` before calling `dequeue()`. Failing to do so may result in undefined behavi
| 66 | // into the actor model because there will only ever be a single |
| 67 | // thread consuming an actors events at a time. |
| 68 | class EventQueue |
| 69 | { |
| 70 | public: |
| 71 | EventQueue() : producer(this), consumer(this) {} |
| 72 | |
| 73 | class Producer |
| 74 | { |
| 75 | public: |
| 76 | // Returns false if not enqueued; this means the queue |
| 77 | // is decomissioned. In this case the caller retains |
| 78 | // ownership of the event. |
| 79 | bool enqueue(Event* event) { return queue->enqueue(event); } |
| 80 | |
| 81 | private: |
| 82 | friend class EventQueue; |
| 83 | |
| 84 | Producer(EventQueue* queue) : queue(queue) {} |
| 85 | |
| 86 | EventQueue* queue; |
| 87 | } producer; |
| 88 | |
| 89 | class Consumer |
| 90 | { |
| 91 | public: |
| 92 | Event* dequeue() { return queue->dequeue(); } |
| 93 | bool empty() { return queue->empty(); } |
| 94 | void decomission() { queue->decomission(); } |
| 95 | template <typename T> |
| 96 | size_t count() { return queue->count<T>(); } |
| 97 | operator JSON::Array() { return queue->operator JSON::Array(); } |
| 98 | |
| 99 | private: |
| 100 | friend class EventQueue; |
| 101 | |
| 102 | Consumer(EventQueue* queue) : queue(queue) {} |
| 103 | |
| 104 | EventQueue* queue; |
| 105 | } consumer; |
| 106 | |
| 107 | private: |
| 108 | friend class Producer; |
| 109 | friend class Consumer; |
| 110 | |
| 111 | #ifndef LOCK_FREE_EVENT_QUEUE |
| 112 | bool enqueue(Event* event) |
| 113 | { |
| 114 | synchronized (mutex) { |
| 115 | if (comissioned) { |
| 116 | events.push_back(event); |
| 117 | return true; |
| 118 | } |
| 119 | } |
| 120 | |
| 121 | return false; |
| 122 | } |
| 123 | |
| 124 | Event* dequeue() |
| 125 | { |