Mercurial > hg > nginx-vendor-0-6
comparison src/os/unix/ngx_writev_chain.c @ 22:8b6db3bda591 NGINX_0_1_11
nginx 0.1.11
*) Feature: the worker_priority directive.
*) Change: both tcp_nopush and tcp_nodelay directives affect the
transferred response.
*) Bugfix: nginx did not call initgroups().
Thanks to Andrew Sitnikov and Andrei Nigmatulin.
*) Change: now the ngx_http_autoindex_module shows the file size in the
bytes.
*) Bugfix: the ngx_http_autoindex_module returned the 500 error if the
broken symlink was in a directory.
*) Bugfix: the files bigger than 4G could not be transferred using
sendfile.
*) Bugfix: if the backend was resolved to several backends and there
was an error while the response waiting then process may got caught
in an endless loop.
*) Bugfix: the worker process may exit with the "unknown cycle" message
when the /dev/poll method was used.
*) Bugfix: "close() channel failed" errors.
*) Bugfix: the autodetection of the "nobody" and "nogroup" groups.
*) Bugfix: the send_lowat directive did not work on Linux.
*) Bugfix: the segmentation fault occurred if there was no events
section in configuration.
*) Bugfix: nginx could not be built on OpenBSD.
*) Bugfix: the double slashes in "://" in the URI were converted to
":/".
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Thu, 02 Dec 2004 00:00:00 +0300 |
parents | 6f8b0dc0f8dd |
children | 45fe5b98a9de |
comparison
equal
deleted
inserted
replaced
21:4eeb9cfef970 | 22:8b6db3bda591 |
---|---|
14 | 14 |
15 ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) | 15 ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) |
16 { | 16 { |
17 u_char *prev; | 17 u_char *prev; |
18 ssize_t n, size, sent; | 18 ssize_t n, size, sent; |
19 off_t send, sprev; | 19 off_t send, prev_send; |
20 ngx_uint_t eintr, complete; | 20 ngx_uint_t eintr, complete; |
21 ngx_err_t err; | 21 ngx_err_t err; |
22 ngx_array_t vec; | 22 ngx_array_t vec; |
23 ngx_chain_t *cl; | 23 ngx_chain_t *cl; |
24 ngx_event_t *wev; | 24 ngx_event_t *wev; |
40 return NGX_CHAIN_ERROR; | 40 return NGX_CHAIN_ERROR; |
41 } | 41 } |
42 | 42 |
43 #endif | 43 #endif |
44 | 44 |
45 /* the maximum limit size is the maximum size_t value - the page size */ | |
46 | |
47 if (limit == 0 || limit > MAX_SIZE_T_VALUE - ngx_pagesize) { | |
48 limit = MAX_SIZE_T_VALUE - ngx_pagesize; | |
49 } | |
50 | |
45 send = 0; | 51 send = 0; |
46 complete = 0; | 52 complete = 0; |
47 | 53 |
48 vec.elts = iovs; | 54 vec.elts = iovs; |
49 vec.size = sizeof(struct iovec); | 55 vec.size = sizeof(struct iovec); |
52 | 58 |
53 for ( ;; ) { | 59 for ( ;; ) { |
54 prev = NULL; | 60 prev = NULL; |
55 iov = NULL; | 61 iov = NULL; |
56 eintr = 0; | 62 eintr = 0; |
57 sprev = send; | 63 prev_send = send; |
58 | 64 |
59 vec.nelts = 0; | 65 vec.nelts = 0; |
60 | 66 |
61 /* create the iovec and coalesce the neighbouring bufs */ | 67 /* create the iovec and coalesce the neighbouring bufs */ |
62 | 68 |
116 | 122 |
117 sent = n > 0 ? n : 0; | 123 sent = n > 0 ? n : 0; |
118 | 124 |
119 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "writev: %z", sent); | 125 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "writev: %z", sent); |
120 | 126 |
121 if (send - sprev == sent) { | 127 if (send - prev_send == sent) { |
122 complete = 1; | 128 complete = 1; |
123 } | 129 } |
124 | 130 |
125 c->sent += sent; | 131 c->sent += sent; |
126 | 132 |