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
 

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 std::unordered_map< int, PollFdIndex > & getPollFdIndices () const
 
nfds_t getCurrentSize () const
 

Private Member Functions

void compress ()
 

Private Attributes

nfds_t nextIndex = 0
 
std::vector< pollfd > pollfds
 
std::unordered_map< int, PollFdIndexpollFdIndices
 

Detailed Description

Definition at line 40 of file EventMultiplexer.h.

Constructor & Destructor Documentation

◆ PollFdsManager()

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

Definition at line 46 of file EventMultiplexer.cpp.

46 {
47 pollfds.resize(1, {-1, 0, 0});
48 pollFdIndices.reserve(1);
49 }
std::unordered_map< int, PollFdIndex > pollFdIndices

Member Function Documentation

◆ compress()

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

Definition at line 102 of file EventMultiplexer.cpp.

102 {
103 (void) std::remove_if(pollfds.begin(), pollfds.end(), [](const pollfd& pollFd) -> bool {
104 return pollFd.fd < 0;
105 });
106
107 pollfds.resize(pollFdIndices.size() + 1, {-1, 0, 0});
108
109 pollFdIndices.reserve(pollFdIndices.size() + 1);
110
111 for (uint32_t i = 0; i < pollFdIndices.size(); i++) {
112 pollFdIndices[pollfds[i].fd].index = i;
113 }
114
115 nextIndex = pollFdIndices.size();
116 }

◆ getCurrentSize()

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

Definition at line 126 of file EventMultiplexer.cpp.

126 {
127 return nextIndex;
128 }

◆ getEvents()

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

Definition at line 118 of file EventMultiplexer.cpp.

118 {
119 return pollfds.data();
120 }

◆ getPollFdIndices()

const std::unordered_map< int, PollFdsManager::PollFdIndex > & core::multiplexer::poll::PollFdsManager::getPollFdIndices ( ) const

Definition at line 122 of file EventMultiplexer.cpp.

122 {
123 return pollFdIndices;
124 }

◆ muxAdd()

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

Definition at line 51 of file EventMultiplexer.cpp.

51 {
52 const int fd = eventReceiver->getRegisteredFd();
53
54 if (!pollFdIndices.contains(fd)) {
55 pollfds[nextIndex].events = event;
56 pollfds[nextIndex].fd = fd;
57
58 pollFdIndices[fd].index = nextIndex;
59 pollFdIndices[fd].events = event;
60
61 ++nextIndex;
62
63 if (nextIndex == pollfds.size()) {
64 pollfds.resize(pollfds.size() * 2, {-1, 0, 0});
65 pollFdIndices.reserve(pollfds.size());
66 }
67 } else {
68 PollFdIndex& pollFdIndex = pollFdIndices[fd];
69
70 pollfds[pollFdIndex.index].events |= event;
71 pollFdIndex.events |= event;
72 }
73 }

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

Here is the caller graph for this function:

◆ muxDel()

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

Definition at line 75 of file EventMultiplexer.cpp.

75 {
76 const std::unordered_map<int, PollFdIndex>::iterator itPollFdIndex = pollFdIndices.find(fd);
77
78 PollFdIndex& pollFdIndex = itPollFdIndex->second;
79
80 pollfds[pollFdIndex.index].events &= static_cast<short>(~event); // tilde promotes to int
81 pollFdIndex.events &= static_cast<short>(~event); // tilde promotes to int
82
83 if (pollFdIndex.events == 0) {
84 pollfds[pollFdIndex.index].fd = -1; // Compress will keep track of that descriptor
85 pollFdIndices.erase(fd);
86
87 if (pollfds.size() > (pollFdIndices.size() * 2) + 1) {
88 compress();
89 }
90 }
91 }

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

Here is the caller graph for this function:

◆ muxOff()

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

Definition at line 97 of file EventMultiplexer.cpp.

97 {
98 pollfds[pollFdIndices.find(eventReceiver->getRegisteredFd())->second.index].events &=
99 static_cast<short>(~event); // Tilde promotes to int
100 }

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

93 {
94 pollfds[pollFdIndices.find(eventReceiver->getRegisteredFd())->second.index].events |= event;
95 }

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

◆ pollFdIndices

std::unordered_map<int, PollFdIndex> core::multiplexer::poll::PollFdsManager::pollFdIndices
private

Definition at line 65 of file EventMultiplexer.h.

◆ pollfds

std::vector<pollfd> core::multiplexer::poll::PollFdsManager::pollfds
private

Definition at line 64 of file EventMultiplexer.h.


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