SNode.C
Loading...
Searching...
No Matches
core::EventMultiplexer Class Referenceabstract

#include <EventMultiplexer.h>

Inheritance diagram for core::EventMultiplexer:
Collaboration diagram for core::EventMultiplexer:

Classes

class  EventQueue

Public Types

enum  DISP_TYPE { RD = 0 , WR = 1 , EX = 2 }

Public Member Functions

 EventMultiplexer (DescriptorEventPublisher *readDescriptorEventPublisher, DescriptorEventPublisher *writeDescriptorEventPublisher, DescriptorEventPublisher *exceptionDescriptorEventPublisher)
virtual ~EventMultiplexer ()
 EventMultiplexer (const EventMultiplexer &)=delete
EventMultiplexeroperator= (const EventMultiplexer &)=delete
DescriptorEventPublishergetDescriptorEventPublisher (DISP_TYPE dispType)
TimerEventPublishergetTimerEventPublisher ()
void span (core::Event *event)
void relax (core::Event *event)
void signal (int sigNum)
void terminate ()
void clearEventQueue ()
TickStatus tick (const utils::Timeval &tickTimeOut, const sigset_t &sigMask)

Protected Member Functions

int maxFd ()

Protected Attributes

std::array< DescriptorEventPublisher *, 3 > descriptorEventPublishers

Private Member Functions

TickStatus waitForEvents (const utils::Timeval &tickTimeOut, const utils::Timeval &currentTime, const sigset_t &sigMask, int &activeDescriptorCount)
void spanActiveEvents (const utils::Timeval &currentTime, int activeDescriptorCount)
void executeEventQueue (const utils::Timeval &currentTime)
void checkTimedOutEvents (const utils::Timeval &currentTime)
void releaseExpiredResources (const utils::Timeval &currentTime)
utils::Timeval getNextTimeout (const utils::Timeval &currentTime)
virtual void spanActiveEvents (int activeDescriptorCount)=0
virtual int monitorDescriptors (utils::Timeval &tickTimeOut, const sigset_t &sigMask)=0
int observedEventReceiverCount ()

Private Attributes

core::TimerEventPublisher *const timerEventPublisher
EventQueue eventQueue

Detailed Description

Definition at line 68 of file EventMultiplexer.h.

Member Enumeration Documentation

◆ DISP_TYPE

Constructor & Destructor Documentation

◆ EventMultiplexer() [1/2]

core::EventMultiplexer::EventMultiplexer ( DescriptorEventPublisher * readDescriptorEventPublisher,
DescriptorEventPublisher * writeDescriptorEventPublisher,
DescriptorEventPublisher * exceptionDescriptorEventPublisher )

Definition at line 62 of file EventMultiplexer.cpp.

65 : descriptorEventPublishers{readDescriptorEventPublisher, writeDescriptorEventPublisher, exceptionDescriptorEventPublisher}
66 , timerEventPublisher(new core::TimerEventPublisher()) {
67 }
std::array< DescriptorEventPublisher *, 3 > descriptorEventPublishers
core::TimerEventPublisher *const timerEventPublisher

References descriptorEventPublishers.

Referenced by core::multiplexer::epoll::EventMultiplexer::EventMultiplexer(), and core::multiplexer::select::EventMultiplexer::EventMultiplexer().

Here is the caller graph for this function:

◆ ~EventMultiplexer()

core::EventMultiplexer::~EventMultiplexer ( )
virtual

Reimplemented in core::multiplexer::epoll::EventMultiplexer, core::multiplexer::poll::EventMultiplexer, and core::multiplexer::select::EventMultiplexer.

Definition at line 69 of file EventMultiplexer.cpp.

69 {
70 for (const DescriptorEventPublisher* descriptorEventPublisher : descriptorEventPublishers) {
71 delete descriptorEventPublisher;
72 }
74 }

References descriptorEventPublishers, and timerEventPublisher.

◆ EventMultiplexer() [2/2]

