changeset 1689:0b592a68aade

ngx_udp_recv()
author Igor Sysoev <igor@sysoev.ru>
date Mon, 03 Dec 2007 16:46:46 +0000
parents bd85a95d60c6
children 143f4d65b1c8
files auto/sources src/core/ngx_resolver.c src/event/modules/ngx_aio_module.c src/event/modules/ngx_iocp_module.c src/event/ngx_event.h src/os/unix/ngx_freebsd_init.c src/os/unix/ngx_linux_init.c src/os/unix/ngx_os.h src/os/unix/ngx_posix_init.c src/os/unix/ngx_solaris_init.c src/os/unix/ngx_udp_recv.c src/os/win32/ngx_os.h src/os/win32/ngx_udp_wsarecv.c src/os/win32/ngx_win32_init.c
diffstat 14 files changed, 28 insertions(+), 92 deletions(-) [+]
line wrap: on
line diff
--- a/auto/sources
+++ b/auto/sources
@@ -164,6 +164,7 @@ UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \
             src/os/unix/ngx_socket.c \
             src/os/unix/ngx_recv.c \
             src/os/unix/ngx_readv_chain.c \
+            src/os/unix/ngx_udp_recv.c \
             src/os/unix/ngx_send.c \
             src/os/unix/ngx_writev_chain.c \
             src/os/unix/ngx_channel.c \
