summaryrefslogtreecommitdiff
path: root/src/s_bsd_sigio.c
diff options
context:
space:
mode:
authormichael <michael@82007160-df01-0410-b94d-b575c5fd34c7>2013-01-13 09:31:46 +0000
committermichael <michael@82007160-df01-0410-b94d-b575c5fd34c7>2013-01-13 09:31:46 +0000
commit33862809dfc9df2bf039dfbf47f7524c00947b54 (patch)
tree87ae0b7c587882bb3f4f55c16942916d23c31306 /src/s_bsd_sigio.c
parent9206712a4455da4ae692005f4e3181fd36ba6f42 (diff)
- Forward-port -r1732 [Dropped support for linux rt signals]
git-svn-id: svn://svn.ircd-hybrid.org/svnroot/ircd-hybrid/trunk@1736 82007160-df01-0410-b94d-b575c5fd34c7
Diffstat (limited to 'src/s_bsd_sigio.c')
-rw-r--r--src/s_bsd_sigio.c318
1 files changed, 0 insertions, 318 deletions
diff --git a/src/s_bsd_sigio.c b/src/s_bsd_sigio.c
deleted file mode 100644
index 6480393..0000000
--- a/src/s_bsd_sigio.c
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
- * s_bsd_sigio.c: Linux Realtime SIGIO compatible network routines.
- *
- * Originally by Aaron Sethman <androsyn@ratbox.org>
- * based upon: s_bsd_poll.c by Adrian Chadd <adrian@creative.net.au>
- * Copyright (C) 2001-2002 Hybrid Development Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- *
- * $Id$
- */
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE 1 /* Needed for F_SETSIG */
-#endif
-
-#include "stdinc.h"
-#if USE_IOPOLL_MECHANISM == __IOPOLL_MECHANISM_RTSIGIO
-#include <sys/poll.h>
-#include "list.h"
-#include "fdlist.h"
-#include "hook.h"
-#include "ircd.h"
-#include "s_bsd.h"
-#include "log.h"
-
-#define SIGIO_SIGNAL SIGRTMIN
-
-static pid_t my_pid;
-static sigset_t our_sigset;
-static struct pollfd *pollfds;
-static int pollmax = -1; /* highest FD number */
-static dlink_node *fdlim_hook, *setupfd_hook;
-
-/*
- * static void mask_our_signal(int s)
- *
- * Input: None
- * Output: None
- * Side Effects: Block our signal
- */
-static void
-mask_our_signal()
-{
- sigemptyset(&our_sigset);
- sigaddset(&our_sigset, SIGIO_SIGNAL);
- sigaddset(&our_sigset, SIGIO);
- sigprocmask(SIG_BLOCK, &our_sigset, NULL);
-}
-
-/*
- * void setup_sigio_fd(int fd)
- *
- * Input: File descriptor
- * Output: None
- * Side Effect: Sets the FD up for SIGIO
- */
-static void *
-setup_sigio_fd(va_list args)
-{
- int fd = va_arg(args, int);
-
- fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_ASYNC);
- fcntl(fd, F_SETSIG, SIGIO_SIGNAL);
- fcntl(fd, F_SETOWN, my_pid);
-
- return pass_callback(setupfd_hook, fd);
-}
-
-/*
- * changing_fdlimit
- *
- * Resize pollfds array if necessary.
- */
-static void *
-changing_fdlimit(va_list args)
-{
- int old_fdlimit = hard_fdlimit;
-
- pass_callback(fdlim_hook, va_arg(args, int));
-
- if (hard_fdlimit != old_fdlimit)
- pollfds = MyRealloc(pollfds, sizeof(struct pollfd) * hard_fdlimit);
-
- return NULL;
-}
-
-/*
- * void init_netio(void)
- *
- * Input: None
- * Output: None
- * Side Effects: This is a needed exported function which will
- * be called to initialise the network loop code.
- */
-void
-init_netio(void)
-{
- int fd;
-
- pollfds = MyMalloc(sizeof(struct pollfd) * hard_fdlimit);
-
- for (fd = 0; fd < hard_fdlimit; fd++)
- pollfds[fd].fd = -1;
-
- setupfd_hook = install_hook(setup_socket_cb, setup_sigio_fd);
- fdlim_hook = install_hook(fdlimit_cb, changing_fdlimit);
-
- my_pid = getpid();
- mask_our_signal(SIGIO_SIGNAL);
-}
-
-/*
- * find a spare slot in the fd list. We can optimise this out later!
- * -- adrian
- */
-static inline int
-poll_findslot(void)
-{
- int i;
-
- for (i = 0; i < hard_fdlimit; i++)
- {
- if (pollfds[i].fd == -1)
- {
- /* MATCH!!#$*&$ */
- return i;
- }
- }
-
- assert(1 == 0);
- /* NOTREACHED */
- return -1;
-}
-
-/*
- * comm_setselect
- *
- * This is a needed exported function which will be called to register
- * and deregister interest in a pending IO state for a given FD.
- */
-void
-comm_setselect(fde_t *F, unsigned int type, PF *handler,
- void *client_data, time_t timeout)
-{
- int new_events;
-
- if ((type & COMM_SELECT_READ))
- {
- F->read_handler = handler;
- F->read_data = client_data;
- }
-
- if ((type & COMM_SELECT_WRITE))
- {
- F->write_handler = handler;
- F->write_data = client_data;
- }
-
- new_events = (F->read_handler ? POLLRDNORM : 0) |
- (F->write_handler ? POLLWRNORM : 0);
-
- if (timeout != 0)
- F->timeout = CurrentTime + (timeout / 1000);
-
- if (new_events != F->evcache)
- {
- if (new_events == 0)
- {
- pollfds[F->comm_index].fd = -1;
- pollfds[F->comm_index].revents = 0;
-
- if (pollmax == F->comm_index)
- while (pollmax >= 0 && pollfds[pollmax].fd == -1)
- pollmax--;
- }
- else
- {
- if (F->evcache == 0)
- {
- F->comm_index = poll_findslot();
- if (F->comm_index > pollmax)
- pollmax = F->comm_index;
-
- pollfds[F->comm_index].fd = F->fd;
- }
- pollfds[F->comm_index].events = new_events;
- pollfds[F->comm_index].revents = 0;
- }
-
- F->evcache = new_events;
- }
-}
-
-/*
- * comm_select
- *
- * Called to do the new-style IO, courtesy of squid (like most of this
- * new IO code). This routine handles the stuff we've hidden in
- * comm_setselect and fd_table[] and calls callbacks for IO ready
- * events.
- */
-void
-comm_select(void)
-{
- static time_t last_rtsigqo_warning = 0;
- struct timespec timeout;
- struct siginfo si;
- int i, revents, num;
- fde_t *F;
- PF *hdl;
-
- timeout.tv_sec = 0;
- timeout.tv_nsec = 1000000 * SELECT_DELAY;
- i = sigtimedwait(&our_sigset, &si, &timeout);
-
- set_time();
-
- if (i != SIGIO)
- {
- if (i > 0)
- {
- F = lookup_fd(si.si_fd);
- if (F == NULL || !F->flags.open)
- return;
-
- if (si.si_band & (POLLRDNORM | POLLIN | POLLHUP | POLLERR))
- if ((hdl = F->read_handler) != NULL)
- {
- F->read_handler = NULL;
- hdl(F, F->read_data);
- if (!F->flags.open)
- return;
- }
-
- if (si.si_band & (POLLWRNORM | POLLOUT | POLLHUP | POLLERR))
- if ((hdl = F->write_handler) != NULL)
- {
- F->write_handler = NULL;
- hdl(F, F->write_data);
- if (!F->flags.open)
- return;
- }
-
- comm_setselect(F, 0, NULL, NULL, 0);
- }
-
- return;
- }
-
- /* RT signal queue overflowed.. */
-
- if (CurrentTime - last_rtsigqo_warning >= 30)
- {
- ilog(LOG_TYPE_IRCD, "Kernel RT Signal queue overflowed. "
- "Is /proc/sys/kernel/rtsig-max too small?");
- last_rtsigqo_warning = CurrentTime;
- }
-
- signal(SIGIO_SIGNAL, SIG_IGN);
- signal(SIGIO_SIGNAL, SIG_DFL);
-
- /* ..try polling instead */
-
- while ((num = poll(pollfds, pollmax + 1, 0)) < 0 && ignoreErrno(errno))
- ;
-
- /* update current time again, eww.. */
- set_time();
-
- for (i = 0; i <= pollmax && num > 0; i++)
- {
- if ((revents = pollfds[i].revents) == 0 || pollfds[i].fd == -1)
- continue;
- num--;
-
- F = lookup_fd(pollfds[i].fd);
- if (F == NULL || !F->flags.open)
- continue;
-
- if (revents & (POLLRDNORM | POLLIN | POLLHUP | POLLERR))
- if ((hdl = F->read_handler) != NULL)
- {
- F->read_handler = NULL;
- hdl(F, F->read_data);
- if (!F->flags.open)
- continue;
- }
-
- if (revents & (POLLWRNORM | POLLOUT | POLLHUP | POLLERR))
- if ((hdl = F->write_handler) != NULL)
- {
- F->write_handler = NULL;
- hdl(F, F->write_data);
- if (!F->flags.open)
- continue;
- }
-
- comm_setselect(F, 0, NULL, NULL, 0);
- }
-
- mask_our_signal(SIGIO_SIGNAL);
-}
-#endif