SNode.C
Loading...
Searching...
No Matches
EventMultiplexer.h
Go to the documentation of this file.
1/*
2 * SNode.C - a slim toolkit for network communication
3 * Copyright (C) Volker Christian <me@vchrist.at>
4 * 2020, 2021, 2022, 2023, 2024, 2025
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#ifndef CORE_EVENTMULTIPLEXER_H
21#define CORE_EVENTMULTIPLEXER_H
22
23#include "core/TickStatus.h"
24
25namespace core {
26 class Event;
29} // namespace core
30
31namespace utils {
32 class Timeval;
33} // namespace utils
34
35#ifndef DOXYGEN_SHOULD_SKIP_THIS
36
37#include "utils/system/signal.h"
38
39#include <array>
40#include <list>
41
42#endif /* DOXYGEN_SHOULD_SKIP_THIS */
43
44namespace core {
45
47 public:
48 EventMultiplexer(DescriptorEventPublisher* readDescriptorEventPublisher,
49 DescriptorEventPublisher* writeDescriptorEventPublisher,
50 DescriptorEventPublisher* exceptionDescriptorEventPublisher);
51 virtual ~EventMultiplexer();
52
54
56
57 private:
58 class EventQueue {
59 public:
60 EventQueue();
61 ~EventQueue();
62
63 EventQueue(const EventQueue&) = delete;
65
66 EventQueue& operator=(const EventQueue&) = delete;
68
69 void insert(Event* event);
70 void remove(Event* event);
71 void execute(const utils::Timeval& currentTime);
72 bool empty() const;
73 void clear();
74
75 private:
78 };
79
80 public:
81#define DISP_COUNT 3
82
83 enum DISP_TYPE { RD = 0, WR = 1, EX = 2 };
84
87
88 void span(core::Event* event);
89 void relax(core::Event* event);
90
91 void signal(int sigNum);
92 void terminate();
93 void clearEventQueue();
94
95 TickStatus tick(const utils::Timeval& tickTimeOut, const sigset_t& sigMask);
96
97 private:
98 TickStatus waitForEvents(const utils::Timeval& tickTimeOut,
99 const utils::Timeval& currentTime,
100 const sigset_t& sigMask,
101 int& activeDescriptorCount);
102
103 void spanActiveEvents(const utils::Timeval& currentTime, int activeDescriptorCount);
104 void executeEventQueue(const utils::Timeval& currentTime);
105 void checkTimedOutEvents(const utils::Timeval& currentTime);
106 void releaseExpiredResources(const utils::Timeval& currentTime);
107
108 utils::Timeval getNextTimeout(const utils::Timeval& currentTime);
109
110 virtual void spanActiveEvents(int activeDescriptorCount) = 0;
111
112 virtual int monitorDescriptors(utils::Timeval& tickTimeOut, const sigset_t& sigMask) = 0;
113
114 protected:
115 int maxFd();
116
118
119 private:
121
123
125 };
126
127} // namespace core
128
129core::EventMultiplexer& EventMultiplexer();
130
131#endif // CORE_EVENTMULTIPLEXER_H
#define DISP_COUNT
std::list< Event * > * publishQueue
EventQueue & operator=(const EventQueue &)=delete
std::list< Event * > * executeQueue
EventQueue & operator=(EventQueue &&)=delete
EventQueue(EventQueue &&)=delete
EventQueue(const EventQueue &)=delete
void execute(const utils::Timeval &currentTime)
virtual int monitorDescriptors(utils::Timeval &tickTimeOut, const sigset_t &sigMask)=0
void releaseExpiredResources(const utils::Timeval &currentTime)
utils::Timeval getNextTimeout(const utils::Timeval &currentTime)
void checkTimedOutEvents(const utils::Timeval &currentTime)
TickStatus waitForEvents(const utils::Timeval &tickTimeOut, const utils::Timeval &currentTime, const sigset_t &sigMask, int &activeDescriptorCount)
EventMultiplexer(const EventMultiplexer &)=delete
TimerEventPublisher & getTimerEventPublisher()
TickStatus tick(const utils::Timeval &tickTimeOut, const sigset_t &sigMask)
void spanActiveEvents(const utils::Timeval &currentTime, int activeDescriptorCount)
void span(core::Event *event)
std::array< DescriptorEventPublisher *, 3 > descriptorEventPublishers
EventMultiplexer & operator=(const EventMultiplexer &)=delete
virtual void spanActiveEvents(int activeDescriptorCount)=0
DescriptorEventPublisher & getDescriptorEventPublisher(DISP_TYPE dispType)
void relax(core::Event *event)
EventMultiplexer(DescriptorEventPublisher *readDescriptorEventPublisher, DescriptorEventPublisher *writeDescriptorEventPublisher, DescriptorEventPublisher *exceptionDescriptorEventPublisher)
void executeEventQueue(const utils::Timeval &currentTime)
core::TimerEventPublisher *const timerEventPublisher
core::multiplexer::poll::PollFdsManager & pollFds
DescriptorEventPublisher(const std::string &name, core::multiplexer::poll::PollFdsManager &pollFds, short events, short revents)
void muxOff(core::DescriptorEventReceiver *eventReceiver) override
void muxAdd(core::DescriptorEventReceiver *eventReceiver) override
void muxOn(core::DescriptorEventReceiver *eventReceiver) override
int monitorDescriptors(utils::Timeval &tickTimeOut, const sigset_t &sigMask) override
void spanActiveEvents(int activeDescriptorCount) override
void muxOff(const DescriptorEventReceiver *eventReceiver, short event)
void muxAdd(core::DescriptorEventReceiver *eventReceiver, short event)
const std::unordered_map< int, PollFdIndex > & getPollFdIndices() const
std::unordered_map< int, PollFdIndex > pollFdIndices
void muxOn(const core::DescriptorEventReceiver *eventReceiver, short event)
TickStatus
Definition TickStatus.h:29