@@ -229,6 +230,7 @@ WIN32_SRCS="$CORE_SRCS $EVENT_SRCS \
             src/os/win32/ngx_socket.c \
             src/os/win32/ngx_wsarecv.c \
             src/os/win32/ngx_wsarecv_chain.c \
+            src/os/win32/ngx_udp_wsarecv.c \
             src/os/win32/ngx_wsasend_chain.c \
             src/os/win32/ngx_win32_init.c \
             src/os/win32/ngx_user.c \
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -826,9 +826,9 @@ ngx_resolver_read_response(ngx_event_t *
     c = rev->data;
 
     do {
-        n = ngx_recv(c, buf, NGX_RESOLVER_UDP_SIZE);
-
-        if (n == -1) {
+        n = ngx_udp_recv(c, buf, NGX_RESOLVER_UDP_SIZE);
+
+        if (n < 0) {
             return;
         }
 
--- a/src/event/modules/ngx_aio_module.c
+++ b/src/event/modules/ngx_aio_module.c
@@ -28,6 +28,7 @@ static ngx_int_t ngx_aio_process_events(
 ngx_os_io_t ngx_os_aio = {
     ngx_aio_read,
     ngx_aio_read_chain,
+    NULL,
     ngx_aio_write,
     ngx_aio_write_chain,
     0
--- a/src/event/modules/ngx_iocp_module.c
+++ b/src/event/modules/ngx_iocp_module.c
@@ -90,6 +90,7 @@ ngx_module_t  ngx_iocp_module = {
 ngx_os_io_t ngx_iocp_io = {
     ngx_overlapped_wsarecv,
     NULL,
+    ngx_udp_overlapped_wsarecv,
     NULL,
     ngx_overlapped_wsasend_chain,
     0
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -429,6 +429,7 @@ extern ngx_os_io_t  ngx_io;
 
 #define ngx_recv             ngx_io.recv
 #define ngx_recv_chain       ngx_io.recv_chain
+#define ngx_udp_recv         ngx_io.udp_recv
 #define ngx_send             ngx_io.send
 #define ngx_send_chain       ngx_io.send_chain
 
--- a/src/os/unix/ngx_freebsd_init.c
+++ b/src/os/unix/ngx_freebsd_init.c
@@ -30,6 +30,7 @@ ngx_uint_t ngx_freebsd_use_tcp_nopush;
 static ngx_os_io_t ngx_freebsd_io = {
     ngx_unix_recv,
     ngx_readv_chain,
+    ngx_udp_unix_recv,
     ngx_unix_send,
 #if (NGX_HAVE_SENDFILE)
     ngx_freebsd_sendfile_chain,
--- a/src/os/unix/ngx_linux_init.c
+++ b/src/os/unix/ngx_linux_init.c
@@ -17,6 +17,7 @@ int   ngx_linux_rtsig_max;
 static ngx_os_io_t ngx_linux_io = {
     ngx_unix_recv,
     ngx_readv_chain,
+    ngx_udp_unix_recv,
     ngx_unix_send,
 #if (NGX_HAVE_SENDFILE)
     ngx_linux_sendfile_chain,
--- a/src/os/unix/ngx_os.h
+++ b/src/os/unix/ngx_os.h
@@ -25,6 +25,7 @@ typedef ngx_chain_t *(*ngx_send_chain_pt
 typedef struct {
     ngx_recv_pt        recv;
     ngx_recv_chain_pt  recv_chain;
+    ngx_recv_pt        udp_recv;
     ngx_send_pt        send;
     ngx_send_chain_pt  send_chain;
     ngx_uint_t         flags;
@@ -41,6 +42,7 @@ ngx_int_t ngx_daemon(ngx_log_t *log);
 
 ssize_t ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size);
 ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *entry);
+ssize_t ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size);
 ssize_t ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size);
 ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in,
     off_t limit);
--- a/src/os/unix/ngx_posix_init.c
+++ b/src/os/unix/ngx_posix_init.c
@@ -21,6 +21,7 @@ struct rlimit  rlmt;
 ngx_os_io_t ngx_os_io = {
     ngx_unix_recv,
     ngx_readv_chain,
+    ngx_udp_unix_recv,
     NULL,
     ngx_writev_chain,
     0
--- a/src/os/unix/ngx_solaris_init.c
+++ b/src/os/unix/ngx_solaris_init.c
@@ -16,6 +16,7 @@ char ngx_solaris_version[50];
 static ngx_os_io_t ngx_solaris_io = {
     ngx_unix_recv,
     ngx_readv_chain,
+    ngx_udp_unix_recv,
     ngx_unix_send,
 #if (NGX_HAVE_SENDFILE)
     ngx_solaris_sendfilev_chain,
copy from src/os/unix/ngx_recv.c
copy to src/os/unix/ngx_udp_recv.c
--- a/src/os/unix/ngx_recv.c
+++ b/src/os/unix/ngx_udp_recv.c
@@ -12,7 +12,7 @@
 #if (NGX_HAVE_KQUEUE)
 
 ssize_t
-ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)
+ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)
 {
     ssize_t       n;
     ngx_err_t     err;
@@ -20,32 +20,6 @@ ngx_unix_recv(ngx_connection_t *c, u_cha
 
     rev = c->read;
 
-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                       "recv: eof:%d, avail:%d, err:%d",
-                       rev->pending_eof, rev->available, rev->kq_errno);
-
-        if (rev->available == 0) {
-            if (rev->pending_eof) {
-                rev->ready = 0;
-                rev->eof = 1;
-
-                if (rev->kq_errno) {
-                    rev->error = 1;
-                    ngx_set_socket_errno(rev->kq_errno);
-
-                    return ngx_connection_error(c, rev->kq_errno,
-                               "kevent() reported about an closed connection");
-                }
-
-                return 0;
-
-            } else {
-                return NGX_AGAIN;
-            }
-        }
-    }
-
     do {
         n = recv(c->fd, buf, size, 0);
 
@@ -62,35 +36,9 @@ ngx_unix_recv(ngx_connection_t *c, u_cha
                  */
 
                 if (rev->available <= 0) {
-                    if (!rev->pending_eof) {
-                        rev->ready = 0;
-                    }
-
-                    if (rev->available < 0) {
-                        rev->available = 0;
-                    }
-                }
-
-                if (n == 0) {
-
-                    /*
-                     * on FreeBSD recv() may return 0 on closed socket
-                     * even if kqueue reported about available data
-                     */
-
-                    rev->eof = 1;
+                    rev->ready = 0;
                     rev->available = 0;
                 }
-
-                return n;
-            }
-
-            if ((size_t) n < size) {
-                rev->ready = 0;
-            }
-
-            if (n == 0) {
-                rev->eof = 1;
             }
 
             return n;
@@ -122,7 +70,7 @@ ngx_unix_recv(ngx_connection_t *c, u_cha
 #else /* ! NGX_HAVE_KQUEUE */
 
 ssize_t
-ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)
+ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)
 {
     ssize_t       n;
     ngx_err_t     err;
@@ -136,19 +84,7 @@ ngx_unix_recv(ngx_connection_t *c, u_cha
         ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
                        "recv: fd:%d %d of %d", c->fd, n, size);
 
-        if (n == 0) {
-            rev->ready = 0;
-            rev->eof = 1;
-            return n;
-
-        } else if (n > 0) {
-
-            if ((size_t) n < size
-                && !(ngx_event_flags & NGX_USE_GREEDY_EVENT))
-            {
-                rev->ready = 0;
-            }
-
+        if (n >= 0) {
             return n;
         }
 
--- a/src/os/win32/ngx_os.h
+++ b/src/os/win32/ngx_os.h
@@ -20,11 +20,12 @@ typedef ssize_t (*ngx_recv_pt)(ngx_conne
 typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in);
 typedef ssize_t (*ngx_send_pt)(ngx_connection_t *c, u_char *buf, size_t size);
 typedef ngx_chain_t *(*ngx_send_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,
-                                          off_t limit);
+    off_t limit);
 
 typedef struct {
     ngx_recv_pt        recv;
     ngx_recv_chain_pt  recv_chain;
+    ngx_recv_pt        udp_recv;
     ngx_send_pt        send;
     ngx_send_chain_pt  send_chain;
     ngx_uint_t         flags;
@@ -36,11 +37,14 @@ void ngx_os_status(ngx_log_t *log);
 
 ssize_t ngx_wsarecv(ngx_connection_t *c, u_char *buf, size_t size);
 ssize_t ngx_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size);
+ssize_t ngx_udp_wsarecv(ngx_connection_t *c, u_char *buf, size_t size);
+ssize_t ngx_udp_overlapped_wsarecv(ngx_connection_t *c, u_char *buf,
+    size_t size);
 ssize_t ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain);
 ngx_chain_t *ngx_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in,
-                               off_t limit);
+    off_t limit);
 ngx_chain_t *ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in,
-                                          off_t limit);
+    off_t limit);
 
 
 extern ngx_os_io_t  ngx_os_io;
copy from src/os/win32/ngx_wsarecv.c
copy to src/os/win32/ngx_udp_wsarecv.c
--- a/src/os/win32/ngx_wsarecv.c
+++ b/src/os/win32/ngx_udp_wsarecv.c
@@ -10,7 +10,7 @@
 
 
 ssize_t
-ngx_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)
+ngx_udp_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)
 {
     int           rc;
     u_long        bytes, flags;
@@ -46,20 +46,12 @@ ngx_wsarecv(ngx_connection_t *c, u_char 
         return NGX_ERROR;
     }
 
-    if (bytes < size) {
-        rev->ready = 0;
-    }
-
-    if (bytes == 0) {
-        rev->eof = 1;
-    }
-
     return bytes;
 }
 
 
 ssize_t
-ngx_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)
+ngx_udp_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)
 {
     int               rc;
     u_long            bytes, flags;
@@ -148,14 +140,6 @@ ngx_overlapped_wsarecv(ngx_connection_t 
         return NGX_AGAIN;
     }
 
-    if (bytes == 0) {
-        rev->eof = 1;
-        rev->ready = 0;
-
-    } else {
-        rev->ready = 1;
-    }
-
     rev->active = 0;
 
     return bytes;
--- a/src/os/win32/ngx_win32_init.c
+++ b/src/os/win32/ngx_win32_init.c
@@ -22,6 +22,7 @@ ngx_fd_t    ngx_stderr_fileno;
 ngx_os_io_t ngx_os_io = {
     ngx_wsarecv,
     ngx_wsarecv_chain,
+    ngx_udp_wsarecv,
     NULL,
     ngx_wsasend_chain,
     0