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