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}
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.

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 }
void execute(const utils::Timeval &currentTime)

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 {
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 }
utils::Timeval getNextTimeout(const utils::Timeval &currentTime)

References descriptorEventPublishers, core::EventMultiplexer::EventQueue::empty(), eventQueue, core::TimerEventPublisher::getNextTimeout(), core::DescriptorEventPublisher::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 count, const DescriptorEventPublisher* descriptorEventPublisher) -> int {
210 return std::max(descriptorEventPublisher->maxFd(), count);
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 }
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 }
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 {
159 spanActiveEvents(activeDescriptorCount);
160 }
void spanActiveEvents(const utils::Timeval &currentTime, int activeDescriptorCount)
void spanActiveEvents(const utils::Timeval &currentTime)

References core::TimerEventPublisher::spanActiveEvents(), 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 }
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
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::TimerEventPublisher::empty(), core::EventMultiplexer::EventQueue::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: