SNode.C
Loading...
Searching...
No Matches
core::multiplexer::poll::PollFdsManager Class Reference

#include <EventMultiplexer.h>

Collaboration diagram for core::multiplexer::poll::PollFdsManager:

Classes

class  VarSizeTypeAllocator
struct  PollFdIndex

Public Types

using pollfd_vector = std::vector<pollfd, VarSizeTypeAllocator<pollfd, nfds_t>>
using pollfdindex_map

Public Member Functions

 PollFdsManager ()
void muxAdd (core::DescriptorEventReceiver *eventReceiver, short event)
void muxDel (int fd, short event)
void muxOn (const core::DescriptorEventReceiver *eventReceiver, short event)
void muxOff (const DescriptorEventReceiver *eventReceiver, short event)
pollfd * getEvents ()
const pollfdindex_mapgetPollFdIndices () const
nfds_t getCurrentSize () const

Private Member Functions

void compress ()

Private Attributes

nfds_t nextIndex = 0
pollfd_vector pollfds
pollfdindex_map pollFdIndices

Detailed Description

Definition at line 68 of file EventMultiplexer.h.

Member Typedef Documentation

◆ pollfd_vector

Definition at line 145 of file EventMultiplexer.h.

◆ pollfdindex_map

Constructor & Destructor Documentation

◆ PollFdsManager()

core::multiplexer::poll::PollFdsManager::PollFdsManager ( )
explicit

Definition at line 69 of file EventMultiplexer.cpp.

69 {
70 pollfds.resize(1, {-1, 0, 0});
71 pollFdIndices.reserve(1);
72 }

Member Function Documentation

◆ compress()

void core::multiplexer::poll::PollFdsManager::compress ( )
private

Definition at line 125 of file EventMultiplexer.cpp.

125 {
126 (void) std::remove_if(pollfds.begin(), pollfds.end(), [](const pollfd& pollFd) -> bool {
127 return pollFd.fd < 0;
128 });
129
130 pollfds.resize(pollFdIndices.size() + 1, {-1, 0, 0});
131
132 pollFdIndices.reserve(pollFdIndices.size() + 1);
133
134 for (uint32_t i = 0; i < pollFdIndices.size(); i++) {
135 pollFdIndices[pollfds[i].fd].index = i;
136 }
137
138 nextIndex = pollFdIndices.size();
139 }

Referenced by muxDel().

Here is the caller graph for this function:

◆ getCurrentSize()

nfds_t core::multiplexer::poll::PollFdsManager::getCurrentSize ( ) const

Definition at line 149 of file EventMultiplexer.cpp.

149 {
150 return nextIndex;
151 }

◆ getEvents()

pollfd * core::multiplexer::poll::PollFdsManager::getEvents ( )

Definition at line 141 of file EventMultiplexer.cpp.

141 {
142 return pollfds.data();
143 }

◆ getPollFdIndices()

const PollFdsManager::pollfdindex_map & core::multiplexer::poll::PollFdsManager::getPollFdIndices ( ) const

Definition at line 145 of file EventMultiplexer.cpp.

145 {
146 return pollFdIndices;
147 }

◆ muxAdd()

void core::multiplexer::poll::PollFdsManager::muxAdd ( core::DescriptorEventReceiver * eventReceiver,
short event )

Definition at line 74 of file EventMultiplexer.cpp.

74 {
75 const int fd = eventReceiver->getRegisteredFd();
76
77 if (!pollFdIndices.contains(fd)) {
78 pollfds[nextIndex].events = event;
79 pollfds[nextIndex].fd = fd;
80
81 pollFdIndices[fd].index = nextIndex;
82 pollFdIndices[fd].events = event;
83
84 ++nextIndex;
85
86 if (nextIndex == pollfds.size()) {
87 pollfds.resize(pollfds.size() * 2, {-1, 0, 0});
88 pollFdIndices.reserve(pollfds.size());
89 }
90 } else {
91 PollFdIndex& pollFdIndex = pollFdIndices[fd];
92
93 pollfds[pollFdIndex.index].events |= event;
94 pollFdIndex.events |= event;
95 }
96 }

References core::multiplexer::poll::PollFdsManager::PollFdIndex::events, and core::DescriptorEventReceiver::getRegisteredFd().

Referenced by core::multiplexer::poll::DescriptorEventPublisher::muxAdd().

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

◆ muxDel()

void core::multiplexer::poll::PollFdsManager::muxDel ( int fd,
short event )

Definition at line 98 of file EventMultiplexer.cpp.

98 {
99 const pollfdindex_map::iterator itPollFdIndex = pollFdIndices.find(fd);
100
101 PollFdIndex& pollFdIndex = itPollFdIndex->second;
102
103 pollfds[pollFdIndex.index].events &= static_cast<short>(~event); // tilde promotes to int
104 pollFdIndex.events &= static_cast<short>(~event); // tilde promotes to int
105
106 if (pollFdIndex.events == 0) {
107 pollfds[pollFdIndex.index].fd = -1; // Compress will keep track of that descriptor
108 pollFdIndices.erase(fd);
109
110 if (pollfds.size() > (pollFdIndices.size() * 2) + 1) {
111 compress();
112 }
113 }
114 }

References compress(), and core::multiplexer::poll::PollFdsManager::PollFdIndex::events.

Referenced by core::multiplexer::poll::DescriptorEventPublisher::muxDel().

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

◆ muxOff()

void core::multiplexer::poll::PollFdsManager::muxOff ( const DescriptorEventReceiver * eventReceiver,
short event )

Definition at line 120 of file EventMultiplexer.cpp.

120 {
121 pollfds[pollFdIndices.find(eventReceiver->getRegisteredFd())->second.index].events &=
122 static_cast<short>(~event); // Tilde promotes to int
123 }

Referenced by core::multiplexer::poll::DescriptorEventPublisher::muxOff().

Here is the caller graph for this function:

◆ muxOn()

void core::multiplexer::poll::PollFdsManager::muxOn ( const core::DescriptorEventReceiver * eventReceiver,
short event )

Definition at line 116 of file EventMultiplexer.cpp.

116 {
117 pollfds[pollFdIndices.find(eventReceiver->getRegisteredFd())->second.index].events |= event;
118 }

Referenced by core::multiplexer::poll::DescriptorEventPublisher::muxOn().

Here is the caller graph for this function:

Member Data Documentation

◆ nextIndex

nfds_t core::multiplexer::poll::PollFdsManager::nextIndex = 0
private

Definition at line 172 of file EventMultiplexer.h.

◆ pollFdIndices

pollfdindex_map core::multiplexer::poll::PollFdsManager::pollFdIndices
private

Definition at line 176 of file EventMultiplexer.h.

◆ pollfds

pollfd_vector core::multiplexer::poll::PollFdsManager::pollfds
private

Definition at line 175 of file EventMultiplexer.h.


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