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

#include <EventMultiplexer.h>

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

Classes

struct  PollFdIndex
 
class  VarSizeTypeAllocator
 

Public Types

using pollfd_vector = std::vector< pollfd, VarSizeTypeAllocator< pollfd, nfds_t > >
 
using pollfdindex_map = std::unordered_map< int, PollFdIndex, std::hash< int >, std::equal_to<>, VarSizeTypeAllocator< std::pair< const int, PollFdIndex >, nfds_t > >
 

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

using core::multiplexer::poll::PollFdsManager::pollfdindex_map = std::unordered_map<int, PollFdIndex, std::hash<int>, std::equal_to<>, VarSizeTypeAllocator<std::pair<const int, PollFdIndex>, nfds_t> >

Definition at line 152 of file EventMultiplexer.h.

Constructor & Destructor Documentation

◆ PollFdsManager()

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

Definition at line 68 of file EventMultiplexer.cpp.

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

Member Function Documentation

◆ compress()

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

Definition at line 124 of file EventMultiplexer.cpp.

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

Referenced by muxDel().

Here is the caller graph for this function:

◆ getCurrentSize()

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

Definition at line 148 of file EventMultiplexer.cpp.

148 {
149 return nextIndex;
150 }

◆ getEvents()

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

Definition at line 140 of file EventMultiplexer.cpp.

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

◆ getPollFdIndices()

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

Definition at line 144 of file EventMultiplexer.cpp.

144 {
145 return pollFdIndices;
146 }

◆ muxAdd()

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

Definition at line 73 of file EventMultiplexer.cpp.

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

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

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

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

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

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

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

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: