Packages
erlexec
2.2.0
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
Retired package: Deprecated - Deprecated
Current section
Files
Jump to
Current section
Files
c_src/select_handler.hpp
// vim:ts=4:sw=4:et
/*
Author: Christian Taedcke
Date: 2020-01-06
*/
#pragma once
#include "ei++.hpp"
struct SelectHandler {
SelectHandler() : maxfd{0}, command_fd{-1}, sigchild_fd{-1} {
FD_ZERO(&writefds);
FD_ZERO(&readfds);
FD_ZERO(&errfds);
}
void clear() { new (this) SelectHandler(); }
void append_read_fd(int fd, FdType type = FdType::CHILD_PROC, bool _error = false) {
FD_SET(fd, &readfds);
if (fd > maxfd)
maxfd = fd;
switch (type) {
case FdType::COMMAND:
FD_SET(fd, &errfds);
command_fd = fd;
break;
case FdType::SIGCHILD:
sigchild_fd = fd;
break;
case FdType::CHILD_PROC:
break;
}
}
void append_write_fd(int fd) {
FD_SET(fd, &writefds);
if (fd > maxfd)
maxfd = fd;
}
int wait_for_event(ei::TimeVal &timeout) {
return select(maxfd+1, &readfds, &writefds, &errfds, &timeout);
}
bool is_readable(FdType type, int fd = -1) {
switch (type) {
case FdType::CHILD_PROC: return is_readable(fd);
case FdType::COMMAND: return is_readable(command_fd);
case FdType::SIGCHILD: return is_readable(sigchild_fd);
default: return false;
}
}
bool is_error(FdType type, int fd = -1) {
switch (type) {
case FdType::CHILD_PROC: return is_error(fd);
case FdType::COMMAND: return is_error(command_fd);
case FdType::SIGCHILD: return is_error(sigchild_fd);
default: return false;
}
}
bool is_readable(int fd) { return fd >= 0 && FD_ISSET(fd, &readfds); }
bool is_writable(int fd) { return fd >= 0 && FD_ISSET(fd, &writefds); }
bool is_error (int fd) { return fd >= 0 && FD_ISSET(fd, &errfds); }
int size() const { return maxfd; }
private:
fd_set readfds, writefds, errfds;
int maxfd;
int command_fd;
int sigchild_fd;
};
using FdHandler = SelectHandler;