core::EventMultiplexer::EventMultiplexer ( const EventMultiplexer & )
delete

Member Function Documentation

◆ checkTimedOutEvents()

void core::EventMultiplexer::checkTimedOutEvents ( const utils::Timeval & currentTime)
private

Definition at line 165 of file EventMultiplexer.cpp.

165 {
166 for (DescriptorEventPublisher* const descriptorEventPublisher : descriptorEventPublishers) {
167 descriptorEventPublisher->checkTimedOutEvents(currentTime);
168 }
169 }

References core::DescriptorEventPublisher::checkTimedOutEvents(), and descriptorEventPublishers.

Referenced by tick().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ clearEventQueue()

void core::EventMultiplexer::clearEventQueue ( )

Definition at line 127 of file EventMultiplexer.cpp.

127 {
128 eventQueue.clear();
129 }

References core::EventMultiplexer::EventQueue::clear(), and eventQueue.

Referenced by core::EventLoop::tick().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ executeEventQueue()

void core::EventMultiplexer::executeEventQueue ( const utils::Timeval & currentTime)
private

Definition at line 161 of file EventMultiplexer.cpp.

161 {
162 eventQueue.execute(currentTime);
163 }

References eventQueue, and core::EventMultiplexer::EventQueue::execute().

Referenced by tick().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getDescriptorEventPublisher()

DescriptorEventPublisher & core::EventMultiplexer::getDescriptorEventPublisher ( DISP_TYPE dispType)

◆ getNextTimeout()

utils::Timeval core::EventMultiplexer::getNextTimeout ( const utils::Timeval & currentTime)
private

Definition at line 179 of file EventMultiplexer.cpp.

179 {
180 utils::Timeval nextTimeout = DescriptorEventReceiver::TIMEOUT::MAX;
181
182 if (eventQueue.empty()) {
183 for (const DescriptorEventPublisher* const descriptorEventPublisher : descriptorEventPublishers) {
184 nextTimeout = std::min(descriptorEventPublisher->getNextTimeout(currentTime), nextTimeout);
185 }
186 nextTimeout = std::min(timerEventPublisher->getNextTimeout(currentTime), nextTimeout);
187 nextTimeout = std::max(nextTimeout, utils::Timeval()); // In case nextTimeout is negative
188 } else {
189 nextTimeout = 0;
190 }
191
192 return nextTimeout;
193 }

References descriptorEventPublishers, core::EventMultiplexer::EventQueue::empty(), eventQueue, core::DescriptorEventPublisher::getNextTimeout(), core::TimerEventPublisher::getNextTimeout(), core::DescriptorEventReceiver::TIMEOUT::MAX, utils::Timeval::operator=(), timerEventPublisher, and utils::Timeval::Timeval().

Referenced by waitForEvents().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getTimerEventPublisher()

core::TimerEventPublisher & core::EventMultiplexer::getTimerEventPublisher ( )

Definition at line 80 of file EventMultiplexer.cpp.

80 {
81 return *timerEventPublisher;
82 }

References timerEventPublisher.

Referenced by core::TimerEventReceiver::TimerEventReceiver().

Here is the caller graph for this function:

◆ maxFd()

int core::EventMultiplexer::maxFd ( )
protected

Definition at line 204 of file EventMultiplexer.cpp.

204 {
205 return std::accumulate(descriptorEventPublishers.begin(),
207 -1,
208 [](int maxFd, const DescriptorEventPublisher* descriptorEventPublisher) -> int {
209 return std::max(descriptorEventPublisher->maxFd(), maxFd);
210 });
211 }

References descriptorEventPublishers, and core::DescriptorEventPublisher::maxFd().

Referenced by core::multiplexer::select::EventMultiplexer::monitorDescriptors().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ monitorDescriptors()

virtual int core::EventMultiplexer::monitorDescriptors ( utils::Timeval & tickTimeOut,
const sigset_t & sigMask )
privatepure virtual

