diff src/event/modules/ngx_sigio_module.c @ 247:008276b9e061

nginx-0.0.1-2004-02-01-11:10:52 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 01 Feb 2004 08:10:52 +0000
parents 6753e8cdaa2c
children
line wrap: on
line diff
--- a/src/event/modules/ngx_sigio_module.c
+++ b/src/event/modules/ngx_sigio_module.c
@@ -13,11 +13,14 @@
 
 #define F_SETSIG  10
 
+#define POLL_IN   POLLIN
+#define POLL_OUT  POLLOUT
+
 #endif
 
 
 typedef struct {
-    int  signal;
+    int  signo;
 } ngx_sigio_conf_t;
 
 
@@ -44,7 +47,7 @@ static ngx_command_t  ngx_sigio_commands
      NGX_EVENT_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_num_slot,
      0,
-     offsetof(ngx_sigio_conf_t, signal),
+     offsetof(ngx_sigio_conf_t, signo),
      NULL},
 
     ngx_null_command
@@ -87,7 +90,7 @@ static int ngx_sigio_init(ngx_cycle_t *c
     sgcf = ngx_event_get_conf(cycle->conf_ctx, ngx_sigio_module);
 
     sigemptyset(&set);
-    sigaddset(&set, sgcf->signal);
+    sigaddset(&set, sgcf->signo);
     sigaddset(&set, SIGIO);
 
     if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {
@@ -144,7 +147,7 @@ static int ngx_sigio_add_connection(ngx_
     sgcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_sigio_module);
 
     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                   "sigio add connection: fd:%d signo:%d", c->fd, sgcf->signal);
+                   "sigio add connection: fd:%d signo:%d", c->fd, sgcf->signo);
 
     if (fcntl(c->fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC) == -1) {
         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
@@ -152,7 +155,7 @@ static int ngx_sigio_add_connection(ngx_
         return NGX_ERROR;
     }
 
-    if (fcntl(c->fd, F_SETSIG, sgcf->signal) == -1) {
+    if (fcntl(c->fd, F_SETSIG, sgcf->signo) == -1) {
         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
                       "fcntl(F_SETSIG) failed");
         return NGX_ERROR;
@@ -199,6 +202,7 @@ int ngx_sigio_process_events(ngx_log_t *
     siginfo_t           si;
     struct timeval      tv;
     struct timespec     ts;
+    struct sigaction    sa;
     ngx_connection_t   *c;
     ngx_epoch_msec_t    delta;
     ngx_sigio_conf_t   *sgcf;
@@ -246,12 +250,21 @@ int ngx_sigio_process_events(ngx_log_t *
 
     sgcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_sigio_module);
 
-    if (signo == sgcf->signal) {
+    if (signo == sgcf->signo) {
 
         /* STUB: old_cycles */
-        c = &ngx_connections[si.si_fd];
+        c = &ngx_cycle->connections[si.si_fd];
 
-        if (si.si_band & EPOLLIN) {
+        if (si.si_band & POLL_IN) {
+            if (!c->read->active) {
+                continue;
+            }
+
+            c->read->ready = 1;
+            c->read->event_handler(c->read);
+        }
+
+        if (si.si_band & POLL_OUT) {
             if (!c->read->active) {
                 continue;
             }
@@ -265,6 +278,15 @@ int ngx_sigio_process_events(ngx_log_t *
                       "signal queue overflowed: "
                       "SIGIO, fd:%d, band:%d", si.si_fd, si.si_band);
 
+        ngx_memzero(&sa, sizeof(struct sigaction));
+        sa.sa_sigaction = SIG_DFL;
+        sigemptyset(&sa.sa_mask);
+        if (sigaction(sgcf->signo, &sa, NULL) == -1) {
+            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
+                          "sigaction queue overflowed: "
+                          "SIGIO, fd:%d, band:%d", si.si_fd, si.si_band);
+        }
+
     } else {
         ngx_log_error(NGX_LOG_ALERT, log, 0,
                       timer ?  "sigtimedwait() returned unexpected signal: %d":
@@ -350,7 +372,8 @@ static char *ngx_sigio_init_conf(ngx_cyc
 {
     ngx_sigio_conf_t  *sgcf = conf;
 
-    ngx_conf_init_unsigned_value(sgcf->signal, SIGRTMIN);
+    /* LinuxThreads uses the first 3 RT signals */
+    ngx_conf_init_unsigned_value(sgcf->signo, SIGRTMIN + 10);
 
     return NGX_CONF_OK;
 }