51 void PollFdsManager::muxAdd(core::DescriptorEventReceiver* eventReceiver,
short event) {
52 const int fd = eventReceiver->getRegisteredFd();
54 if (!pollFdIndices.contains(fd)) {
55 pollfds[nextIndex].events = event;
56 pollfds[nextIndex].fd = fd;
58 pollFdIndices[fd].index = nextIndex;
59 pollFdIndices[fd].events = event;
63 if (nextIndex == pollfds.size()) {
64 pollfds.resize(pollfds.size() * 2, {-1, 0, 0});
65 pollFdIndices.reserve(pollfds.size());
68 PollFdIndex& pollFdIndex = pollFdIndices[fd];
70 pollfds[pollFdIndex.index].events |= event;
71 pollFdIndex.events |= event;
75 void PollFdsManager::muxDel(
int fd,
short event) {
76 const std::unordered_map<
int, PollFdIndex>::iterator itPollFdIndex = pollFdIndices.find(fd);
78 PollFdIndex& pollFdIndex = itPollFdIndex->second;
80 pollfds[pollFdIndex.index].events &=
static_cast<
short>(~event);
81 pollFdIndex.events &=
static_cast<
short>(~event);
83 if (pollFdIndex.events == 0) {
84 pollfds[pollFdIndex.index].fd = -1;
85 pollFdIndices.erase(fd);
87 if (pollfds.size() > (pollFdIndices.size() * 2) + 1) {
102 void PollFdsManager::compress() {
103 (
void) std::remove_if(pollfds.begin(), pollfds.end(), [](
const pollfd& pollFd) ->
bool {
104 return pollFd.fd < 0;
107 pollfds.resize(pollFdIndices.size() + 1, {-1, 0, 0});
109 pollFdIndices.reserve(pollFdIndices.size() + 1);
111 for (uint32_t i = 0; i < pollFdIndices.size(); i++) {
112 pollFdIndices[pollfds[i].fd].index = i;
115 nextIndex = pollFdIndices.size();
130 EventMultiplexer::EventMultiplexer()
131 : core::EventMultiplexer(
new core::multiplexer::poll::DescriptorEventPublisher(
"READ",
134 POLLIN | POLLHUP | POLLRDHUP | POLLERR),
135 new core::multiplexer::poll::DescriptorEventPublisher(
"WRITE",
139 new core::multiplexer::poll::DescriptorEventPublisher(
"EXCEPT",
143 LOG(DEBUG) <<
"Core::multiplexer: poll";
146 int EventMultiplexer::monitorDescriptors(utils::Timeval& tickTimeOut,
const sigset_t& sigMask) {
147 const timespec timeSpec = tickTimeOut.getTimespec();
149 return core::system::ppoll(pollFdsManager.getEvents(), pollFdsManager.getCurrentSize(), &timeSpec, &sigMask);
152 void EventMultiplexer::spanActiveEvents(
int activeDescriptorCount) {
153 if (activeDescriptorCount > 0) {
154 for (core::DescriptorEventPublisher*
const descriptorEventPublisher : descriptorEventPublishers) {
155 descriptorEventPublisher->spanActiveEvents();