#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
+#include <uv.h>
struct jobent {
struct client_data *client;
static pid_t current_child = -1;
static int current_result = 0;
-#ifdef HAS_UV
-#include <uv.h>
static uv_signal_t uvsigchld, uvsigint;
-#define HANDLE_ARG [[maybe_unused]] uv_signal_t *handle,
-#else
-#define HANDLE_ARG
-#endif
-static void job_child(HANDLE_ARG [[maybe_unused]] int signum)
+static void job_child([[maybe_unused]] uv_signal_t *handle, [[maybe_unused]] int signum)
{
- (void)signum;
- int old_errno = errno;
int wstatus;
pid_t pid;
while ((pid = waitpid(-1, &wstatus, WNOHANG)) > 0) {
current_result = WIFEXITED(wstatus) ? WEXITSTATUS(wstatus) : -1;
}
}
- errno = old_errno;
}
-static void job_int(HANDLE_ARG [[maybe_unused]] int signum)
+static void job_int([[maybe_unused]] uv_signal_t *handle, [[maybe_unused]] int signum)
{
- extern volatile sig_atomic_t is_siginted;
- is_siginted = 1;
+ extern bool is_siginted;
+ is_siginted = true;
}
void job_init(void)
{
if (sigaction(SIGPIPE, &sa, NULL) == -1)
perror("sigaction");
-#ifndef HAS_UV
- sa.sa_handler = job_child;
- sa.sa_flags = SA_RESTART;
- if (sigaction(SIGCHLD, &sa, NULL) == -1)
- perror("sigaction");
-
- sa.sa_handler = job_int;
- /* Note that SA_RESTART doesn't affect select/poll/epoll_wait. */
- sa.sa_flags = SA_RESETHAND | SA_RESTART;
- if (sigaction(SIGINT, &sa, NULL) == -1)
- perror("sigaction");
-#else
uv_signal_init(uv_default_loop(), &uvsigchld);
uv_signal_start(&uvsigchld, job_child, SIGCHLD);
uv_signal_init(uv_default_loop(), &uvsigint);
uv_signal_start_oneshot(&uvsigint, job_int, SIGINT);
-#endif
}
void job_fini(void)
{
-#ifdef HAS_UV
uv_close((uv_handle_t *)&uvsigchld, 0);
uv_close((uv_handle_t *)&uvsigint, 0);
-#endif
}
static void job_process(void)
{
}
void job_process_begin(void)
{
-#ifndef HAS_UV
- sigset_t mask;
- sigemptyset(&mask);
- sigaddset(&mask, SIGCHLD);
- sigprocmask(SIG_BLOCK, &mask, 0);
-#endif
job_process();
}
void job_process_end(void)
{
job_process();
-#ifndef HAS_UV
- sigset_t mask;
- sigemptyset(&mask);
- sigaddset(&mask, SIGCHLD);
- sigprocmask(SIG_UNBLOCK, &mask, 0);
-#endif
}
void job_add(struct client_data *cl, jobproc_t job, contproc_t then, char *data, size_t len)
#include "netpoll.h"
#include "util.h"
-#ifdef HAS_UV
#include <uv.h>
-#endif
namespace netpoll {
#define NETPOLL_MAXFDS 1024
static struct net_pollfd fds[NETPOLL_MAXFDS] = {};
static int nfds = 0;
-#ifndef HAS_UV
-static struct pollfd pollfds[NETPOLL_MAXFDS] = {};
-static int lastptr = 0;
-void init(void)
-{
-}
-void fini(void)
-{
-}
-static void add_impl(int i)
-{
- memmove(pollfds+i+1, pollfds+i, sizeof(pollfds[0])*(nfds-1-i));
- pollfds[i].fd = fds[i].fd;
- pollfds[i].events = 0;
- pollfds[i].revents = 0;
- if (lastptr >= i)
- lastptr++;
-}
-static void del_impl(int i)
-{
- memmove(pollfds+i, pollfds+i+1, sizeof(pollfds[0])*(nfds-(i+1)));
- if (lastptr > i)
- lastptr--;
-}
-static void reg_impl(int i, int ev)
-{
- pollfds[i].events = 0;
- if (ev & NETPOLL_IN)
- pollfds[i].events = POLLIN;
- if (ev & NETPOLL_OUT)
- pollfds[i].events = POLLOUT;
-}
-int begin(void)
-{
- sigset_t mask;
- sigprocmask(0, 0, &mask);
- sigdelset(&mask, SIGCHLD);
- int rv = ppoll(pollfds, nfds, 0, &mask);
- lastptr = 0;
- return rv;
-}
-int get(struct net_pollfd *out)
-{
- int ev = 0;
- while (!ev) {
- if (lastptr == nfds)
- return 0;
- int pev = pollfds[lastptr].revents;
- if (pev & POLLIN)
- ev |= NETPOLL_IN;
- if (pev & POLLOUT)
- ev |= NETPOLL_OUT;
- lastptr++;
- }
- *out = fds[lastptr-1];
- return ev;
-}
-#else
#define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))
struct polldata {
uv_poll_t uv;
*out = fds[lastptr-1];
return ev;
}
-#endif
static int search(SOCKET fd) {
int l = 0, r = nfds;
del_impl(i);
memmove(fds+i, fds+i+1, sizeof(fds[0])*(nfds-(i+1)));
nfds--;
-#ifndef HAS_UV
- closesocket(fd);
-#endif
}
void reg(SOCKET fd, int ev)
{