Implemented in core::multiplexer::epoll::EventMultiplexer, core::multiplexer::poll::EventMultiplexer, and core::multiplexer::select::EventMultiplexer.

Referenced by waitForEvents().

Here is the caller graph for this function:

◆ observedEventReceiverCount()

int core::EventMultiplexer::observedEventReceiverCount ( )
private

Definition at line 195 of file EventMultiplexer.cpp.

195 {
196 return std::accumulate(descriptorEventPublishers.begin(),
198 0,
199 [](int count, const DescriptorEventPublisher* descriptorEventPublisher) -> int {
200 return count + descriptorEventPublisher->getObservedEventReceiverCount();
201 });
202 }

References descriptorEventPublishers, and core::DescriptorEventPublisher::getObservedEventReceiverCount().

Referenced by waitForEvents().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator=()

EventMultiplexer & core::EventMultiplexer::operator= ( const EventMultiplexer & )
delete

◆ relax()

void core::EventMultiplexer::relax ( core::Event * event)

Definition at line 88 of file EventMultiplexer.cpp.

88 {
89 eventQueue.remove(event);
90 }

References eventQueue, and core::EventMultiplexer::EventQueue::remove().

Referenced by core::Event::relax().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ releaseExpiredResources()

void core::EventMultiplexer::releaseExpiredResources ( const utils::Timeval & currentTime)
private

Definition at line 171 of file EventMultiplexer.cpp.

171 {
172 for (DescriptorEventPublisher* const descriptorEventPublisher : descriptorEventPublishers) {
173 descriptorEventPublisher->releaseDisabledEvents(currentTime);
174 }
175 timerEventPublisher->unobserveDisableEvents();
177 }
static void execDlCloseDeleyed()

References descriptorEventPublishers, core::DynamicLoader::execDlCloseDeleyed(), core::DescriptorEventPublisher::releaseDisabledEvents(), timerEventPublisher, and core::TimerEventPublisher::unobserveDisableEvents().

Referenced by signal(), terminate(), and tick().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ signal()

void core::EventMultiplexer::signal ( int sigNum)

Definition at line 109 of file EventMultiplexer.cpp.

109 {
110 for (DescriptorEventPublisher* const descriptorEventPublisher : descriptorEventPublishers) {
111 descriptorEventPublisher->signal(sigNum);
112 }
113 timerEventPublisher->stop();
114
116 }
void releaseExpiredResources(const utils::Timeval &currentTime)
static Timeval currentTime()
Definition Timeval.cpp:76

References utils::Timeval::currentTime(), descriptorEventPublishers, releaseExpiredResources(), core::DescriptorEventPublisher::signal(), core::TimerEventPublisher::stop(), and timerEventPublisher.

Referenced by core::EventLoop::free().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ span()

void core::EventMultiplexer::span ( core::Event * event)

Definition at line 84 of file EventMultiplexer.cpp.

84 {
85 eventQueue.insert(event);
86 }

References eventQueue, and core::EventMultiplexer::EventQueue::insert().

Referenced by core::Event::span().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ spanActiveEvents() [1/2]

void core::EventMultiplexer::spanActiveEvents ( const utils::Timeval & currentTime,
int activeDescriptorCount )
private

Definition at line 156 of file EventMultiplexer.cpp.

156 {
157 timerEventPublisher->spanActiveEvents(currentTime);
158 spanActiveEvents(activeDescriptorCount);
159 }
void spanActiveEvents(const utils::Timeval &currentTime, int activeDescriptorCount)

References spanActiveEvents(), core::TimerEventPublisher::spanActiveEvents(), and timerEventPublisher.

Referenced by tick().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ spanActiveEvents() [2/2]

virtual void core::EventMultiplexer::spanActiveEvents ( int activeDescriptorCount)
privatepure virtual

Implemented in core::multiplexer::epoll::EventMultiplexer, core::multiplexer::poll::EventMultiplexer, and core::multiplexer::select::EventMultiplexer.

