Packages
erlexec
1.18.8
2.3.4
2.3.3
retired
2.3.2
retired
2.3.1
retired
2.3.0
retired
2.2.4
retired
2.2.3
retired
2.2.2
retired
2.2.1
retired
2.2.0
retired
2.0.8
retired
2.0.7
retired
2.0.6
retired
2.0.5
retired
2.0.4
retired
2.0.3
retired
2.0.2
retired
2.0.1
retired
2.0.0
retired
1.21.0
retired
1.20.1
retired
1.20.0
retired
1.19.1
retired
1.19.0
1.18.11
1.18.8
1.18.7
1.18.6
1.18.5
1.18.4
1.18.3
1.18.2
1.18.1
1.17.6
1.17.5
1.17.3
1.16.4
1.10.9
1.10.4
1.10.2
1.10.1
1.10.0
1.9.5
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.4.0
1.3.0
1.2.2
1.2.1
1.1.3
1.1.2
1.1.1
1.1.0
1.0.1
retired
OS Process Manager
Current section
Files
Jump to
Current section
Files
c_src/poll_handler.hpp
// vim:ts=4:sw=4:et
/*
Author: Christian Taedcke
Date: 2020-01-06
*/
#pragma once
#include <sys/poll.h>
#include <vector>
#include "ei++.hpp"
struct PollHandler {
PollHandler() : command_index{-1}, sigchild_index{-1} {};
void append_read_fd(int fd, FdType type = FdType::CHILD_PROC, bool error = false) {
fds.push_back(pollfd{fd, (short) (error ? (POLLIN | POLLERR) : POLLIN), 0});
switch (type) {
case FdType::COMMAND:
command_index = fds.size() - 1;
break;
case FdType::SIGCHILD:
sigchild_index = fds.size() - 1;
break;
case FdType::CHILD_PROC:
break;
}
}
void append_write_fd(int fd) {
fds.push_back(pollfd{fd, POLLOUT, 0});
}
void clear() {
fds.clear();
command_index = -1;
sigchild_index = -1;
}
size_t size() { return fds.size(); }
int wait_for_event(const ei::TimeVal &timeout) {
assert(!fds.empty());
return poll(&fds.front(), fds.size(), timeout.millisec());
}
bool is_readable(FdType type, int index = -1) {
switch (type) {
case FdType::CHILD_PROC: return is_readable(index);
case FdType::COMMAND: return is_readable(command_index);
case FdType::SIGCHILD: return is_readable(sigchild_index);
default: return false;
}
}
bool is_error(FdType type, int index = -1) {
switch (type) {
case FdType::CHILD_PROC: return is_error(index);
case FdType::COMMAND: return is_error(command_index);
case FdType::SIGCHILD: return is_error(sigchild_index);
default: return false;
}
}
bool is_readable(int index) {
assert(index < int(fds.size()));
return index >= 0 && (fds[index].revents & (POLLIN|POLLHUP));
}
bool is_writable(int index) {
assert(index < int(fds.size()));
return index >= 0 && (fds[index].revents & POLLOUT);
}
bool is_error(int index) {
assert(index < int(fds.size()));
return index >= 0 && (fds[index].revents & POLLHUP);
}
private:
std::vector<pollfd> fds;
ssize_t command_index;
ssize_t sigchild_index;
};
using FdHandler = PollHandler;