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 46 of file EventMultiplexer.h.

Member Enumeration Documentation

◆ DISP_TYPE

Enumerator
RD 
WR 
EX 

Definition at line 83 of file EventMultiplexer.h.

Constructor & Destructor Documentation

◆ EventMultiplexer() [1/2]

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

Definition at line 41 of file EventMultiplexer.cpp.

44 : descriptorEventPublishers{readDescriptorEventPublisher, writeDescriptorEventPublisher, exceptionDescriptorEventPublisher}
46 }
std::array< DescriptorEventPublisher *, 3 > descriptorEventPublishers
core::TimerEventPublisher *const timerEventPublisher

References EventMultiplexer().

Referenced by EventMultiplexer().

Here is the call graph for this function:
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 48 of file EventMultiplexer.cpp.

48 {
49 for (DescriptorEventPublisher* descriptorEventPublisher : descriptorEventPublishers) {
50 delete descriptorEventPublisher;
51 }
53 }

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

144 {
145 for (DescriptorEventPublisher* const descriptorEventPublisher : descriptorEventPublishers) {
146 descriptorEventPublisher->checkTimedOutEvents(currentTime);
147 }
148 }

Referenced by tick().

Here is the caller graph for this function:

◆ clearEventQueue()

void core::EventMultiplexer::clearEventQueue ( )

Definition at line 106 of file EventMultiplexer.cpp.

◆ executeEventQueue()

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

Definition at line 140 of file EventMultiplexer.cpp.

140 {
141 eventQueue.execute(currentTime);
142 }
void execute(const utils::Timeval &currentTime)

Referenced by tick().

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

158 {
160
161 if (eventQueue.empty()) {
162 for (const DescriptorEventPublisher* const descriptorEventPublisher : descriptorEventPublishers) {
163 nextTimeout = std::min(descriptorEventPublisher->getNextTimeout(currentTime), nextTimeout);
164 }
165 nextTimeout = std::min(timerEventPublisher->getNextTimeout(currentTime), nextTimeout);
166 nextTimeout = std::max(nextTimeout, utils::Timeval()); // In case nextTimeout is negative
167 } else {
168 nextTimeout = 0;
169 }
170
171 return nextTimeout;
172 }
utils::Timeval getNextTimeout(const utils::Timeval &currentTime)

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

59 {
60 return *timerEventPublisher;
61 }

References timerEventPublisher.

◆ maxFd()

int core::EventMultiplexer::maxFd ( )
protected

Definition at line 183 of file EventMultiplexer.cpp.

183 {
184 return std::accumulate(descriptorEventPublishers.begin(),
186 -1,
187 [](int count, const DescriptorEventPublisher* descriptorEventPublisher) -> int {
188 return std::max(descriptorEventPublisher->maxFd(), count);
189 });
190 }

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

174 {
175 return std::accumulate(descriptorEventPublishers.begin(),
177 0,
178 [](int count, const DescriptorEventPublisher* descriptorEventPublisher) -> int {
179 return count + descriptorEventPublisher->getObservedEventReceiverCount();
180 });
181 }

◆ operator=()

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

◆ relax()

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

Definition at line 67 of file EventMultiplexer.cpp.

67 {
68 eventQueue.remove(event);
69 }

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

Here is the caller graph for this function:

◆ releaseExpiredResources()

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

Definition at line 150 of file EventMultiplexer.cpp.

150 {
151 for (DescriptorEventPublisher* const descriptorEventPublisher : descriptorEventPublishers) {
152 descriptorEventPublisher->releaseDisabledEvents(currentTime);
153 }
156 }
static void execDlCloseDeleyed()

References core::DynamicLoader::execDlCloseDeleyed(), 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 88 of file EventMultiplexer.cpp.

88 {
89 for (DescriptorEventPublisher* const descriptorEventPublisher : descriptorEventPublishers) {
90 descriptorEventPublisher->signal(sigNum);
91 }
93
95 }
void releaseExpiredResources(const utils::Timeval &currentTime)
static Timeval currentTime()
Definition Timeval.cpp:54

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

Here is the call graph for this function:

◆ span()

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

Definition at line 63 of file EventMultiplexer.cpp.

63 {
64 eventQueue.insert(event);
65 }

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

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

135 {
137 spanActiveEvents(activeDescriptorCount);
138 }
void spanActiveEvents(const utils::Timeval &currentTime, int activeDescriptorCount)
void spanActiveEvents(const utils::Timeval &currentTime)

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

97 {
98 for (DescriptorEventPublisher* const descriptorEventPublisher : descriptorEventPublishers) {
99 descriptorEventPublisher->disable();
100 }
102
104 }

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

Here is the call graph for this function:

◆ tick()

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

Definition at line 71 of file EventMultiplexer.cpp.

71 {
72 const utils::Timeval currentTime = utils::Timeval::currentTime();
73
74 int activeDescriptorCount = 0;
75
76 const TickStatus tickStatus = waitForEvents(tickTimeOut, currentTime, sigMask, activeDescriptorCount);
77
78 if (tickStatus == TickStatus::SUCCESS) {
79 spanActiveEvents(currentTime, activeDescriptorCount);
80 executeEventQueue(currentTime);
81 checkTimedOutEvents(currentTime);
82 releaseExpiredResources(currentTime);
83 }
84
85 return tickStatus;
86 }
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:29

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

Here is the call 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 110 of file EventMultiplexer.cpp.

113 {
114 TickStatus tickStatus = TickStatus::SUCCESS;
115
117 utils::Timeval nextTimeout = std::min(getNextTimeout(currentTime), tickTimeOut);
118
119 activeDescriptorCount = monitorDescriptors(nextTimeout, sigMask);
120
121 if (activeDescriptorCount < 0) {
122 if (errno == EINTR) {
123 tickStatus = TickStatus::INTERRUPTED;
124 } else {
125 tickStatus = TickStatus::TRACE;
126 }
127 }
128 } else {
129 tickStatus = TickStatus::NOOBSERVER;
130 }
131
132 return tickStatus;
133 }
virtual int monitorDescriptors(utils::Timeval &tickTimeOut, const sigset_t &sigMask)=0
utils::Timeval getNextTimeout(const utils::Timeval &currentTime)

References getNextTimeout(), core::INTERRUPTED, monitorDescriptors(), core::NOOBSERVER, core::SUCCESS, 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

std::array<DescriptorEventPublisher*, 3 > core::EventMultiplexer::descriptorEventPublishers
protected

Definition at line 117 of file EventMultiplexer.h.

◆ eventQueue

EventQueue core::EventMultiplexer::eventQueue
private

Definition at line 124 of file EventMultiplexer.h.

◆ timerEventPublisher

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

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