Referenced by spanActiveEvents().

Here is the caller graph for this function:

◆ terminate()

void core::EventMultiplexer::terminate ( )

Definition at line 118 of file EventMultiplexer.cpp.

118 {
119 for (DescriptorEventPublisher* const descriptorEventPublisher : descriptorEventPublishers) {
120 descriptorEventPublisher->disable();
121 }
122 timerEventPublisher->stop();
123
125 }

References utils::Timeval::currentTime(), descriptorEventPublishers, core::DescriptorEventPublisher::disable(), releaseExpiredResources(), core::TimerEventPublisher::stop(), and timerEventPublisher.

Referenced by core::EventLoop::free().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ tick()

TickStatus core::EventMultiplexer::tick ( const utils::Timeval & tickTimeOut,
const sigset_t & sigMask )

Definition at line 92 of file EventMultiplexer.cpp.

92 {
93 const utils::Timeval currentTime = utils::Timeval::currentTime();
94
95 int activeDescriptorCount = 0;
96
97 const TickStatus tickStatus = waitForEvents(tickTimeOut, currentTime, sigMask, activeDescriptorCount);
98
99 if (tickStatus == TickStatus::SUCCESS) {
100 spanActiveEvents(currentTime, activeDescriptorCount);
101 executeEventQueue(currentTime);
102 checkTimedOutEvents(currentTime);
103 releaseExpiredResources(currentTime);
104 }
105
106 return tickStatus;
107 }
void checkTimedOutEvents(const utils::Timeval &currentTime)
TickStatus waitForEvents(const utils::Timeval &tickTimeOut, const utils::Timeval &currentTime, const sigset_t &sigMask, int &activeDescriptorCount)
void executeEventQueue(const utils::Timeval &currentTime)
TickStatus
Definition TickStatus.h:51

References checkTimedOutEvents(), utils::Timeval::currentTime(), executeEventQueue(), releaseExpiredResources(), spanActiveEvents(), core::SUCCESS, and waitForEvents().

Referenced by core::EventLoop::_tick().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ waitForEvents()

TickStatus core::EventMultiplexer::waitForEvents ( const utils::Timeval & tickTimeOut,
const utils::Timeval & currentTime,
const sigset_t & sigMask,
int & activeDescriptorCount )
private

Definition at line 131 of file EventMultiplexer.cpp.

134 {
135 TickStatus tickStatus = TickStatus::SUCCESS;
136
137 if (observedEventReceiverCount() > 0 || !timerEventPublisher->empty() || !eventQueue.empty()) {
138 utils::Timeval nextTimeout = std::min(getNextTimeout(currentTime), tickTimeOut);
139
140 activeDescriptorCount = monitorDescriptors(nextTimeout, sigMask);
141
142 if (activeDescriptorCount < 0) {
143 if (errno == EINTR) {
144 tickStatus = TickStatus::INTERRUPTED;
145 } else {
146 tickStatus = TickStatus::TRACE;
147 }
148 }
149 } else {
150 tickStatus = TickStatus::NOOBSERVER;
151 }
152
153 return tickStatus;
154 }
virtual int monitorDescriptors(utils::Timeval &tickTimeOut, const sigset_t &sigMask)=0
utils::Timeval getNextTimeout(const utils::Timeval &currentTime)

References core::EventMultiplexer::EventQueue::empty(), core::TimerEventPublisher::empty(), eventQueue, getNextTimeout(), core::INTERRUPTED, monitorDescriptors(), core::NOOBSERVER, observedEventReceiverCount(), core::SUCCESS, timerEventPublisher, and core::TRACE.

Referenced by tick().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ descriptorEventPublishers

◆ eventQueue

EventQueue core::EventMultiplexer::eventQueue
private

◆ timerEventPublisher

core::TimerEventPublisher* const core::EventMultiplexer::timerEventPublisher
private

The documentation for this class was generated from the following files: