2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#include "core/EventMultiplexer.h"
44#include "core/DescriptorEventPublisher.h"
45#include "core/DescriptorEventReceiver.h"
46#include "core/DynamicLoader.h"
47#include "core/Event.h"
48#include "core/TimerEventPublisher.h"
50#ifndef DOXYGEN_SHOULD_SKIP_THIS
52#include "utils/Timeval.h"
71 for (DescriptorEventPublisher* descriptorEventPublisher : descriptorEventPublishers) {
72 delete descriptorEventPublisher;
78 return *descriptorEventPublishers[dispType];
86 eventQueue.insert(event);
90 eventQueue.remove(event);
96 int activeDescriptorCount = 0;
111 for (DescriptorEventPublisher*
const descriptorEventPublisher : descriptorEventPublishers) {
112 descriptorEventPublisher->signal(sigNum);
120 for (DescriptorEventPublisher*
const descriptorEventPublisher : descriptorEventPublishers) {
121 descriptorEventPublisher->disable();
133 const utils::
Timeval& currentTime,
134 const sigset_t& sigMask,
135 int& activeDescriptorCount) {
138 if (observedEventReceiverCount() > 0 || !timerEventPublisher->empty() || !eventQueue.empty()) {
143 if (activeDescriptorCount < 0) {
144 if (errno == EINTR) {
163 eventQueue.execute(currentTime);
167 for (DescriptorEventPublisher*
const descriptorEventPublisher : descriptorEventPublishers) {
168 descriptorEventPublisher->checkTimedOutEvents(currentTime);
173 for (DescriptorEventPublisher*
const descriptorEventPublisher : descriptorEventPublishers) {
174 descriptorEventPublisher->releaseDisabledEvents(currentTime);
183 if (eventQueue.empty()) {
184 for (
const DescriptorEventPublisher*
const descriptorEventPublisher : descriptorEventPublishers) {
185 nextTimeout = std::min(descriptorEventPublisher->getNextTimeout(currentTime), nextTimeout);
188 nextTimeout = std::max(nextTimeout, utils
::Timeval());
197 return std::accumulate(descriptorEventPublishers.begin(),
198 descriptorEventPublishers.end(),
200 [](
int count,
const DescriptorEventPublisher* descriptorEventPublisher) ->
int {
201 return count + descriptorEventPublisher->getObservedEventReceiverCount();
206 return std::accumulate(descriptorEventPublishers.begin(),
207 descriptorEventPublishers.end(),
209 [](
int count,
const DescriptorEventPublisher* descriptorEventPublisher) ->
int {
210 return std::max(descriptorEventPublisher->maxFd(), count);
225 publishQueue->push_back(event);
229 publishQueue->remove(event);
233 std::swap(executeQueue, publishQueue);
235 for (Event* event : *executeQueue) {
236 event->dispatch(currentTime);
239 executeQueue->clear();
243 return publishQueue->empty();
247 std::swap(executeQueue, publishQueue);
249 for (
const Event* event : *executeQueue) {
250 event->getEventReceiver()->destruct();
253 executeQueue->clear();
static void execDlCloseDeleyed()
void insert(Event *event)
void execute(const utils::Timeval ¤tTime)
void remove(Event *event)
virtual int monitorDescriptors(utils::Timeval &tickTimeOut, const sigset_t &sigMask)=0
void releaseExpiredResources(const utils::Timeval ¤tTime)
utils::Timeval getNextTimeout(const utils::Timeval ¤tTime)
void checkTimedOutEvents(const utils::Timeval ¤tTime)
TickStatus waitForEvents(const utils::Timeval &tickTimeOut, const utils::Timeval ¤tTime, const sigset_t &sigMask, int &activeDescriptorCount)
TimerEventPublisher & getTimerEventPublisher()
TickStatus tick(const utils::Timeval &tickTimeOut, const sigset_t &sigMask)
void spanActiveEvents(const utils::Timeval ¤tTime, int activeDescriptorCount)
void span(core::Event *event)
virtual void spanActiveEvents(int activeDescriptorCount)=0
DescriptorEventPublisher & getDescriptorEventPublisher(DISP_TYPE dispType)
void relax(core::Event *event)
int observedEventReceiverCount()
EventMultiplexer(DescriptorEventPublisher *readDescriptorEventPublisher, DescriptorEventPublisher *writeDescriptorEventPublisher, DescriptorEventPublisher *exceptionDescriptorEventPublisher)
void executeEventQueue(const utils::Timeval ¤tTime)
core::TimerEventPublisher *const timerEventPublisher
virtual ~EventMultiplexer()
TimerEventPublisher()=default
utils::Timeval getNextTimeout(const utils::Timeval ¤tTime)
void spanActiveEvents(const utils::Timeval ¤tTime)
void unobserveDisableEvents()
static Timeval currentTime()
Timeval & operator=(const Timeval &timeVal)
static const utils::Timeval MAX