}
if (!cl->hostname)
abort();
- net_poll_add(cl->FD, SOCKTYPE_CLIENT, cl);
+ netpoll::add(cl->FD, SOCKTYPE_CLIENT, cl);
update_poll_reg(cl);
copy_strf(&databuf, ":%s NOTICE * :Hello welcome to PatchyIRCD!\r\n", hostname);
sendbuf(cl);
fprintf(stderr, "[PatchyIRCD]: Starting up...\n");
net_init();
- net_poll_init();
+ netpoll::init();
job_init();
#ifdef HAS_LUA
admin_init();
for (int i = 0; i < listener_count; i++) {
net_nonblock(listeners[i].sock);
- net_poll_add(listeners[i].sock, SOCKTYPE_LISTENER, &listeners[i]);
- net_poll_reg(listeners[i].sock, NETPOLL_IN);
+ netpoll::add(listeners[i].sock, SOCKTYPE_LISTENER, &listeners[i]);
+ netpoll::reg(listeners[i].sock, NETPOLL_IN);
}
FILE *f = fopen(getdatafile("init.txt"), "rb" FOPEN_CLOEXEC);
if (is_siginted) {
fprintf(stderr, "[PatchyIRCD]: Cleaning up...\n");
for (int i = 0; i < listener_count; i++) {
- net_poll_del_and_close(listeners[i].sock);
+ netpoll::del_and_close(listeners[i].sock);
}
listener_count = 0;
for (struct client_data *cl = clients; cl;) {
}
job_process_begin();
- if (net_poll_begin() == -1) {
+ if (netpoll::begin() == -1) {
if (errno == EINTR) {
job_process_end();
continue;
}
job_process_end();
int ev;
- struct net_pollfd pfd;
- while ((ev = net_poll_get(&pfd))) {
+ netpoll::net_pollfd pfd;
+ while ((ev = netpoll::get(&pfd))) {
switch (pfd.type) {
case SOCKTYPE_LISTENER:
if (ev & NETPOLL_IN)
admin_fini();
#endif
job_fini();
- net_poll_fini();
+ netpoll::fini();
net_cleanup();
#ifdef HAS_TLS
tls_free(tls_ctx);
#include "netpoll.h"
+namespace netpoll {
#define NETPOLL_MAXFDS 1024
static struct net_pollfd fds[NETPOLL_MAXFDS] = {};
static int nfds = 0;
#if defined(NETPOLL_USE_POLL)
static struct pollfd pollfds[NETPOLL_MAXFDS] = {};
static int lastptr = 0;
-void net_poll_init(void)
+void init(void)
{
}
-void net_poll_fini(void)
+void fini(void)
{
}
-static void net_poll_add_impl(int i)
+static void add_impl(int i)
{
memmove(pollfds+i+1, pollfds+i, sizeof(pollfds[0])*(nfds-1-i));
pollfds[i].fd = fds[i].fd;
if (lastptr >= i)
lastptr++;
}
-static void net_poll_del_impl(int i)
+static void del_impl(int i)
{
memmove(pollfds+i, pollfds+i+1, sizeof(pollfds[0])*(nfds-(i+1)));
if (lastptr > i)
lastptr--;
}
-static void net_poll_reg_impl(int i, int ev)
+static void reg_impl(int i, int ev)
{
pollfds[i].events = 0;
if (ev & NETPOLL_IN)
if (ev & NETPOLL_OUT)
pollfds[i].events = POLLOUT;
}
-int net_poll_begin(void)
+int begin(void)
{
sigset_t mask;
sigprocmask(0, 0, &mask);
lastptr = 0;
return rv;
}
-int net_poll_get(struct net_pollfd *out)
+int get(struct net_pollfd *out)
{
int ev = 0;
while (!ev) {
put(&uvpollbuf[i]);
}
}
-void net_poll_init(void)
+void init(void)
{
uvalloc::init();
uvloop = uv_default_loop();
}
-void net_poll_fini(void)
+void fini(void)
{
// get rid of closing handles
uv_run(uv_default_loop(), UV_RUN_NOWAIT);
uv_print_all_handles(uvloop, stderr);
uv_library_shutdown();
}
-static void net_poll_add_impl(int i)
+static void add_impl(int i)
{
struct polldata *poll = uvalloc::get();
memmove(uvpoll+i+1, uvpoll+i, sizeof(uvpoll[0])*(nfds-1-i));
if (lastptr >= i)
lastptr++;
}
-static void net_poll_del_impl(int i)
+static void del_impl(int i)
{
struct polldata *poll = uvpoll[i];
memmove(uvpoll+i, uvpoll+i+1, sizeof(uvpoll[0])*(nfds-(i+1)));
if (lastptr > i)
lastptr--;
}
-static void net_poll_cb(uv_poll_t *handle, int status, int events)
+static void cb(uv_poll_t *handle, int status, int events)
{
struct polldata *poll = container_of(handle, struct polldata, uv);
if (status == 0) {
}
uv_poll_stop(handle);
if (status == -EBADF) {
- fprintf(stderr, "net_poll_cb: %d EBADF!\n", poll->fd);
- net_poll_del_and_close(poll->fd);
+ fprintf(stderr, "netpoll::cb: %d EBADF!\n", poll->fd);
+ del_and_close(poll->fd);
}
lastptr = 0;
}
-static void net_poll_reg_impl(int i, int ev)
+static void reg_impl(int i, int ev)
{
int events = 0;
if (ev & NETPOLL_IN)
events |= UV_WRITABLE;
uvpoll[i]->events = events;
}
-int net_poll_begin(void)
+int begin(void)
{
for (int i = 0; i < nfds; i++) {
- uv_poll_start(&uvpoll[i]->uv, uvpoll[i]->events, net_poll_cb);
+ uv_poll_start(&uvpoll[i]->uv, uvpoll[i]->events, cb);
uvpoll[i]->revents = 0;
}
uv_run(uvloop, UV_RUN_ONCE);
return 0;
}
-int net_poll_get(struct net_pollfd *out)
+int get(struct net_pollfd *out)
{
int ev = 0;
while (!ev) {
}
#define IS_FOUND(i, f) ((i) < nfds && fds[i].fd == (f))
-void net_poll_add(SOCKET fd, int type, void *assoc)
+void add(SOCKET fd, int type, void *assoc)
{
if (fd == INVALID_SOCKET) {
- fprintf(stderr, "net_poll_add: INVALID_SOCKET\n");
+ fprintf(stderr, "netpoll::add: INVALID_SOCKET\n");
abort();
}
int i = search(fd);
if (IS_FOUND(i, fd)) {
- fprintf(stderr, "net_poll_add: socket already added\n");
+ fprintf(stderr, "netpoll::add: socket already added\n");
abort();
}
if (nfds == NETPOLL_MAXFDS) {
- fprintf(stderr, "net_poll_add: NETPOLL_MAXFDS limit\n");
+ fprintf(stderr, "netpoll::add: NETPOLL_MAXFDS limit\n");
abort();
}
memmove(fds+i+1, fds+i, sizeof(fds[0])*(nfds-i));
nfds++;
fds[i] = (struct net_pollfd){ .assoc = assoc, .fd = fd, .type = type };
- net_poll_add_impl(i);
+ add_impl(i);
}
-void net_poll_del_and_close(SOCKET fd)
+void del_and_close(SOCKET fd)
{
if (fd == INVALID_SOCKET) {
- fprintf(stderr, "net_poll_del_and_close: INVALID_SOCKET\n");
+ fprintf(stderr, "netpoll::del_and_close: INVALID_SOCKET\n");
abort();
}
int i = search(fd);
if (!IS_FOUND(i, fd)) {
- fprintf(stderr, "net_poll_del_and_close: socket not added\n");
+ fprintf(stderr, "netpoll::del_and_close: socket not added\n");
abort();
}
- net_poll_reg_impl(i, 0);
- net_poll_del_impl(i);
+ reg_impl(i, 0);
+ del_impl(i);
memmove(fds+i, fds+i+1, sizeof(fds[0])*(nfds-(i+1)));
nfds--;
#ifndef NETPOLL_USE_LIBUV
closesocket(fd);
#endif
}
-void net_poll_reg(SOCKET fd, int ev)
+void reg(SOCKET fd, int ev)
{
if (fd == INVALID_SOCKET) {
- fprintf(stderr, "net_poll_reg: INVALID_SOCKET\n");
+ fprintf(stderr, "netpoll::reg: INVALID_SOCKET\n");
abort();
}
int i = search(fd);
if (!IS_FOUND(i, fd)) {
- fprintf(stderr, "net_poll_reg: socket not added\n");
+ fprintf(stderr, "netpoll::reg: socket not added\n");
abort();
}
- net_poll_reg_impl(i, ev);
+ reg_impl(i, ev);
}
-void net_poll_change_type(SOCKET fd, int type)
+void change_type(SOCKET fd, int type)
{
if (fd == INVALID_SOCKET) {
- fprintf(stderr, "net_poll_change_type: INVALID_SOCKET\n");
+ fprintf(stderr, "netpoll::change_type: INVALID_SOCKET\n");
abort();
}
int i = search(fd);
if (!IS_FOUND(i, fd)) {
- fprintf(stderr, "net_poll_change_type: socket not added\n");
+ fprintf(stderr, "netpoll::change_type: socket not added\n");
abort();
}
fds[i].type = type;
}
+}