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 63 of file EventMultiplexer.cpp.

66 : descriptorEventPublishers{readDescriptorEventPublisher, writeDescriptorEventPublisher, exceptionDescriptorEventPublisher}
67 , timerEventPublisher(new core::TimerEventPublisher()) {
68 }
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 70 of file EventMultiplexer.cpp.

70 {
71 for (DescriptorEventPublisher* descriptorEventPublisher : descriptorEventPublishers) {
72 delete descriptorEventPublisher;
73 }
75 }

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 166 of file EventMultiplexer.cpp.

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

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 128 of file EventMultiplexer.cpp.

128 {
129 eventQueue.clear();
130 }

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 162 of file EventMultiplexer.cpp.

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

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 180 of file EventMultiplexer.cpp.

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

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 81 of file EventMultiplexer.cpp.

81 {
82 return *timerEventPublisher;
83 }

References timerEventPublisher.

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

Here is the caller graph for this function:

◆ maxFd()

int core::EventMultiplexer::maxFd ( )
protected

Definition at line 205 of file EventMultiplexer.cpp.

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

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 196 of file EventMultiplexer.cpp.

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

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 89 of file EventMultiplexer.cpp.

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

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 172 of file EventMultiplexer.cpp.

172 {
173 for (DescriptorEventPublisher* const descriptorEventPublisher : descriptorEventPublishers) {
174 descriptorEventPublisher->releaseDisabledEvents(currentTime);
175 }
176 timerEventPublisher->unobserveDisableEvents();
178 }
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 110 of file EventMultiplexer.cpp.

110 {
111 for (DescriptorEventPublisher* const descriptorEventPublisher : descriptorEventPublishers) {
112 descriptorEventPublisher->signal(sigNum);
113 }
114 timerEventPublisher->stop();
115
117 }
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 85 of file EventMultiplexer.cpp.

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

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 157 of file EventMultiplexer.cpp.

157 {
158 timerEventPublisher->spanActiveEvents(currentTime);
159 spanActiveEvents(activeDescriptorCount);
160 }
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 119 of file EventMultiplexer.cpp.

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

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 93 of file EventMultiplexer.cpp.

93 {
94 const utils::Timeval currentTime = utils::Timeval::currentTime();
95
96 int activeDescriptorCount = 0;
97
98 const TickStatus tickStatus = waitForEvents(tickTimeOut, currentTime, sigMask, activeDescriptorCount);
99
100 if (tickStatus == TickStatus::SUCCESS) {
101 spanActiveEvents(currentTime, activeDescriptorCount);
102 executeEventQueue(currentTime);
103 checkTimedOutEvents(currentTime);
104 releaseExpiredResources(currentTime);
105 }
106
107 return tickStatus;
108 }
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 132 of file EventMultiplexer.cpp.

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