]> git.kaiwu.me - nginx.git/commitdiff
nginx-0.0.3-2004-04-28-10:14:50 import
authorIgor Sysoev <igor@sysoev.ru>
Wed, 28 Apr 2004 06:14:50 +0000 (06:14 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Wed, 28 Apr 2004 06:14:50 +0000 (06:14 +0000)
src/event/modules/ngx_epoll_module.c
src/event/modules/ngx_rtsig_module.c
src/event/ngx_event.h
src/http/ngx_http_request.c
src/os/unix/ngx_readv_chain.c
src/os/unix/ngx_recv.c

index a1d7084750c593417b216729a0f0fe52a3bf3c8c..a8e51c646152cbb52ed41c0cdd6946cd7012a837 100644 (file)
@@ -172,6 +172,7 @@ static int ngx_epoll_init(ngx_cycle_t *cycle)
 #else
     ngx_event_flags = NGX_USE_LEVEL_EVENT
 #endif
+                      |NGX_HAVE_GREEDY_EVENT
                       |NGX_HAVE_INSTANCE_EVENT;
 
     return NGX_OK;
@@ -472,7 +473,7 @@ int ngx_epoll_process_events(ngx_cycle_t *cycle)
             continue;
         }
 
-#if (NGX_DEBUG)
+#if (NGX_DEBUG0)
         log = c->log ? c->log : cycle->log;
 #endif
 
index e5f632a2a8e06d3a25f2d732fbd08956557c2a83..af5d7729438409ca28842d9d2808a932b6282401 100644 (file)
@@ -117,7 +117,9 @@ static int ngx_rtsig_init(ngx_cycle_t *cycle)
 
     ngx_event_actions = ngx_rtsig_module_ctx.actions;
 
-    ngx_event_flags = NGX_USE_SIGIO_EVENT|NGX_HAVE_INSTANCE_EVENT;
+    ngx_event_flags = NGX_USE_SIGIO_EVENT
+                      |NGX_HAVE_GREEDY_EVENT
+                      |NGX_HAVE_INSTANCE_EVENT;
 
     return NGX_OK;
 }
index f3232e7df54a7aa36f4457bb9a6ef1e378fe19e9..e85f531b7a20e79b5ec50d7b90c5c6bb33151fab 100644 (file)
@@ -229,33 +229,39 @@ extern ngx_event_actions_t   ngx_event_actions;
  */
 #define NGX_HAVE_INSTANCE_EVENT  0x00000020
 
+/*
+ * The event filter requires to do i/o operation until EAGAIN -
+ * epoll, rt signals.
+ */
+#define NGX_HAVE_GREEDY_EVENT    0x00000040
+
 /*
  * The event filter notifies only the changes (the edges)
  * but not an initial level - early epoll patches.
  */
-#define NGX_USE_EDGE_EVENT       0x00000040
+#define NGX_USE_EDGE_EVENT       0x00000080
 
 /*
  * No need to add or delete the event filters - rt signals.
  */
-#define NGX_USE_SIGIO_EVENT      0x00000080
+#define NGX_USE_SIGIO_EVENT      0x00000100
 
 /*
  * The alternative event method after the rt signals queue overflow.
  */
-#define NGX_OVERFLOW_EVENT       0x00000100
+#define NGX_OVERFLOW_EVENT       0x00000200
 
 /*
  * No need to add or delete the event filters - overlapped, aio_read,
  * aioread, io_submit.
  */
-#define NGX_USE_AIO_EVENT        0x00000200
+#define NGX_USE_AIO_EVENT        0x00000400
 
 /*
  * Need to add socket or handle only once - i/o completion port.
  * It also requires HAVE_AIO and NGX_USE_AIO_EVENT to be set.
  */
-#define NGX_USE_IOCP_EVENT       0x00000400
+#define NGX_USE_IOCP_EVENT       0x00000800
 
 
 
index 1e03621071516eb75aeb0b9ea02d3dda882f994d..d5496e227b1b141319f9c29736def77c4cbe988a 100644 (file)
@@ -192,8 +192,8 @@ static void ngx_http_init_request(ngx_event_t *rev)
 #endif
             len = sizeof(struct sockaddr_in);
             if (getsockname(c->fd, (struct sockaddr *) &addr_in, &len) == -1) {
-                ngx_log_error(NGX_LOG_CRIT, rev->log, ngx_socket_errno,
-                              "getsockname() failed");
+                ngx_connection_error(c, ngx_socket_errno,
+                                     "getsockname() failed");
                 ngx_http_close_connection(c);
                 return;
             }
@@ -1306,10 +1306,9 @@ static void ngx_http_set_keepalive(ngx_http_request_t *r)
 
     if (c->tcp_nopush == 1) {
         if (ngx_tcp_push(c->fd) == NGX_ERROR) {
-            ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
-                          ngx_tcp_push_n " failed");
-                ngx_http_close_connection(c);
-                return;
+            ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed");
+            ngx_http_close_connection(c);
+            return;
         }
         c->tcp_nopush = 0;
     }
@@ -1415,8 +1414,8 @@ static void ngx_http_set_lingering_close(ngx_http_request_t *r)
     }
 
     if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) {
-        ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
-                      ngx_shutdown_socket_n " failed");
+        ngx_connection_error(c, ngx_socket_errno,
+                             ngx_shutdown_socket_n " failed");
         ngx_http_close_request(r, 0);
         ngx_http_close_connection(c);
         return;
index 49bb3ef3e6fd857e707d02aa9271ad1aa77040f4..86f774a0dba05d71ebe5225e1e4f75a14e7534df 100644 (file)
@@ -173,13 +173,16 @@ ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain)
     do {
         n = readv(c->fd, (struct iovec *) io.elts, io.nelts);
 
-        if (n >= 0) {
-            if (n < size) {
-                rev->ready = 0;
-            }
+        if (n == 0) {
+            rev->ready = 0;
+            rev->eof = 1;
 
-            if (n == 0) {
-                rev->eof = 1;
+            return n;
+
+        } else if (n > 0) {
+
+            if (n < size && !(ngx_event_flags & NGX_HAVE_GREEDY_EVENT)) {
+                rev->ready = 0;
             }
 
             return n;
index 63453503ce912bb2494d2f5ece74ba6ef543b20a..04b594f6ea3846847999f587e238ea3d1cc4b22c 100644 (file)
@@ -126,13 +126,17 @@ ssize_t ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)
         ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
                        "recv: fd:%d %d of %d", c->fd, n, size);
 
-        if (n >= 0) {
-            if ((size_t) n < size) {
-                rev->ready = 0;
-            }
+        if (n == 0) {
+            rev->ready = 0;
+            rev->eof = 1;
+            return n;
 
-            if (n == 0) {
-                rev->eof = 1;
+        } else if (n > 0) {
+
+            if ((size_t) n < size
+                && !(ngx_event_flags & NGX_HAVE_GREEDY_EVENT))
+            {
+                rev->ready = 0;
             }
 
             return n;