comparison src/os/unix/ngx_writev_chain.c @ 257:70e1c7d2b83d

nginx-0.0.2-2004-02-11-20:08:49 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 11 Feb 2004 17:08:49 +0000
parents 34995c5ec6c4
children 87e73f067470
comparison
equal deleted inserted replaced
256:8e39cab6abd5 257:70e1c7d2b83d
19 wev = c->write; 19 wev = c->write;
20 20
21 if (!wev->ready) { 21 if (!wev->ready) {
22 return in; 22 return in;
23 } 23 }
24
25 #if (HAVE_KQUEUE)
26
27 if ((ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) && wev->kq_eof) {
28 ngx_log_error(NGX_LOG_INFO, c->log, wev->kq_errno,
29 "kevent() reported about an closed connection");
30
31 wev->error = 1;
32 return NGX_CHAIN_ERROR;
33 }
34
35 #endif
24 36
25 ngx_init_array(io, c->pool, 10, sizeof(struct iovec), NGX_CHAIN_ERROR); 37 ngx_init_array(io, c->pool, 10, sizeof(struct iovec), NGX_CHAIN_ERROR);
26 38
27 do { 39 do {
28 prev = NULL; 40 prev = NULL;
47 59
48 n = writev(c->fd, io.elts, io.nelts); 60 n = writev(c->fd, io.elts, io.nelts);
49 61
50 if (n == -1) { 62 if (n == -1) {
51 err = ngx_errno; 63 err = ngx_errno;
52 if (err == NGX_EAGAIN) {
53 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN");
54 64
55 } else if (err == NGX_EINTR) { 65 if (err == NGX_EAGAIN || err == NGX_EINTR) {
56 eintr = 1; 66 if (err == NGX_EINTR) {
57 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR"); 67 eintr = 1;
68 }
69
70 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
71 "writev() not ready");
58 72
59 } else { 73 } else {
60 wev->error = 1; 74 wev->error = 1;
61 ngx_log_error(NGX_LOG_CRIT, c->log, err, "writev() failed"); 75 ngx_connection_error(c, err, "writev() failed");
62 return NGX_CHAIN_ERROR; 76 return NGX_CHAIN_ERROR;
63 } 77 }
64 } 78 }
65 79
66 sent = n > 0 ? n : 0; 80 sent = n > 0 ? n : 0;
67 81
68 #if (NGX_DEBUG_WRITE_CHAIN) 82 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
69 ngx_log_debug(c->log, "writev: " OFF_T_FMT _ sent); 83 "writev: " OFF_T_FMT, sent);
70 #endif
71 84
72 c->sent += sent; 85 c->sent += sent;
73 86
74 for (cl = in; cl && sent > 0; cl = cl->next) { 87 for (cl = in; cl && sent > 0; cl = cl->next) {
75 88
76 size = cl->hunk->last - cl->hunk->pos; 89 size = cl->hunk->last - cl->hunk->pos;
77
78 ngx_log_debug(c->log, "SIZE: %d" _ size);
79 90
80 if (sent >= size) { 91 if (sent >= size) {
81 sent -= size; 92 sent -= size;
82 93
83 if (cl->hunk->type & NGX_HUNK_IN_MEMORY) { 94 if (cl->hunk->type & NGX_HUNK_IN_MEMORY) {