2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
20#include "core/EventMultiplexer.h"
22#include "core/DescriptorEventPublisher.h"
23#include "core/DescriptorEventReceiver.h"
24#include "core/DynamicLoader.h"
25#include "core/Event.h"
26#include "core/TimerEventPublisher.h"
28#ifndef DOXYGEN_SHOULD_SKIP_THIS
30#include "utils/Timeval.h"
49 for (DescriptorEventPublisher* descriptorEventPublisher : descriptorEventPublishers) {
50 delete descriptorEventPublisher;
56 return *descriptorEventPublishers[dispType];
64 eventQueue.insert(event);
68 eventQueue.remove(event);
74 int activeDescriptorCount = 0;
89 for (DescriptorEventPublisher*
const descriptorEventPublisher : descriptorEventPublishers) {
90 descriptorEventPublisher->signal(sigNum);
98 for (DescriptorEventPublisher*
const descriptorEventPublisher : descriptorEventPublishers) {
99 descriptorEventPublisher->disable();
111 const utils::
Timeval& currentTime,
112 const sigset_t& sigMask,
113 int& activeDescriptorCount) {
116 if (observedEventReceiverCount() > 0 || !timerEventPublisher->empty() || !eventQueue.empty()) {
121 if (activeDescriptorCount < 0) {
122 if (errno == EINTR) {
141 eventQueue.execute(currentTime);
145 for (DescriptorEventPublisher*
const descriptorEventPublisher : descriptorEventPublishers) {
146 descriptorEventPublisher->checkTimedOutEvents(currentTime);
151 for (DescriptorEventPublisher*
const descriptorEventPublisher : descriptorEventPublishers) {
152 descriptorEventPublisher->releaseDisabledEvents(currentTime);
161 if (eventQueue.empty()) {
162 for (
const DescriptorEventPublisher*
const descriptorEventPublisher : descriptorEventPublishers) {
163 nextTimeout = std::min(descriptorEventPublisher->getNextTimeout(currentTime), nextTimeout);
166 nextTimeout = std::max(nextTimeout, utils
::Timeval());
175 return std::accumulate(descriptorEventPublishers.begin(),
176 descriptorEventPublishers.end(),
178 [](
int count,
const DescriptorEventPublisher* descriptorEventPublisher) ->
int {
179 return count + descriptorEventPublisher->getObservedEventReceiverCount();
184 return std::accumulate(descriptorEventPublishers.begin(),
185 descriptorEventPublishers.end(),
187 [](
int count,
const DescriptorEventPublisher* descriptorEventPublisher) ->
int {
188 return std::max(descriptorEventPublisher->maxFd(), count);
203 publishQueue->push_back(event);
207 publishQueue->remove(event);
211 std::swap(executeQueue, publishQueue);
213 for (Event* event : *executeQueue) {
214 event->dispatch(currentTime);
217 executeQueue->clear();
221 return publishQueue->empty();
225 std::swap(executeQueue, publishQueue);
227 for (
const Event* event : *executeQueue) {
228 event->getEventReceiver()->destruct();
231 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