diff options
Diffstat (limited to 'src/os')
42 files changed, 1025 insertions, 519 deletions
diff --git a/src/os/unix/ngx_aio_write_chain.c b/src/os/unix/ngx_aio_write_chain.c index b8c13356c..4d45f079a 100644 --- a/src/os/unix/ngx_aio_write_chain.c +++ b/src/os/unix/ngx_aio_write_chain.c @@ -13,11 +13,10 @@ ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) { - int n; u_char *buf, *prev; off_t send, sent; size_t len; - ssize_t size; + ssize_t n, size; ngx_err_t err; ngx_chain_t *cl; @@ -63,7 +62,7 @@ ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in, n = ngx_aio_write(c, buf, len); - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_write: %d", n); + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_write: %z", n); if (n == NGX_ERROR) { return NGX_CHAIN_ERROR; @@ -75,7 +74,7 @@ ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in, } ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "aio_write sent: " OFF_T_FMT, c->sent); + "aio_write sent: %O", c->sent); for (cl = in; cl; cl = cl->next) { diff --git a/src/os/unix/ngx_alloc.c b/src/os/unix/ngx_alloc.c index dc3609206..7ec4f87c3 100644 --- a/src/os/unix/ngx_alloc.c +++ b/src/os/unix/ngx_alloc.c @@ -17,11 +17,10 @@ void *ngx_alloc(size_t size, ngx_log_t *log) if (!(p = malloc(size))) { ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "malloc() " SIZE_T_FMT " bytes failed", size); + "malloc() %uz bytes failed", size); } - ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, - "malloc: " PTR_FMT ":" SIZE_T_FMT, p, size); + ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size); return p; } @@ -49,12 +48,12 @@ void *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log) if (posix_memalign(&p, alignment, size) == -1) { ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "posix_memalign() " SIZE_T_FMT " bytes aligned to " - SIZE_T_FMT " failed", size, alignment); + "posix_memalign() %uz bytes aligned to %uz failed", + size, alignment); } ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, - "posix_memalign: " PTR_FMT ":" SIZE_T_FMT, p, size); + "posix_memalign: %p:%uz", p, size); return p; } @@ -67,12 +66,12 @@ void *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log) if (!(p = memalign(alignment, size))) { ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "memalign() " SIZE_T_FMT " bytes aligned to " - SIZE_T_FMT " failed", size, alignment); + "memalign() %uz bytes aligned to %uz failed", + size, alignment); } ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, - "memalign: " PTR_FMT ":" SIZE_T_FMT, p, size); + "memalign: %p:%uz", p, size); return p; } diff --git a/src/os/unix/ngx_channel.c b/src/os/unix/ngx_channel.c index 3d09d68bb..5c5a5e10b 100644 --- a/src/os/unix/ngx_channel.c +++ b/src/os/unix/ngx_channel.c @@ -120,9 +120,14 @@ ngx_int_t ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, return NGX_ERROR; } + if (n == 0) { + ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "recvmsg() returned zero"); + return NGX_ERROR; + } + if ((size_t) n < sizeof(ngx_channel_t)) { ngx_log_error(NGX_LOG_ALERT, log, 0, - "recvmsg() returned not enough data"); + "recvmsg() returned not enough data: %uz", n); return NGX_ERROR; } diff --git a/src/os/unix/ngx_errno.c b/src/os/unix/ngx_errno.c index 0c93d23a1..ced0eafcb 100644 --- a/src/os/unix/ngx_errno.c +++ b/src/os/unix/ngx_errno.c @@ -10,32 +10,29 @@ #if (NGX_STRERROR_R) -ngx_int_t ngx_strerror_r(int err, char *errstr, size_t size) +u_char *ngx_strerror_r(int err, u_char *errstr, size_t size) { - size_t len; - if (size == 0) { return 0; } errstr[0] = '\0'; - strerror_r(err, errstr, size); + strerror_r(err, (char *) errstr, size); - for (len = 0; len < size; len++) { - if (errstr[len] == '\0') { - break; - } + while (*errstr && size) { + errstr++; + size--; } - return len; + return errstr; } #elif (NGX_GNU_STRERROR_R) /* Linux strerror_r() */ -ngx_int_t ngx_strerror_r(int err, char *errstr, size_t size) +u_char *ngx_strerror_r(int err, u_char *errstr, size_t size) { char *str; size_t len; @@ -46,20 +43,18 @@ ngx_int_t ngx_strerror_r(int err, char *errstr, size_t size) errstr[0] = '\0'; - str = strerror_r(err, errstr, size); + str = strerror_r(err, (char *) errstr, size); - if (str != errstr) { - return ngx_cpystrn((u_char *) errstr, (u_char *) str, size) - - (u_char *) errstr; + if (str != (char *) errstr) { + return ngx_cpystrn(errstr, (u_char *) str, size); } - for (len = 0; len < size; len++) { - if (errstr[len] == '\0') { - break; - } + while (*errstr && size) { + errstr++; + size--; } - return len; + return errstr; } #endif diff --git a/src/os/unix/ngx_errno.h b/src/os/unix/ngx_errno.h index cc9b1d19f..9a392f822 100644 --- a/src/os/unix/ngx_errno.h +++ b/src/os/unix/ngx_errno.h @@ -47,14 +47,14 @@ typedef int ngx_err_t; #if (HAVE_STRERROR_R || HAVE_GNU_STRERROR_R) -ngx_int_t ngx_strerror_r(int err, char *errstr, size_t size); +u_char *ngx_strerror_r(int err, u_char *errstr, size_t size); #else /* Solaris has threads-safe strerror() */ #define ngx_strerror_r(err, errstr, size) \ - (char *) ngx_cpystrn(errstr, strerror(err), size) - (errstr) + ngx_cpystrn(errstr, (u_char *) strerror(err), size) #endif diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c index da75ba022..7bf5ad124 100644 --- a/src/os/unix/ngx_files.c +++ b/src/os/unix/ngx_files.c @@ -13,7 +13,7 @@ ssize_t ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) ssize_t n; ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, - "read: %d, %X, %d, " OFF_T_FMT, file->fd, buf, size, offset); + "read: %d, %p, %uz, %O", file->fd, buf, size, offset); #if (NGX_PREAD) @@ -57,6 +57,9 @@ ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) { ssize_t n; + ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, + "write: %d, %p, %uz, %O", file->fd, buf, size, offset); + #if (NGX_PWRITE) n = pwrite(file->fd, buf, size, offset); @@ -68,7 +71,7 @@ ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) if ((size_t) n != size) { ngx_log_error(NGX_LOG_CRIT, file->log, 0, - "pwrite() has written only %d of %d", n, size); + "pwrite() has written only %z of %uz", n, size); return NGX_ERROR; } @@ -92,7 +95,7 @@ ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) if ((size_t) n != size) { ngx_log_error(NGX_LOG_CRIT, file->log, 0, - "write() has written only %d of %d", n, size); + "write() has written only %z of %uz", n, size); return NGX_ERROR; } @@ -120,17 +123,19 @@ int ngx_open_tempfile(u_char *name, ngx_uint_t persistent) } +#define NGX_IOVS 8 + ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset, ngx_pool_t *pool) { u_char *prev; size_t size; ssize_t n; - struct iovec *iov; ngx_err_t err; - ngx_array_t io; + ngx_array_t vec; + struct iovec *iov, iovs[NGX_IOVS]; - /* use pwrite() if there's the only buf in a chain */ + /* use pwrite() if there is the only buf in a chain */ if (cl->next == NULL) { return ngx_write_file(file, cl->buf->pos, @@ -138,61 +143,74 @@ ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, offset); } - prev = NULL; - iov = NULL; - size = 0; + vec.elts = iovs; + vec.size = sizeof(struct iovec); + vec.nalloc = NGX_IOVS; + vec.pool = pool; + + do { + prev = NULL; + iov = NULL; + size = 0; - ngx_init_array(io, pool, 10, sizeof(struct iovec), NGX_ERROR); + vec.nelts = 0; - /* create the iovec and coalesce the neighbouring bufs */ + /* create the iovec and coalesce the neighbouring bufs */ - while (cl) { - if (prev == cl->buf->pos) { - iov->iov_len += cl->buf->last - cl->buf->pos; + while (cl && vec.nelts < IOV_MAX) { + if (prev == cl->buf->pos) { + iov->iov_len += cl->buf->last - cl->buf->pos; - } else { - ngx_test_null(iov, ngx_push_array(&io), NGX_ERROR); - iov->iov_base = (void *) cl->buf->pos; - iov->iov_len = cl->buf->last - cl->buf->pos; + } else { + if (!(iov = ngx_array_push(&vec))) { + return NGX_ERROR; + } + + iov->iov_base = (void *) cl->buf->pos; + iov->iov_len = cl->buf->last - cl->buf->pos; + } + + size += cl->buf->last - cl->buf->pos; + prev = cl->buf->last; + cl = cl->next; } - size += cl->buf->last - cl->buf->pos; - prev = cl->buf->last; - cl = cl->next; - } + /* use pwrite() if there is the only iovec buffer */ - /* use pwrite() if there's the only iovec buffer */ + if (vec.nelts == 1) { + iov = vec.elts; + return ngx_write_file(file, (u_char *) iov[0].iov_base, + iov[0].iov_len, offset); + } - if (io.nelts == 1) { - iov = io.elts; - return ngx_write_file(file, (u_char *) iov[0].iov_base, iov[0].iov_len, - offset); - } + if (file->sys_offset != offset) { + if (lseek(file->fd, offset, SEEK_SET) == -1) { + ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, + "lseek() failed"); + return NGX_ERROR; + } - if (file->sys_offset != offset) { - if (lseek(file->fd, offset, SEEK_SET) == -1) { - ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed"); - return NGX_ERROR; + file->sys_offset = offset; } - file->sys_offset = offset; - } + n = writev(file->fd, vec.elts, vec.nelts); - n = writev(file->fd, io.elts, io.nelts); + if (n == -1) { + ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, + "writev() failed"); + return NGX_ERROR; + } - if (n == -1) { - ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "writev() failed"); - return NGX_ERROR; - } + if ((size_t) n != size) { + ngx_log_error(NGX_LOG_CRIT, file->log, 0, + "writev() has written only %z of %uz", n, size); + return NGX_ERROR; + } - if ((size_t) n != size) { - ngx_log_error(NGX_LOG_CRIT, file->log, 0, - "writev() has written only %d of %d", n, size); - return NGX_ERROR; - } + file->sys_offset += n; + file->offset += n; - file->sys_offset += n; - file->offset += n; + } while (cl); return n; } diff --git a/src/os/unix/ngx_freebsd_init.c b/src/os/unix/ngx_freebsd_init.c index 39a057be9..faf8e9f1e 100644 --- a/src/os/unix/ngx_freebsd_init.c +++ b/src/os/unix/ngx_freebsd_init.c @@ -9,8 +9,8 @@ /* FreeBSD 3.0 at least */ -char ngx_freebsd_kern_ostype[20]; -char ngx_freebsd_kern_osrelease[20]; +char ngx_freebsd_kern_ostype[16]; +char ngx_freebsd_kern_osrelease[128]; int ngx_freebsd_kern_osreldate; int ngx_freebsd_hw_ncpu; int ngx_freebsd_net_inet_tcp_sendspace; @@ -95,7 +95,12 @@ ngx_int_t ngx_os_init(ngx_log_t *log) ngx_freebsd_kern_ostype, &size, NULL, 0) == -1) { ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "sysctlbyname(kern.ostype) failed"); - return NGX_ERROR; + + if (ngx_errno != NGX_ENOMEM) { + return NGX_ERROR; + } + + ngx_freebsd_kern_ostype[size - 1] = '\0'; } size = sizeof(ngx_freebsd_kern_osrelease); @@ -103,7 +108,12 @@ ngx_int_t ngx_os_init(ngx_log_t *log) ngx_freebsd_kern_osrelease, &size, NULL, 0) == -1) { ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "sysctlbyname(kern.osrelease) failed"); - return NGX_ERROR; + + if (ngx_errno != NGX_ENOMEM) { + return NGX_ERROR; + } + + ngx_freebsd_kern_osrelease[size - 1] = '\0'; } diff --git a/src/os/unix/ngx_freebsd_rfork_thread.c b/src/os/unix/ngx_freebsd_rfork_thread.c index 774adb938..b64325bcd 100644 --- a/src/os/unix/ngx_freebsd_rfork_thread.c +++ b/src/os/unix/ngx_freebsd_rfork_thread.c @@ -21,9 +21,10 @@ * The SysV semop() is a cheap syscall, particularly if it has little sembuf's * and does not use SEM_UNDO. * - * The condition variable implementation uses signal #64. The signal handler - * is SIG_IGN so the kill() is a cheap syscall. The thread waits a signal - * in kevent(). The use of the EVFILT_SIGNAL is safe since FreeBSD 4.7. + * The condition variable implementation uses the signal #64. + * The signal handler is SIG_IGN so the kill() is a cheap syscall. + * The thread waits a signal in kevent(). The use of the EVFILT_SIGNAL + * is safe since FreeBSD 4.10-STABLE. * * This threads implementation currently works on i386 (486+) and amd64 * platforms only. @@ -114,15 +115,16 @@ void _spinunlock(ngx_atomic_t *lock) #endif -int ngx_create_thread(ngx_tid_t *tid, void* (*func)(void *arg), void *arg, - ngx_log_t *log) +ngx_err_t ngx_create_thread(ngx_tid_t *tid, void* (*func)(void *arg), void *arg, + ngx_log_t *log) { - int id, err; - char *stack, *stack_top; + ngx_pid_t id; + ngx_err_t err; + char *stack, *stack_top; if (nthreads >= max_threads) { ngx_log_error(NGX_LOG_CRIT, log, 0, - "no more than %d threads can be created", max_threads); + "no more than %ui threads can be created", max_threads); return NGX_ERROR; } @@ -133,20 +135,21 @@ int ngx_create_thread(ngx_tid_t *tid, void* (*func)(void *arg), void *arg, if (stack == MAP_FAILED) { ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "mmap(" PTR_FMT ":" SIZE_T_FMT - ", MAP_STACK) thread stack failed", + "mmap(%p:%uz, MAP_STACK) thread stack failed", last_stack, usable_stack_size); return NGX_ERROR; } if (stack != last_stack) { - ngx_log_error(NGX_LOG_ALERT, log, 0, "stack address was changed"); + ngx_log_error(NGX_LOG_ALERT, log, 0, + "stack %p address was changed to %p", last_stack, stack); + return NGX_ERROR; } stack_top = stack + usable_stack_size; ngx_log_debug2(NGX_LOG_DEBUG_CORE, log, 0, - "thread stack: " PTR_FMT "-" PTR_FMT, stack, stack_top); + "thread stack: %p-%p", stack, stack_top); ngx_set_errno(0); @@ -164,7 +167,7 @@ int ngx_create_thread(ngx_tid_t *tid, void* (*func)(void *arg), void *arg, / ngx_thread_stack_size; tids[nthreads] = id; - ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "rfork()ed thread: %d", id); + ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "rfork()ed thread: %P", id); } return err; @@ -205,30 +208,30 @@ ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle) red_zone = ngx_freebsd_kern_usrstack - (size + rz_size); ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "usrstack: " PTR_FMT " red zone: " PTR_FMT, + "usrstack: %p red zone: %p", ngx_freebsd_kern_usrstack, red_zone); zone = mmap(red_zone, rz_size, PROT_NONE, MAP_ANON, -1, 0); if (zone == MAP_FAILED) { ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "mmap(" PTR_FMT ":" SIZE_T_FMT - ", PROT_NONE, MAP_ANON) red zone failed", + "mmap(%p:%uz, PROT_NONE, MAP_ANON) red zone failed", red_zone, rz_size); return NGX_ERROR; } if (zone != red_zone) { ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "red zone address was changed"); + "red zone %p address was changed to %p", red_zone, zone); + return NGX_ERROR; } - /* create the threads errno's array */ + /* create the thread errno' array */ if (!(errnos = ngx_calloc(n * sizeof(int), cycle->log))) { return NGX_ERROR; } - /* create the threads tids array */ + /* create the thread tids array */ if (!(tids = ngx_calloc((n + 1) * sizeof(ngx_tid_t), cycle->log))) { return NGX_ERROR; @@ -236,7 +239,7 @@ ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle) tids[0] = ngx_pid; - /* create the threads tls's array */ + /* create the thread tls' array */ ngx_tls = ngx_calloc(NGX_THREAD_KEYS_MAX * (n + 1) * sizeof(void *), cycle->log); @@ -274,7 +277,7 @@ ngx_tid_t ngx_thread_self() } -ngx_int_t ngx_thread_key_create(ngx_tls_key_t *key) +ngx_err_t ngx_thread_key_create(ngx_tls_key_t *key) { if (nkeys >= NGX_THREAD_KEYS_MAX) { return NGX_ENOMEM; @@ -286,7 +289,7 @@ ngx_int_t ngx_thread_key_create(ngx_tls_key_t *key) } -ngx_int_t ngx_thread_set_tls(ngx_tls_key_t key, void *value) +ngx_err_t ngx_thread_set_tls(ngx_tls_key_t key, void *value) { if (key >= NGX_THREAD_KEYS_MAX) { return NGX_EINVAL; @@ -297,7 +300,7 @@ ngx_int_t ngx_thread_set_tls(ngx_tls_key_t key, void *value) } -ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, uint flags) +ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags) { ngx_mutex_t *m; union semun op; @@ -361,10 +364,10 @@ ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try) #if (NGX_DEBUG) if (try) { ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "try lock mutex " PTR_FMT " lock:%X", m, m->lock); + "try lock mutex %p lock:%XD", m, m->lock); } else { ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "lock mutex " PTR_FMT " lock:%X", m, m->lock); + "lock mutex %p lock:%XD", m, m->lock); } #endif @@ -395,7 +398,7 @@ ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try) } ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "mutex " PTR_FMT " lock:%X", m, m->lock); + "mutex %p lock:%XD", m, m->lock); /* * The mutex is locked so we increase a number @@ -406,8 +409,8 @@ ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try) if ((lock & ~NGX_MUTEX_LOCK_BUSY) > nthreads) { ngx_log_error(NGX_LOG_ALERT, m->log, ngx_errno, - "%d threads wait for mutex " PTR_FMT - ", while only %d threads are available", + "%D threads wait for mutex %p, " + "while only %ui threads are available", lock & ~NGX_MUTEX_LOCK_BUSY, m, nthreads); return NGX_ERROR; } @@ -415,7 +418,7 @@ ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try) if (ngx_atomic_cmp_set(&m->lock, old, lock)) { ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "wait mutex " PTR_FMT " lock:%X", m, m->lock); + "wait mutex %p lock:%XD", m, m->lock); /* * The number of the waiting threads has been increased @@ -430,14 +433,12 @@ ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try) if (semop(m->semid, &op, 1) == -1) { ngx_log_error(NGX_LOG_ALERT, m->log, ngx_errno, - "semop() failed while waiting " - "on mutex " PTR_FMT, m); + "semop() failed while waiting on mutex %p", m); return NGX_ERROR; } ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "mutex waked up " PTR_FMT " lock:%X", - m, m->lock); + "mutex waked up %p lock:%XD", m, m->lock); tries = 0; old = m->lock; @@ -462,7 +463,7 @@ ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try) if (tries++ > 1000) { ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "mutex " PTR_FMT " is contested", m); + "mutex %p is contested", m); /* the mutex is probably contested so we are giving up now */ @@ -474,7 +475,7 @@ ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try) } ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "mutex " PTR_FMT " is locked, lock:%X", m, m->lock); + "mutex %p is locked, lock:%XD", m, m->lock); return NGX_OK; } @@ -493,7 +494,7 @@ ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m) if (!(old & NGX_MUTEX_LOCK_BUSY)) { ngx_log_error(NGX_LOG_ALERT, m->log, 0, - "trying to unlock the free mutex " PTR_FMT, m); + "trying to unlock the free mutex %p", m); return NGX_ERROR; } @@ -501,7 +502,7 @@ ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m) #if 0 ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "unlock mutex " PTR_FMT " lock:%X", m, old); + "unlock mutex %p lock:%XD", m, old); #endif for ( ;; ) { @@ -516,7 +517,7 @@ ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m) if (m->semid == -1) { ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "mutex " PTR_FMT " is unlocked", m); + "mutex %p is unlocked", m); return NGX_OK; } @@ -546,7 +547,7 @@ ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m) /* wake up the thread that waits on semaphore */ ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "wake up mutex " PTR_FMT "", m); + "wake up mutex %p", m); op.sem_num = 0; op.sem_op = 1; @@ -554,8 +555,7 @@ ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m) if (semop(m->semid, &op, 1) == -1) { ngx_log_error(NGX_LOG_ALERT, m->log, ngx_errno, - "semop() failed while waking up on mutex " - PTR_FMT, m); + "semop() failed while waking up on mutex %p", m); return NGX_ERROR; } @@ -566,7 +566,7 @@ ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m) } ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "mutex " PTR_FMT " is unlocked", m); + "mutex %p is unlocked", m); return NGX_OK; } @@ -647,21 +647,20 @@ ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m) } ngx_log_debug3(NGX_LOG_DEBUG_CORE, cv->log, 0, - "cv " PTR_FMT " wait, kq:%d, signo:%d", - cv, cv->kq, cv->signo); + "cv %p wait, kq:%d, signo:%d", cv, cv->kq, cv->signo); for ( ;; ) { n = kevent(cv->kq, NULL, 0, &kev, 1, NULL); ngx_log_debug2(NGX_LOG_DEBUG_CORE, cv->log, 0, - "cv " PTR_FMT " kevent: %d", cv, n); + "cv %p kevent: %d", cv, n); if (n == -1) { err = ngx_errno; ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, cv->log, ngx_errno, - "kevent() failed while waiting condition variable " - PTR_FMT, cv); + "kevent() failed while waiting condition variable %p", + cv); if (err == NGX_EINTR) { break; @@ -673,7 +672,7 @@ ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m) if (n == 0) { ngx_log_error(NGX_LOG_ALERT, cv->log, 0, "kevent() returned no events " - "while waiting condition variable " PTR_FMT, + "while waiting condition variable %p", cv); continue; } @@ -681,7 +680,7 @@ ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m) if (kev.filter != EVFILT_SIGNAL) { ngx_log_error(NGX_LOG_ALERT, cv->log, 0, "kevent() returned unexpected events: %d " - "while waiting condition variable " PTR_FMT, + "while waiting condition variable %p", kev.filter, cv); continue; } @@ -689,7 +688,7 @@ ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m) if (kev.ident != (uintptr_t) cv->signo) { ngx_log_error(NGX_LOG_ALERT, cv->log, 0, "kevent() returned unexpected signal: %d ", - "while waiting condition variable " PTR_FMT, + "while waiting condition variable %p", kev.ident, cv); continue; } @@ -697,8 +696,7 @@ ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m) break; } - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, - "cv " PTR_FMT " is waked up", cv); + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p is waked up", cv); if (ngx_mutex_lock(m) == NGX_ERROR) { return NGX_ERROR; @@ -713,7 +711,7 @@ ngx_int_t ngx_cond_signal(ngx_cond_t *cv) ngx_err_t err; ngx_log_debug3(NGX_LOG_DEBUG_CORE, cv->log, 0, - "cv " PTR_FMT " to signal " PID_T_FMT " %d", + "cv %p to signal %P %d", cv, cv->tid, cv->signo); if (kill(cv->tid, cv->signo) == -1) { @@ -721,8 +719,7 @@ ngx_int_t ngx_cond_signal(ngx_cond_t *cv) err = ngx_errno; ngx_log_error(NGX_LOG_ALERT, cv->log, err, - "kill() failed while signaling condition variable " - PTR_FMT, cv); + "kill() failed while signaling condition variable %p", cv); if (err == NGX_ESRCH) { cv->tid = -1; @@ -731,8 +728,7 @@ ngx_int_t ngx_cond_signal(ngx_cond_t *cv) return NGX_ERROR; } - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, - "cv " PTR_FMT " is signaled", cv); + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p is signaled", cv); return NGX_OK; } diff --git a/src/os/unix/ngx_freebsd_rfork_thread.h b/src/os/unix/ngx_freebsd_rfork_thread.h index bef230a64..2af0adb80 100644 --- a/src/os/unix/ngx_freebsd_rfork_thread.h +++ b/src/os/unix/ngx_freebsd_rfork_thread.h @@ -18,7 +18,7 @@ typedef pid_t ngx_tid_t; #define ngx_log_pid ngx_thread_self() #define ngx_log_tid 0 -#define TID_T_FMT PID_T_FMT +#define NGX_TID_T_FMT "%P" #define NGX_MUTEX_LIGHT 1 @@ -91,10 +91,10 @@ typedef ngx_uint_t ngx_tls_key_t; extern void **ngx_tls; -ngx_int_t ngx_thread_key_create(ngx_tls_key_t *key); +ngx_err_t ngx_thread_key_create(ngx_tls_key_t *key); #define ngx_thread_key_create_n "the tls key creation" -ngx_int_t ngx_thread_set_tls(ngx_tls_key_t key, void *value); +ngx_err_t ngx_thread_set_tls(ngx_tls_key_t key, void *value); #define ngx_thread_set_tls_n "the tls key setting" diff --git a/src/os/unix/ngx_freebsd_sendfile_chain.c b/src/os/unix/ngx_freebsd_sendfile_chain.c index 8303c0631..192a1a1ee 100644 --- a/src/os/unix/ngx_freebsd_sendfile_chain.c +++ b/src/os/unix/ngx_freebsd_sendfile_chain.c @@ -265,7 +265,7 @@ ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, } ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, - "sendfile() sent only " OFF_T_FMT " bytes", + "sendfile() sent only %O bytes", sent); } else { @@ -290,14 +290,14 @@ ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, } ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "sendfile: %d, @" OFF_T_FMT " " OFF_T_FMT ":%d", + "sendfile: %d, @%O %O:%uz", rc, file->file_pos, sent, fsize + hsize); } else { rc = writev(c->fd, header.elts, header.nelts); ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "writev: %d of " SIZE_T_FMT, rc, hsize); + "writev: %d of %uz", rc, hsize); if (rc == -1) { err = ngx_errno; diff --git a/src/os/unix/ngx_linux_config.h b/src/os/unix/ngx_linux_config.h index 9a0fee9ba..fb2cbc892 100644 --- a/src/os/unix/ngx_linux_config.h +++ b/src/os/unix/ngx_linux_config.h @@ -44,6 +44,7 @@ #include <netdb.h> #include <time.h> /* tzset() */ +#include <malloc.h> /* memalign() */ #include <sys/ioctl.h> #include <sys/sysctl.h> diff --git a/src/os/unix/ngx_linux_sendfile_chain.c b/src/os/unix/ngx_linux_sendfile_chain.c index 4de7ac2cd..ad40f55d9 100644 --- a/src/os/unix/ngx_linux_sendfile_chain.c +++ b/src/os/unix/ngx_linux_sendfile_chain.c @@ -195,7 +195,7 @@ ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, sent = rc > 0 ? rc : 0; ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "sendfile: %d, @" OFF_T_FMT " %d:%d", + "sendfile: %d, @%O %z:%uz", rc, file->file_pos, sent, fsize); } else { @@ -221,7 +221,7 @@ ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, sent = rc > 0 ? rc : 0; - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "writev: %d", sent); + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "writev: %z", sent); } if (send - sprev == sent) { diff --git a/src/os/unix/ngx_posix_init.c b/src/os/unix/ngx_posix_init.c index 1c7b1b6c0..19d65a489 100644 --- a/src/os/unix/ngx_posix_init.c +++ b/src/os/unix/ngx_posix_init.c @@ -134,7 +134,7 @@ ngx_int_t ngx_posix_init(ngx_log_t *log) void ngx_posix_status(ngx_log_t *log) { ngx_log_error(NGX_LOG_INFO, log, 0, - "getrlimit(RLIMIT_NOFILE): " RLIM_T_FMT ":" RLIM_T_FMT, + "getrlimit(RLIMIT_NOFILE): %r:%r", rlmt.rlim_cur, rlmt.rlim_max); } diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c index 4f7ed6409..3141e1403 100644 --- a/src/os/unix/ngx_process.c +++ b/src/os/unix/ngx_process.c @@ -143,7 +143,7 @@ ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, } ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "spawn %s: " PID_T_FMT, name, pid); + "spawn %s: %P", name, pid); ngx_processes[s].pid = pid; ngx_processes[s].exited = 0; @@ -282,22 +282,40 @@ void ngx_process_get_status() if (WTERMSIG(status)) { ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "%s " PID_T_FMT " exited on signal %d%s", + "%s %P exited on signal %d%s", process, pid, WTERMSIG(status), WCOREDUMP(status) ? " (core dumped)" : ""); } else { ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, - "%s " PID_T_FMT " exited with code %d", + "%s %P exited with code %d", process, pid, WEXITSTATUS(status)); } if (WEXITSTATUS(status) == 2 && ngx_processes[i].respawn) { ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "%s " PID_T_FMT - " exited with fatal code %d and could not respawn", - process, pid, WEXITSTATUS(status)); + "%s %P exited with fatal code %d and could not respawn", + process, pid, WEXITSTATUS(status)); ngx_processes[i].respawn = 0; } } } + + +void ngx_debug_point() +{ + ngx_core_conf_t *ccf; + + ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx, + ngx_core_module); + + switch (ccf->debug_points) { + + case NGX_DEBUG_POINTS_STOP: + raise(SIGSTOP); + break; + + case NGX_DEBUG_POINTS_ABORT: + abort(); + } +} diff --git a/src/os/unix/ngx_process.h b/src/os/unix/ngx_process.h index 9cb0700d6..12703b3e3 100644 --- a/src/os/unix/ngx_process.h +++ b/src/os/unix/ngx_process.h @@ -53,6 +53,7 @@ ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn); ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx); void ngx_process_get_status(void); +void ngx_debug_point(void); #if (NGX_HAVE_SCHED_YIELD) diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c index 1da491526..0447bc4ec 100644 --- a/src/os/unix/ngx_process_cycle.c +++ b/src/os/unix/ngx_process_cycle.c @@ -322,11 +322,10 @@ static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, } ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "pass channel s:%d pid:" PID_T_FMT - " fd:%d to s:%d pid:" PID_T_FMT " fd:%d", - ch.slot, ch.pid, ch.fd, - i, ngx_processes[i].pid, - ngx_processes[i].channel[0]); + "pass channel s:%d pid:%P fd:%d to s:%i pid:%P fd:%d", + ch.slot, ch.pid, ch.fd, + i, ngx_processes[i].pid, + ngx_processes[i].channel[0]); /* TODO: NGX_AGAIN */ @@ -384,7 +383,7 @@ static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo) for (i = 0; i < ngx_last_process; i++) { ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "child: %d " PID_T_FMT " e:%d t:%d d:%d r:%d j:%d", + "child: %d %P e:%d t:%d d:%d r:%d j:%d", i, ngx_processes[i].pid, ngx_processes[i].exiting, @@ -421,13 +420,12 @@ static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo) } ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "kill (" PID_T_FMT ", %d)" , - ngx_processes[i].pid, signo); + "kill (%P, %d)" , ngx_processes[i].pid, signo); if (kill(ngx_processes[i].pid, signo) == -1) { err = ngx_errno; ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "kill(%d, %d) failed", + "kill(%P, %d) failed", ngx_processes[i].pid, signo); if (err == NGX_ESRCH) { @@ -459,7 +457,7 @@ static ngx_uint_t ngx_reap_childs(ngx_cycle_t *cycle) for (i = 0; i < ngx_last_process; i++) { ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "child: %d " PID_T_FMT " e:%d t:%d d:%d r:%d j:%d", + "child: %d %P e:%d t:%d d:%d r:%d j:%d", i, ngx_processes[i].pid, ngx_processes[i].exiting, @@ -492,8 +490,8 @@ static ngx_uint_t ngx_reap_childs(ngx_cycle_t *cycle) } ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "pass close channel s:%d pid:" PID_T_FMT - " to:" PID_T_FMT, ch.slot, ch.pid, ngx_processes[n].pid); + "pass close channel s:%i pid:%P to:%P", + ch.slot, ch.pid, ngx_processes[n].pid); /* TODO: NGX_AGAIN */ @@ -786,9 +784,19 @@ static void ngx_channel_handler(ngx_event_t *ev) n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log); - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %d", n); + ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n); - if (n <= 0) { + if (n == NGX_ERROR) { + if (close(c->fd) == -1) { + ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, + "close() channel failed"); + } + + c->fd = -1; + return; + } + + if (n == NGX_AGAIN) { return; } @@ -812,8 +820,7 @@ static void ngx_channel_handler(ngx_event_t *ev) case NGX_CMD_OPEN_CHANNEL: ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0, - "get channel s:%d pid:" PID_T_FMT " fd:%d", - ch.slot, ch.pid, ch.fd); + "get channel s:%i pid:%P fd:%d", ch.slot, ch.pid, ch.fd); ngx_processes[ch.slot].pid = ch.pid; ngx_processes[ch.slot].channel[0] = ch.fd; @@ -822,8 +829,7 @@ static void ngx_channel_handler(ngx_event_t *ev) case NGX_CMD_CLOSE_CHANNEL: ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0, - "close channel s:%d pid:" PID_T_FMT " our:" PID_T_FMT - " fd:%d", + "close channel s:%i pid:%P our:%P fd:%d", ch.slot, ch.pid, ngx_processes[ch.slot].pid, ngx_processes[ch.slot].channel[0]); @@ -882,7 +888,7 @@ static void ngx_wakeup_worker_threads(ngx_cycle_t *cycle) } -static void* ngx_worker_thread_cycle(void *data) +static void *ngx_worker_thread_cycle(void *data) { ngx_thread_t *thr = data; @@ -909,7 +915,7 @@ static void* ngx_worker_thread_cycle(void *data) } ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "thread " TID_T_FMT " started", ngx_thread_self()); + "thread " NGX_TID_T_FMT " started", ngx_thread_self()); ngx_setthrtitle("worker thread"); @@ -941,7 +947,8 @@ static void* ngx_worker_thread_cycle(void *data) ngx_mutex_unlock(ngx_posted_events_mutex); ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "thread %d is done", ngx_thread_self()); + "thread " NGX_TID_T_FMT " is done", + ngx_thread_self()); return (void *) 0; } diff --git a/src/os/unix/ngx_pthread_thread.c b/src/os/unix/ngx_pthread_thread.c index ad7987b81..4903d5e50 100644 --- a/src/os/unix/ngx_pthread_thread.c +++ b/src/os/unix/ngx_pthread_thread.c @@ -15,14 +15,14 @@ static ngx_uint_t max_threads; static pthread_attr_t thr_attr; -int ngx_create_thread(ngx_tid_t *tid, void* (*func)(void *arg), void *arg, - ngx_log_t *log) +ngx_err_t ngx_create_thread(ngx_tid_t *tid, void* (*func)(void *arg), void *arg, + ngx_log_t *log) { int err; if (nthreads >= max_threads) { ngx_log_error(NGX_LOG_CRIT, log, 0, - "no more than %d threads can be created", max_threads); + "no more than %ui threads can be created", max_threads); return NGX_ERROR; } @@ -34,7 +34,7 @@ int ngx_create_thread(ngx_tid_t *tid, void* (*func)(void *arg), void *arg, } ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, - "thread is created: " TID_T_FMT, *tid); + "thread is created: " NGX_TID_T_FMT, *tid); nthreads++; @@ -70,7 +70,7 @@ ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle) } -ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, uint flags) +ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags) { int err; ngx_mutex_t *m; @@ -101,7 +101,7 @@ void ngx_mutex_destroy(ngx_mutex_t *m) if (err != 0) { ngx_log_error(NGX_LOG_ALERT, m->log, err, - "pthread_mutex_destroy(" PTR_FMT ") failed", m); + "pthread_mutex_destroy(%p) failed", m); } ngx_free(m); @@ -116,18 +116,17 @@ ngx_int_t ngx_mutex_lock(ngx_mutex_t *m) return NGX_OK; } - ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "lock mutex " PTR_FMT, m); + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "lock mutex %p", m); err = pthread_mutex_lock(&m->mutex); if (err != 0) { ngx_log_error(NGX_LOG_ALERT, m->log, err, - "pthread_mutex_lock(" PTR_FMT ") failed", m); + "pthread_mutex_lock(%p) failed", m); return NGX_ERROR; } - ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "mutex " PTR_FMT " is locked", m); + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "mutex %p is locked", m); return NGX_OK; } @@ -141,8 +140,7 @@ ngx_int_t ngx_mutex_trylock(ngx_mutex_t *m) return NGX_OK; } - ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "try lock mutex " PTR_FMT, m); + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "try lock mutex %p", m); err = pthread_mutex_trylock(&m->mutex); @@ -152,12 +150,11 @@ ngx_int_t ngx_mutex_trylock(ngx_mutex_t *m) if (err != 0) { ngx_log_error(NGX_LOG_ALERT, m->log, err, - "pthread_mutex_trylock(" PTR_FMT ") failed", m); + "pthread_mutex_trylock(%p) failed", m); return NGX_ERROR; } - ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "mutex " PTR_FMT " is locked", m); + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "mutex %p is locked", m); return NGX_OK; } @@ -171,18 +168,17 @@ ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m) return NGX_OK; } - ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "unlock mutex " PTR_FMT, m); + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "unlock mutex %p", m); err = pthread_mutex_unlock(&m->mutex); if (err != 0) { ngx_log_error(NGX_LOG_ALERT, m->log, err, - "pthread_mutex_unlock(" PTR_FMT ") failed", m); + "pthread_mutex_unlock(%p) failed", m); return NGX_ERROR; } - ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "mutex " PTR_FMT " is unlocked", m); + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "mutex %p is unlocked", m); return NGX_OK; } @@ -219,7 +215,7 @@ void ngx_cond_destroy(ngx_cond_t *cv) if (err != 0) { ngx_log_error(NGX_LOG_ALERT, cv->log, err, - "pthread_cond_destroy(" PTR_FMT ") failed", cv); + "pthread_cond_destroy(%p) failed", cv); } ngx_free(cv); @@ -230,22 +226,19 @@ ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m) { int err; - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, - "cv " PTR_FMT " wait", cv); + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p wait", cv); err = pthread_cond_wait(&cv->cond, &m->mutex); if (err != 0) { ngx_log_error(NGX_LOG_ALERT, cv->log, err, - "pthread_cond_wait(" PTR_FMT ") failed", cv); + "pthread_cond_wait(%p) failed", cv); return NGX_ERROR; } - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, - "cv " PTR_FMT " is waked up", cv); + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p is waked up", cv); - ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, - "mutex " PTR_FMT " is locked", m); + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "mutex %p is locked", m); return NGX_OK; } @@ -255,19 +248,17 @@ ngx_int_t ngx_cond_signal(ngx_cond_t *cv) { int err; - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, - "cv " PTR_FMT " to signal", cv); + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p to signal", cv); err = pthread_cond_signal(&cv->cond); if (err != 0) { ngx_log_error(NGX_LOG_ALERT, cv->log, err, - "pthread_cond_signal(" PTR_FMT ") failed", cv); + "pthread_cond_signal(%p) failed", cv); return NGX_ERROR; } - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, - "cv " PTR_FMT " is signaled", cv); + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p is signaled", cv); return NGX_OK; } diff --git a/src/os/unix/ngx_shared.c b/src/os/unix/ngx_shared.c index 60f2de029..7f3c5e9be 100644 --- a/src/os/unix/ngx_shared.c +++ b/src/os/unix/ngx_shared.c @@ -18,8 +18,7 @@ void *ngx_create_shared_memory(size_t size, ngx_log_t *log) if (p == MAP_FAILED) { ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "mmap(MAP_ANON|MAP_SHARED, " SIZE_T_FMT ") failed", - size); + "mmap(MAP_ANON|MAP_SHARED, %uz) failed", size); return NULL; } @@ -45,8 +44,7 @@ void *ngx_create_shared_memory(size_t size, ngx_log_t *log) if (p == MAP_FAILED) { ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "mmap(/dev/zero, MAP_SHARED, " SIZE_T_FMT ") failed", - size); + "mmap(/dev/zero, MAP_SHARED, %uz) failed", size); p = NULL; } @@ -72,7 +70,7 @@ void *ngx_create_shared_memory(size_t size, ngx_log_t *log) if (id == -1) { ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "shmget(" SIZE_T_FMT ") failed", size); + "shmget(%uz) failed", size); return NULL; } diff --git a/src/os/unix/ngx_socket.h b/src/os/unix/ngx_socket.h index 34449d090..c6eb9413f 100644 --- a/src/os/unix/ngx_socket.h +++ b/src/os/unix/ngx_socket.h @@ -15,7 +15,7 @@ typedef int ngx_socket_t; -#define ngx_socket(af, type, proto, flags) socket(af, type, proto) +#define ngx_socket socket #define ngx_socket_n "socket()" diff --git a/src/os/unix/ngx_solaris_sendfilev_chain.c b/src/os/unix/ngx_solaris_sendfilev_chain.c index 9430dc05b..21f8b8f7c 100644 --- a/src/os/unix/ngx_solaris_sendfilev_chain.c +++ b/src/os/unix/ngx_solaris_sendfilev_chain.c @@ -136,8 +136,7 @@ ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, } ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, - "sendfilev() sent only " SIZE_T_FMT " bytes", - sent); + "sendfilev() sent only %z bytes", sent); } else { wev->error = 1; @@ -147,7 +146,7 @@ ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, } ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "sendfilev: %d " SIZE_T_FMT, n, sent); + "sendfilev: %z %z", n, sent); if (send - sprev == sent) { complete = 1; diff --git a/src/os/unix/ngx_thread.h b/src/os/unix/ngx_thread.h index 16e216ef0..ac7cfad43 100644 --- a/src/os/unix/ngx_thread.h +++ b/src/os/unix/ngx_thread.h @@ -29,9 +29,9 @@ typedef pthread_t ngx_tid_t; #define ngx_log_tid (int) ngx_thread_self() #if (NGX_FREEBSD) && !(NGX_LINUXTHREADS) -#define TID_T_FMT PTR_FMT +#define NGX_TID_T_FMT "%p" #else -#define TID_T_FMT "%d" +#define NGX_TID_T_FMT "%d" #endif @@ -92,11 +92,11 @@ extern volatile ngx_thread_t ngx_threads[NGX_MAX_THREADS]; ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle); -int ngx_create_thread(ngx_tid_t *tid, void* (*func)(void *arg), void *arg, - ngx_log_t *log); +ngx_err_t ngx_create_thread(ngx_tid_t *tid, void* (*func)(void *arg), void *arg, + ngx_log_t *log); -ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, uint flags); +ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags); void ngx_mutex_destroy(ngx_mutex_t *m); @@ -110,8 +110,8 @@ ngx_int_t ngx_cond_signal(ngx_cond_t *cv); #define ngx_thread_volatile -#define ngx_log_tid 0 -#define TID_T_FMT "%d" +#define ngx_log_tid 0 +#define NGX_TID_T_FMT "%d" #define ngx_mutex_trylock(m) NGX_OK #define ngx_mutex_lock(m) NGX_OK diff --git a/src/os/unix/ngx_writev_chain.c b/src/os/unix/ngx_writev_chain.c index e57b59305..e3893226d 100644 --- a/src/os/unix/ngx_writev_chain.c +++ b/src/os/unix/ngx_writev_chain.c @@ -9,14 +9,14 @@ #include <ngx_event.h> -#define NGX_IOVS 8 +#define NGX_IOVS 16 ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) { u_char *prev; - ssize_t n, size; - off_t send, sprev, sent; + ssize_t n, size, sent; + off_t send, sprev; ngx_uint_t eintr, complete; ngx_err_t err; ngx_array_t vec; @@ -66,6 +66,12 @@ ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) continue; } +#if 1 + if (!ngx_buf_in_memory(cl->buf)) { + ngx_debug_point(); + } +#endif + size = cl->buf->last - cl->buf->pos; if (send + size > limit) { @@ -110,8 +116,7 @@ ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) sent = n > 0 ? n : 0; - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "writev: " OFF_T_FMT, sent); + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "writev: %z", sent); if (send - sprev == sent) { complete = 1; @@ -119,7 +124,8 @@ ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) c->sent += sent; - for (cl = in; cl && sent > 0; cl = cl->next) { + for (cl = in; cl; cl = cl->next) { + if (ngx_buf_special(cl->buf)) { continue; } diff --git a/src/os/win32/nginx.ico b/src/os/win32/nginx.ico Binary files differnew file mode 100644 index 000000000..6fb330b51 --- /dev/null +++ b/src/os/win32/nginx.ico diff --git a/src/os/win32/nginx.rc b/src/os/win32/nginx.rc new file mode 100644 index 000000000..7a2e24133 --- /dev/null +++ b/src/os/win32/nginx.rc @@ -0,0 +1,16 @@ + +// Copyright (C) Igor Sysoev + +#include <ngx_gui.h> + +nginx icon discardable "src\\os\\win32\\nginx.ico" +tray icon discardable "src\\os\\win32\\tray.ico" + +nginx menu discardable +begin + popup "&nginx" + begin + menuitem "&Exit", NGX_WM_EXIT + menuitem "&About", NGX_WM_ABOUT + end +end diff --git a/src/os/win32/ngx_alloc.c b/src/os/win32/ngx_alloc.c index ea36cad57..e73aa32af 100644 --- a/src/os/win32/ngx_alloc.c +++ b/src/os/win32/ngx_alloc.c @@ -17,11 +17,10 @@ void *ngx_alloc(size_t size, ngx_log_t *log) if (!(p = malloc(size))) { ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "malloc() " SIZE_T_FMT " bytes failed", size); + "malloc() %uz bytes failed", size); } - ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, - "malloc: " PTR_FMT ":" SIZE_T_FMT, p, size); + ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size); return p; } diff --git a/src/os/win32/ngx_atomic.h b/src/os/win32/ngx_atomic.h index 3ef150996..b4915d0a2 100644 --- a/src/os/win32/ngx_atomic.h +++ b/src/os/win32/ngx_atomic.h @@ -18,7 +18,7 @@ #define ngx_atomic_inc(p) InterlockedIncrement((long *) p) -#if defined( __WATCOMC__ ) || defined( __BORLANDC__ ) +#if defined( __WATCOMC__ ) || defined( __BORLANDC__ ) || ( _MSC_VER >= 1300 ) /* the new SDK headers */ diff --git a/src/os/win32/ngx_errno.c b/src/os/win32/ngx_errno.c index 6f8d2da5b..8e9280d92 100644 --- a/src/os/win32/ngx_errno.c +++ b/src/os/win32/ngx_errno.c @@ -15,64 +15,101 @@ static ngx_str_t wsa_errors[] = { - ngx_string("Invalid argument"), /* 10022 */ - ngx_null_string, /* 10023 */ - ngx_null_string, /* 10024 */ - ngx_null_string, /* 10025 */ - ngx_null_string, /* 10026 */ - ngx_null_string, /* 10027 */ - ngx_null_string, /* 10028 */ - ngx_null_string, /* 10029 */ - ngx_null_string, /* 10030 */ - ngx_null_string, /* 10031 */ - ngx_null_string, /* 10032 */ - ngx_null_string, /* 10033 */ - ngx_null_string, /* 10034 */ - ngx_string("Resource temporarily unavailable"), /* 10035 */ - ngx_null_string, /* 10036 */ - ngx_null_string, /* 10037 */ - ngx_null_string, /* 10038 */ - ngx_null_string, /* 10039 */ - ngx_null_string, /* 10040 */ - ngx_null_string, /* 10041 */ - ngx_null_string, /* 10042 */ - ngx_null_string, /* 10043 */ - ngx_null_string, /* 10044 */ - ngx_null_string, /* 10045 */ - ngx_null_string, /* 10046 */ - ngx_null_string, /* 10047 */ - ngx_null_string, /* 10048 */ - ngx_null_string, /* 10049 */ - ngx_null_string, /* 10050 */ - ngx_null_string, /* 10051 */ - ngx_null_string, /* 10052 */ - ngx_null_string, /* 10053 */ - ngx_null_string, /* 10054 */ - ngx_null_string, /* 10055 */ - ngx_null_string, /* 10056 */ - ngx_string("Socket is not connected") /* 10057 */ + ngx_string("An invalid argument was supplied"), /* WSAEINVAL 10022 */ + ngx_string("Too many open sockets"), /* WSAEMFILE 10023 */ + + ngx_null_string, /* 10024 */ + ngx_null_string, /* 10025 */ + ngx_null_string, /* 10026 */ + ngx_null_string, /* 10027 */ + ngx_null_string, /* 10028 */ + ngx_null_string, /* 10029 */ + ngx_null_string, /* 10030 */ + ngx_null_string, /* 10031 */ + ngx_null_string, /* 10032 */ + ngx_null_string, /* 10033 */ + ngx_null_string, /* 10034 */ + + /* WSAEWOULDBLOCK 10035 */ + ngx_string("A non-blocking socket operation could not be completed " + "immediately"), + + ngx_null_string, /* 10036 */ + ngx_null_string, /* 10037 */ + + /* WSAENOTSOCK 10038 */ + ngx_string("An operation was attempted on something that is not a socket"), + + ngx_null_string, /* 10039 */ + ngx_null_string, /* 10040 */ + ngx_null_string, /* 10041 */ + ngx_null_string, /* 10042 */ + ngx_null_string, /* 10043 */ + ngx_null_string, /* 10044 */ + ngx_null_string, /* 10045 */ + ngx_null_string, /* 10046 */ + ngx_null_string, /* 10047 */ + ngx_null_string, /* 10048 */ + ngx_null_string, /* 10049 */ + ngx_null_string, /* 10050 */ + ngx_null_string, /* 10051 */ + ngx_null_string, /* 10052 */ + ngx_null_string, /* 10053 */ + + /* WSAECONNRESET 10054 */ + ngx_string("An existing connection was forcibly closed by the remote host"), + + /* WSAENOBUFS 10055 */ + ngx_string("An operation on a socket could not be performed because " + "the system lacked sufficient buffer space or " + "because a queue was full"), + + /* WSAEISCONN 10056 */ + ngx_string("A connect request was made on an already connected socket"), + + /* WSAENOTCONN 10057 */ + ngx_string("A request to send or receive data was disallowed because" + "the socket is not connected and (when sending on a datagram " + "socket using a sendto call) no address was supplied"), + + ngx_null_string, /* 10058 */ + ngx_null_string, /* 10059 */ + + /* WSAETIMEDOUT 10060 */ + ngx_string("A connection attempt failed because the connected party " + "did not properly respond after a period of time, " + "or established connection failed because connected host " + "has failed to respond"), + + /* WSAECONNREFUSED 10061 */ + ngx_string("No connection could be made because the target machine " + "actively refused it") }; -int ngx_strerror_r(ngx_err_t err, char *errstr, size_t size) +u_char *ngx_strerror_r(ngx_err_t err, u_char *errstr, size_t size) { int n; u_int len; ngx_err_t format_error; + if (size == 0) { + return errstr; + } + len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - errstr, size, NULL); + (char *) errstr, size, NULL); if (len == 0) { format_error = GetLastError(); if (format_error == ERROR_MR_MID_NOT_FOUND) { - n = err - WSABASEERR - 22; + n = err - WSAEINVAL; - if (n >= 0 && n <= 35) { + if (n >= 0 && n <= WSAECONNREFUSED - WSAEINVAL) { len = wsa_errors[n].len; if (len) { @@ -81,21 +118,22 @@ int ngx_strerror_r(ngx_err_t err, char *errstr, size_t size) } ngx_memcpy(errstr, wsa_errors[n].data, len); - return len; + + return errstr + len; } } } - len = ngx_snprintf(errstr, size, - "FormatMessage() error:(%d)", format_error); - return len; - + return ngx_snprintf(errstr, size, + "FormatMessage() error:(%d)", format_error); } /* remove ".\r\n\0" */ while (errstr[len] == '\0' || errstr[len] == CR || errstr[len] == LF || errstr[len] == '.') + { --len; + } - return ++len; + return &errstr[++len]; } diff --git a/src/os/win32/ngx_errno.h b/src/os/win32/ngx_errno.h index f60ea74e1..863dce879 100644 --- a/src/os/win32/ngx_errno.h +++ b/src/os/win32/ngx_errno.h @@ -38,7 +38,7 @@ typedef DWORD ngx_err_t; #define NGX_EALREADY WSAEALREADY #define NGX_EINVAL WSAEINVAL -int ngx_strerror_r(ngx_err_t err, char *errstr, size_t size); +u_char *ngx_strerror_r(ngx_err_t err, u_char *errstr, size_t size); #endif /* _NGX_ERRNO_H_INCLUDED_ */ diff --git a/src/os/win32/ngx_files.c b/src/os/win32/ngx_files.c index dea310698..ffd52c9bd 100644 --- a/src/os/win32/ngx_files.c +++ b/src/os/win32/ngx_files.c @@ -18,19 +18,20 @@ ssize_t ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) if (ngx_win32_version < NGX_WIN_NT) { /* - * in Win9X the overlapped pointer must be NULL - * so we need to use SetFilePointer() to set the offset + * under Win9X the overlapped pointer must be NULL + * so we have to use SetFilePointer() to set the offset */ if (file->offset != offset) { /* - * the maximum file size on FAT16 is 2G, but on FAT32 - * the size is 4G so we need to use high_offset + * the maximum file size on the FAT16 is 2G, but on the FAT32 + * the size is 4G so we have to use the high_offset * because a single offset is signed value */ high_offset = (long) (offset >> 32); + if (SetFilePointer(file->fd, (long) offset, &high_offset, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { @@ -81,15 +82,15 @@ ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) if (ngx_win32_version < NGX_WIN_NT) { /* - * in Win9X the overlapped pointer must be NULL - * so we need to use SetFilePointer() to set the offset + * under Win9X the overlapped pointer must be NULL + * so we have to use SetFilePointer() to set the offset */ if (file->offset != offset) { /* - * the maximum file size on FAT16 is 2G, but on FAT32 - * the size is 4G so we need to use high_offset + * the maximum file size on the FAT16 is 2G, but on the FAT32 + * the size is 4G so we have to use high_offset * because a single offset is signed value */ @@ -189,8 +190,7 @@ int ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_pool_t *pool) do { num = ngx_next_temp_number(collision); - ngx_snprintf((char *) name + to->len, 1 + 10 + 1 + sizeof("DELETE"), - ".%010u.DELETE", num); + ngx_sprintf(name + to->len, ".%010u.DELETE", num); if (MoveFile((const char *) to->data, (const char *) name) == 0) { collision = 1; diff --git a/src/os/win32/ngx_gui.c b/src/os/win32/ngx_gui.c new file mode 100644 index 000000000..5673820d2 --- /dev/null +++ b/src/os/win32/ngx_gui.c @@ -0,0 +1,85 @@ + +/* + * Copyright (C) Igor Sysoev + */ + + +#include <ngx_config.h> +#include <ngx_core.h> + + +#define NGX_MAX_TEXT 2048 + + +void ngx_message_box(char *title, ngx_uint_t type, ngx_err_t err, + const char *fmt, ...) +{ + va_list args; + u_char text[NGX_MAX_TEXT], *p, *last; + + last = text + NGX_MAX_TEXT; + + va_start(args, fmt); + p = ngx_vsnprintf(text, NGX_MAX_TEXT, fmt, args); + va_end(args); + + if (err) { + + if (p > last - 50) { + + /* leave a space for an error code */ + + p = last - 50; + *p++ = '.'; + *p++ = '.'; + *p++ = '.'; + } + + if ((unsigned) err >= 0x80000000) { + p = ngx_snprintf(p, last - p, " (%Xd: ", err); + + } else { + p = ngx_snprintf(p, last - p, " (%d: ", err); + } + + p = ngx_strerror_r(err, p, last - p); + + if (p < last) { + *p++ = ')'; + } + } + + if (p == last) { + p--; + } + + *p = '\0'; + + MessageBox(NULL, (char *) text, title, type); +} + + +ngx_int_t ngx_system_tray_icon(HWND window, u_long action, + HICON icon, u_char *tip) +{ + NOTIFYICONDATA ni; + + ni.cbSize = sizeof(NOTIFYICONDATA); + ni.hWnd = window; + ni.uID = 0; + ni.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP; + ni.uCallbackMessage = NGX_WM_TRAY; + ni.hIcon = icon; + + if (tip) { + ngx_cpystrn((u_char *) ni.szTip, tip, 64); + } else { + ni.szTip[0] = '\0'; + } + + if (Shell_NotifyIcon(action, &ni) == 0) { + return NGX_ERROR; + } + + return NGX_OK; +} diff --git a/src/os/win32/ngx_gui.h b/src/os/win32/ngx_gui.h new file mode 100644 index 000000000..1c2fd9b43 --- /dev/null +++ b/src/os/win32/ngx_gui.h @@ -0,0 +1,27 @@ + +/* + * Copyright (C) Igor Sysoev + */ + + +#ifndef _NGX_GUI_H_INCLUDED_ +#define _NGX_GUI_H_INCLUDED_ + + +#include <ngx_config.h> +#include <ngx_core.h> + + +#define NGX_WM_TRAY WM_USER +#define NGX_WM_EXIT WM_USER + 1 +#define NGX_WM_ABOUT WM_USER + 2 + + +void ngx_message_box(char *title, ngx_uint_t type, ngx_err_t err, + const char *fmt, ...); + +ngx_int_t ngx_system_tray_icon(HWND window, u_long action, + HICON icon, u_char *tip); + + +#endif /* _NGX_GUI_H_INCLUDED_ */ diff --git a/src/os/win32/ngx_os.h b/src/os/win32/ngx_os.h index 98c8e15c2..c27f8a80a 100644 --- a/src/os/win32/ngx_os.h +++ b/src/os/win32/ngx_os.h @@ -10,6 +10,7 @@ #include <ngx_config.h> #include <ngx_core.h> +#include <ngx_gui.h> #define NGX_IO_SENDFILE 1 #define NGX_IO_ZEROCOPY 2 @@ -56,6 +57,7 @@ ngx_chain_t *ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, extern ngx_os_io_t ngx_os_io; extern ngx_uint_t ngx_ncpu; +extern ngx_uint_t ngx_max_wsabufs; extern ngx_int_t ngx_max_sockets; extern ngx_uint_t ngx_inherited_nonblocking; extern ngx_uint_t ngx_win32_version; diff --git a/src/os/win32/ngx_process.h b/src/os/win32/ngx_process.h index b9b4aeb80..a282d17ad 100644 --- a/src/os/win32/ngx_process.h +++ b/src/os/win32/ngx_process.h @@ -29,6 +29,7 @@ typedef struct { ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx); +#define ngx_debug_point() #define ngx_sched_yield() Sleep(0) diff --git a/src/os/win32/ngx_process_cycle.c b/src/os/win32/ngx_process_cycle.c index 843c3111e..e0635a5eb 100644 --- a/src/os/win32/ngx_process_cycle.c +++ b/src/os/win32/ngx_process_cycle.c @@ -7,8 +7,13 @@ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_event.h> +#include <nginx.h> +static void *ngx_worker_thread_cycle(void *data); +static long __stdcall ngx_window_procedure(HWND window, u_int message, + u_int wparam, long lparam); + #if 0 ngx_pid_t ngx_new_binary; @@ -37,6 +42,8 @@ sig_atomic_t ngx_change_binary; #endif +static HMENU ngx_menu; + void ngx_master_process_cycle(ngx_cycle_t *cycle) { @@ -48,7 +55,17 @@ void ngx_master_process_cycle(ngx_cycle_t *cycle) void ngx_single_process_cycle(ngx_cycle_t *cycle) { - ngx_int_t i; + int rc; + ngx_int_t i; + ngx_err_t err; + ngx_tid_t tid; + MSG message; + HWND window; + HMENU menu; + HICON icon,tray; + WNDCLASS wc; + HINSTANCE instance; + ngx_core_conf_t *ccf; ngx_init_temp_number(); @@ -61,9 +78,197 @@ void ngx_single_process_cycle(ngx_cycle_t *cycle) } } + + ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); + + if (ngx_init_threads(ngx_threads_n, + ccf->thread_stack_size, cycle) == NGX_ERROR) + { + /* fatal */ + exit(2); + } + + err = ngx_thread_key_create(&ngx_core_tls_key); + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, err, + ngx_thread_key_create_n " failed"); + /* fatal */ + exit(2); + } + + + instance = GetModuleHandle(NULL); + + icon = LoadIcon(instance, "nginx"); + if (icon == NULL) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "LoadIcon(\"nginx\") failed"); + /* fatal */ + exit(2); + } + + tray = LoadIcon(instance, "tray"); + if (icon == NULL) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "LoadIcon(\"tray\") failed"); + /* fatal */ + exit(2); + } + + menu = LoadMenu(instance, "nginx"); + if (menu == NULL) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "LoadMenu() failed"); + /* fatal */ + exit(2); + } + + ngx_menu = GetSubMenu(menu, 0); + if (ngx_menu == NULL) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "GetSubMenu() failed"); + /* fatal */ + exit(2); + } + + + wc.style = CS_HREDRAW|CS_VREDRAW; + wc.lpfnWndProc = ngx_window_procedure; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = instance; + wc.hIcon = icon; + wc.hCursor = NULL; + wc.hbrBackground = NULL; + wc.lpszMenuName = NULL; + wc.lpszClassName = "nginx"; + + if (RegisterClass(&wc) == 0) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "RegisterClass() failed"); + /* fatal */ + exit(2); + } + + + window = CreateWindow("nginx", "nginx", WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + NULL, NULL, instance, NULL); + + if (window == NULL) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "CreateWindow() failed"); + /* fatal */ + exit(2); + } + + + if (ngx_system_tray_icon(window, NIM_ADD, tray, (u_char *) " nginx") + == NGX_ERROR) + { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "Shell_NotifyIcon(NIM_ADD) failed"); + /* fatal */ + exit(2); + } + + + if (ngx_create_thread(&tid, ngx_worker_thread_cycle, NULL, cycle->log) != 0) + { + /* fatal */ + exit(2); + } + + + for ( ;; ) { + rc = GetMessage(&message, NULL, 0, 0); + + if (rc == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "GetMessage() failed"); + continue; + } + + if (rc == 0) { + exit(0); + } + + TranslateMessage(&message); + DispatchMessage(&message); + } +} + + +static void *ngx_worker_thread_cycle(void *data) +{ + ngx_cycle_t *cycle; + + cycle = (ngx_cycle_t *) ngx_cycle; + for ( ;; ) { ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle"); ngx_process_events(cycle); } + + return NULL; +} + + +static long __stdcall ngx_window_procedure(HWND window, u_int message, + u_int wparam, long lparam) +{ + POINT mouse; + + switch (message) { + + case NGX_WM_TRAY: + if (lparam == WM_RBUTTONDOWN) { + if (GetCursorPos(&mouse) == 0) { + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno, + "GetCursorPos() failed"); + return 0; + } + + if (SetForegroundWindow(window) == 0) { + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno, + "SetForegroundWindow() failed"); + return 0; + } + + if (TrackPopupMenu(ngx_menu, TPM_RIGHTBUTTON, + mouse.x, mouse.y, 0, window, NULL) == 0) + { + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno, + "TrackPopupMenu() failed"); + return 0; + } + } + + return 0; + + case WM_COMMAND: + if (wparam == NGX_WM_ABOUT) { + ngx_message_box("nginx", MB_OK, 0, + NGINX_VER CRLF "(C) 2002-2004 Igor Sysoev"); + return 0; + } + + if (wparam == NGX_WM_EXIT) { + if (ngx_system_tray_icon(window, NIM_DELETE, NULL, NULL) + == NGX_ERROR) + { + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno, + "Shell_NotifyIcon(NIM_DELETE) failed"); + } + } + + PostQuitMessage(0); + + return 0; + + default: + return DefWindowProc(window, message, wparam, lparam); + } } diff --git a/src/os/win32/ngx_socket.h b/src/os/win32/ngx_socket.h index 4ce60a7f3..d49ad2c15 100644 --- a/src/os/win32/ngx_socket.h +++ b/src/os/win32/ngx_socket.h @@ -19,12 +19,8 @@ typedef SOCKET ngx_socket_t; typedef int socklen_t; -#define ngx_socket(af, type, proto, flags) socket(af, type, proto) - -#if 0 -#define ngx_socket(af, type, proto, flags) \ - WSASocket(af, type, proto, NULL, 0, flags) -#endif +#define ngx_socket(af, type, proto) \ + WSASocket(af, type, proto, NULL, 0, WSA_FLAG_OVERLAPPED) #define ngx_socket_n "WSASocket()" diff --git a/src/os/win32/ngx_thread.c b/src/os/win32/ngx_thread.c new file mode 100644 index 000000000..8fae0e379 --- /dev/null +++ b/src/os/win32/ngx_thread.c @@ -0,0 +1,68 @@ + +/* + * Copyright (C) Igor Sysoev + */ + + +#include <ngx_config.h> +#include <ngx_core.h> + + +ngx_int_t ngx_threads_n; + + +static size_t stack_size; + + +ngx_err_t ngx_create_thread(ngx_tid_t *tid, void* (*func)(void *arg), void *arg, + ngx_log_t *log) +{ + ngx_err_t err; + + *tid = CreateThread(NULL, stack_size, + (LPTHREAD_START_ROUTINE) func, arg, 0, NULL); + + if (*tid != NULL) { + return 0; + } + + err = ngx_errno; + ngx_log_error(NGX_LOG_ALERT, log, err, "CreateThread() failed"); + return err; +} + + +ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle) +{ + stack_size = size; + + return NGX_OK; +} + + +ngx_err_t ngx_thread_key_create(ngx_tls_key_t *key) +{ + *key = TlsAlloc(); + + if (*key == TLS_OUT_OF_INDEXES) { + return ngx_errno; + } + + return 0; +} + + +ngx_err_t ngx_thread_set_tls(ngx_tls_key_t *key, void *data) +{ + if (TlsSetValue(*key, data) == 0) { + return ngx_errno; + } + + return 0; +} + + +ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags) +{ + return (ngx_mutex_t *) 1; +} diff --git a/src/os/win32/ngx_thread.h b/src/os/win32/ngx_thread.h index b3b6e67cd..5b3c4da98 100644 --- a/src/os/win32/ngx_thread.h +++ b/src/os/win32/ngx_thread.h @@ -12,21 +12,46 @@ #include <ngx_core.h> -#if (NGX_THREADS) +typedef HANDLE ngx_tid_t; +typedef DWORD ngx_tls_key_t; + + +typedef struct { + HANDLE mutex; + ngx_log_t *log; +} ngx_mutex_t; + + +ngx_err_t ngx_create_thread(ngx_tid_t *tid, void* (*func)(void *arg), void *arg, + ngx_log_t *log); +ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle); + +ngx_err_t ngx_thread_key_create(ngx_tls_key_t *key); +#define ngx_thread_key_create_n "TlsAlloc()" +ngx_err_t ngx_thread_set_tls(ngx_tls_key_t *key, void *data); +#define ngx_thread_set_tls_n "TlsSetValue()" +#define ngx_thread_get_tls TlsGetValue + #define ngx_thread_volatile volatile -#else /* !NGX_THREADS */ +#define ngx_log_tid GetCurrentThreadId() +#define NGX_TID_T_FMT "%ud" + -#define ngx_thread_volatile +ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags); -#define ngx_log_tid 0 -#define TID_T_FMT "%d" -#define ngx_mutex_lock(m) NGX_OK +/* STUB */ +#define NGX_MUTEX_LIGHT 0 + +#define ngx_mutex_lock(m) NGX_OK +#define ngx_mutex_trylock(m) NGX_OK #define ngx_mutex_unlock(m) +/* */ + -#endif +extern ngx_int_t ngx_threads_n; #endif /* _NGX_THREAD_H_INCLUDED_ */ diff --git a/src/os/win32/ngx_win32_config.h b/src/os/win32/ngx_win32_config.h index a6c336d7a..e7d3086e8 100644 --- a/src/os/win32/ngx_win32_config.h +++ b/src/os/win32/ngx_win32_config.h @@ -8,8 +8,6 @@ #define _NGX_WIN32_CONFIG_H_INCLUDED_ -#define WIN32 1 - #define STRICT #define WIN32_LEAN_AND_MEAN @@ -25,6 +23,7 @@ #include <winsock2.h> #include <mswsock.h> +#include <shellapi.h> #include <stddef.h> /* offsetof() */ #include <stdio.h> #include <stdlib.h> @@ -96,8 +95,10 @@ #ifdef _MSC_VER typedef unsigned __int32 uint32_t; +typedef __int32 int32_t; #else /* __WATCOMC__ */ typedef unsigned int uint32_t; +typedef int int32_t; #endif typedef __int64 int64_t; @@ -115,17 +116,13 @@ typedef uint32_t ngx_atomic_t; #define TIME_T_LEN sizeof("-2147483648") - 1 -#define OFF_T_FMT "%I64d" -#define SIZE_T_FMT "%d" -#define SIZE_T_X_FMT "%x" -#define PID_T_FMT "%d" -#define TIME_T_FMT "%lu" -#define PTR_FMT "%08X" - #define NGX_WIN_NT 200000 +#define NGX_THREADS 1 + + #ifndef HAVE_INHERITED_NONBLOCK #define HAVE_INHERITED_NONBLOCK 1 #endif diff --git a/src/os/win32/ngx_win32_init.c b/src/os/win32/ngx_win32_init.c index ea1cfd1b5..cb8c93128 100644 --- a/src/os/win32/ngx_win32_init.c +++ b/src/os/win32/ngx_win32_init.c @@ -10,6 +10,7 @@ ngx_uint_t ngx_win32_version; ngx_uint_t ngx_ncpu; +ngx_uint_t ngx_max_wsabufs; ngx_int_t ngx_max_sockets; ngx_uint_t ngx_inherited_nonblocking = 1; ngx_fd_t ngx_stderr_fileno; @@ -31,6 +32,9 @@ typedef struct { } ngx_osviex_stub_t; +static u_int osviex; +static OSVERSIONINFOEX osvi; + /* Should these pointers be per protocol ? */ LPFN_ACCEPTEX acceptex; LPFN_GETACCEPTEXSOCKADDRS getacceptexsockaddrs; @@ -43,13 +47,10 @@ static GUID tf_guid = WSAID_TRANSMITFILE; ngx_int_t ngx_os_init(ngx_log_t *log) { - u_int osviex; - DWORD bytes; - SOCKET s; - WSADATA wsd; - SYSTEM_INFO si; - OSVERSIONINFOEX osvi; - ngx_osviex_stub_t *osviex_stub; + DWORD bytes; + SOCKET s; + WSADATA wsd; + SYSTEM_INFO si; /* get Windows version */ @@ -90,43 +91,6 @@ ngx_int_t ngx_os_init(ngx_log_t *log) if (osviex) { ngx_win32_version += osvi.wServicePackMajor * 10 + osvi.wServicePackMinor; - - /* - * the MSVC 6.0 SP2 defines wSuiteMask and wProductType - * as WORD wReserved[2] - */ - osviex_stub = (ngx_osviex_stub_t *) &osvi.wServicePackMinor; - - ngx_log_error(NGX_LOG_INFO, log, 0, - "OS: %u build:%u, \"%s\", suite:%x, type:%u", - ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion, - osviex_stub->wSuiteMask, osviex_stub->wProductType); - - } else { - if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { - - /* Win9x build */ - - ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %u build:%u.%u.%u, \"%s\"", - ngx_win32_version, - osvi.dwBuildNumber >> 24, - (osvi.dwBuildNumber >> 16) & 0xff, - osvi.dwBuildNumber & 0xffff, - osvi.szCSDVersion); - - } else { - - /* - * VER_PLATFORM_WIN32_NT - * - * we do not currently support VER_PLATFORM_WIN32_CE - * and we do not support VER_PLATFORM_WIN32s at all - */ - - ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %u build:%u, \"%s\"", - ngx_win32_version, osvi.dwBuildNumber, - osvi.szCSDVersion); - } } GetSystemInfo(&si); @@ -143,15 +107,19 @@ ngx_int_t ngx_os_init(ngx_log_t *log) } if (ngx_win32_version < NGX_WIN_NT) { + ngx_max_wsabufs = 16; return NGX_OK; } + /* STUB: ngx_uint_t max */ + ngx_max_wsabufs = 1024 * 1024; + /* get AcceptEx(), GetAcceptExSockAddrs() and TransmitFile() addresses */ - s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0); + s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (s == -1) { ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - ngx_socket_n " %s falied"); + ngx_socket_n " falied"); return NGX_ERROR; } @@ -194,4 +162,46 @@ ngx_int_t ngx_os_init(ngx_log_t *log) void ngx_os_status(ngx_log_t *log) { + ngx_osviex_stub_t *osviex_stub; + + if (osviex) { + + /* + * the MSVC 6.0 SP2 defines wSuiteMask and wProductType + * as WORD wReserved[2] + */ + osviex_stub = (ngx_osviex_stub_t *) &osvi.wServicePackMinor; + + ngx_log_error(NGX_LOG_INFO, log, 0, + "OS: %ud build:%ud, \"%s\", suite:%Xd, type:%ud", + ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion, + osviex_stub->wSuiteMask, osviex_stub->wProductType); + + } else { + if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { + + /* Win9x build */ + + ngx_log_error(NGX_LOG_INFO, log, 0, + "OS: %u build:%ud.%ud.%ud, \"%s\"", + ngx_win32_version, + osvi.dwBuildNumber >> 24, + (osvi.dwBuildNumber >> 16) & 0xff, + osvi.dwBuildNumber & 0xffff, + osvi.szCSDVersion); + + } else { + + /* + * VER_PLATFORM_WIN32_NT + * + * we do not currently support VER_PLATFORM_WIN32_CE + * and we do not support VER_PLATFORM_WIN32s at all + */ + + ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %ud build:%ud, \"%s\"", + ngx_win32_version, osvi.dwBuildNumber, + osvi.szCSDVersion); + } + } } diff --git a/src/os/win32/ngx_wsarecv.c b/src/os/win32/ngx_wsarecv.c index bb0e5566c..ac7a5c4c9 100644 --- a/src/os/win32/ngx_wsarecv.c +++ b/src/os/win32/ngx_wsarecv.c @@ -25,7 +25,7 @@ ssize_t ngx_wsarecv(ngx_connection_t *c, u_char *buf, size_t size) rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, NULL, NULL); ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv: fd:%d rc:%d %d of %d", c->fd, rc, bytes, size); + "WSARecv: fd:%d rc:%d %ul of %z", c->fd, rc, bytes, size); rev = c->read; @@ -85,6 +85,10 @@ ssize_t ngx_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size) return NGX_ERROR; } + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, + "WSARecv ovlp: fd:%d %ul of %z", + c->fd, rev->available, size); + return rev->available; } @@ -95,6 +99,9 @@ ssize_t ngx_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size) return NGX_ERROR; } + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, + "WSARecv: fd:%d %ul of %z", c->fd, bytes, size); + return bytes; } @@ -110,12 +117,15 @@ ssize_t ngx_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size) rev->complete = 0; ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv: fd:%d rc:%d %d of %d", c->fd, rc, bytes, size); + "WSARecv ovlp: fd:%d rc:%d %ul of %z", + c->fd, rc, bytes, size); if (rc == -1) { err = ngx_socket_errno; if (err == WSA_IO_PENDING) { rev->active = 1; + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "WSARecv() posted"); return NGX_AGAIN; } @@ -148,94 +158,3 @@ ssize_t ngx_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size) return bytes; } - -#if 0 - -/* DELELTE IT WHEN ABOVE FUNC WOULD BE TESTED */ - -ssize_t ngx_wsarecv(ngx_connection_t *c, char *buf, size_t size) -{ - int rc; - u_int flags; - size_t bytes; - WSABUF wsabuf[1]; - ngx_err_t err; - ngx_event_t *rev; - LPWSAOVERLAPPED ovlp; - - rev = c->read; - bytes = 0; - - if ((ngx_event_flags & NGX_USE_AIO_EVENT) && rev->ready) { - rev->ready = 0; - - /* the overlapped WSARecv() completed */ - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - if (rev->ovlp.error) { - ngx_log_error(NGX_LOG_ERR, c->log, rev->ovlp.error, - "WSARecv() failed"); - return NGX_ERROR; - } - - return rev->available; - } - - if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &rev->ovlp, - &bytes, 0, NULL) == 0) { - err = ngx_socket_errno; - ngx_log_error(NGX_LOG_CRIT, c->log, err, - "WSARecv() or WSAGetOverlappedResult() failed"); - - return NGX_ERROR; - } - - return bytes; - } - - if (ngx_event_flags & NGX_USE_AIO_EVENT) { - ovlp = (LPWSAOVERLAPPED) &c->read->ovlp; - ngx_memzero(ovlp, sizeof(WSAOVERLAPPED)); - - } else { - ovlp = NULL; - } - - wsabuf[0].buf = buf; - wsabuf[0].len = size; - flags = 0; - - rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, ovlp, NULL); - - ngx_log_debug(c->log, "WSARecv: %d:%d" _ rc _ bytes); - - if (rc == -1) { - err = ngx_socket_errno; - if (err == WSA_IO_PENDING) { - return NGX_AGAIN; - - } else if (err == WSAEWOULDBLOCK) { - ngx_log_error(NGX_LOG_INFO, c->log, err, "WSARecv() EAGAIN"); - return NGX_AGAIN; - - } else { - ngx_log_error(NGX_LOG_CRIT, c->log, err, "WSARecv() failed"); - return NGX_ERROR; - } - } - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - - /* - * If a socket was bound with I/O completion port - * then GetQueuedCompletionStatus() would anyway return its status - * despite that WSARecv() was already completed. - */ - - return NGX_AGAIN; - } - - return bytes; -} - -#endif diff --git a/src/os/win32/ngx_wsasend_chain.c b/src/os/win32/ngx_wsasend_chain.c index 08f93c80b..1d75e0969 100644 --- a/src/os/win32/ngx_wsasend_chain.c +++ b/src/os/win32/ngx_wsasend_chain.c @@ -9,17 +9,21 @@ #include <ngx_event.h> +#define NGX_WSABUFS 8 + + ngx_chain_t *ngx_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) { int rc; u_char *prev; - size_t size; - u_long sent; - LPWSABUF wsabuf; + u_long size, sent, send, sprev; + ngx_uint_t complete; ngx_err_t err; ngx_event_t *wev; - ngx_array_t wsabufs; + ngx_array_t vec; + LPWSABUF wsabuf; + WSABUF wsabufs[NGX_WSABUFS]; ngx_chain_t *cl; wev = c->write; @@ -28,80 +32,119 @@ ngx_chain_t *ngx_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, return in; } + send = 0; + complete = 0; + /* * WSABUFs must be 4-byte aligned otherwise * WSASend() will return undocumented WSAEINVAL error. */ - ngx_init_array(wsabufs, c->pool, 10, sizeof(WSABUF), NGX_CHAIN_ERROR); + vec.elts = wsabufs; + vec.size = sizeof(WSABUF); + vec.nalloc = NGX_WSABUFS; + vec.pool = c->pool; - prev = NULL; - wsabuf = NULL; + for ( ;; ) { + prev = NULL; + wsabuf = NULL; + sprev = send; - /* create the WSABUF and coalesce the neighbouring bufs */ + vec.nelts = 0; - for (cl = in; cl; cl = cl->next) { + /* create the WSABUF and coalesce the neighbouring bufs */ - if (prev == cl->buf->pos) { - wsabuf->len += cl->buf->last - cl->buf->pos; - prev = cl->buf->last; + for (cl = in; + cl && vec.nelts < ngx_max_wsabufs && send < limit; + cl = cl->next) + { + if (ngx_buf_special(cl->buf)) { + continue; + } + + size = cl->buf->last - cl->buf->pos; + + if (send + size > limit) { + size = (u_long) (limit - send); + } + + if (prev == cl->buf->pos) { + wsabuf->len += cl->buf->last - cl->buf->pos; + + } else { + if (!(wsabuf = ngx_array_push(&vec))) { + return NGX_CHAIN_ERROR; + } + + wsabuf->buf = (char *) cl->buf->pos; + wsabuf->len = cl->buf->last - cl->buf->pos; + } - } else { - ngx_test_null(wsabuf, ngx_push_array(&wsabufs), NGX_CHAIN_ERROR); - wsabuf->buf = (char *) cl->buf->pos; - wsabuf->len = cl->buf->last - cl->buf->pos; prev = cl->buf->last; + send += size; } - } - rc = WSASend(c->fd, wsabufs.elts, wsabufs.nelts, &sent, 0, NULL, NULL); + sent = 0; - if (rc == -1) { - err = ngx_errno; + rc = WSASend(c->fd, vec.elts, vec.nelts, &sent, 0, NULL, NULL); - if (err == WSAEWOULDBLOCK) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "WSASend() not ready"); - wev->ready = 0; - return in; + if (rc == -1) { + err = ngx_errno; - } else { - wev->error = 1; - ngx_connection_error(c, err, "WSASend() failed"); - return NGX_CHAIN_ERROR; + if (err == WSAEWOULDBLOCK) { + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "WSASend() not ready"); + + } else { + wev->error = 1; + ngx_connection_error(c, err, "WSASend() failed"); + return NGX_CHAIN_ERROR; + } } - } - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "WSASend: %d", sent); + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, + "WSASend: fd:%d, s:%ul", c->fd, sent); - c->sent += sent; + if (send - sprev == sent) { + complete = 1; + } - for (cl = in; cl && sent > 0; cl = cl->next) { + c->sent += sent; - size = cl->buf->last - cl->buf->pos; + for (cl = in; cl && sent > 0; cl = cl->next) { + if (ngx_buf_special(cl->buf)) { + continue; + } - if (sent >= size) { - sent -= size; + if (sent == 0) { + break; + } - if (ngx_buf_in_memory(cl->buf)) { + size = cl->buf->last - cl->buf->pos; + + if (sent >= size) { + sent -= size; cl->buf->pos = cl->buf->last; + + continue; } - continue; + cl->buf->pos += sent; + + break; } - if (ngx_buf_in_memory(cl->buf)) { - cl->buf->pos += sent; + if (!complete) { + wev->ready = 0; + return cl; } - break; - } + if (send >= limit || cl == NULL) { + return cl; + } - if (cl) { - wev->ready = 0; + in = cl; } - - return cl; } @@ -111,13 +154,14 @@ ngx_chain_t *ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, int rc; u_char *prev; size_t size; - u_long sent; + u_long send, sent; LPWSABUF wsabuf; ngx_err_t err; ngx_event_t *wev; - ngx_array_t wsabufs; + ngx_array_t vec; ngx_chain_t *cl; LPWSAOVERLAPPED ovlp; + WSABUF wsabufs[NGX_WSABUFS]; wev = c->write; @@ -125,6 +169,9 @@ ngx_chain_t *ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, return in; } + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, + "wev->complete: %d", wev->complete); + if (!wev->complete) { /* post the overlapped WSASend() */ @@ -134,32 +181,52 @@ ngx_chain_t *ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, * WSASend() will return undocumented WSAEINVAL error. */ - ngx_init_array(wsabufs, c->pool, 10, sizeof(WSABUF), NGX_CHAIN_ERROR); + vec.elts = wsabufs; + vec.nelts = 0; + vec.size = sizeof(WSABUF); + vec.nalloc = NGX_WSABUFS; + vec.pool = c->pool; + send = 0; prev = NULL; wsabuf = NULL; /* create the WSABUF and coalesce the neighbouring bufs */ - for (cl = in; cl; cl = cl->next) { + for (cl = in; + cl && vec.nelts < ngx_max_wsabufs && send < limit; + cl = cl->next) + { + if (ngx_buf_special(cl->buf)) { + continue; + } + + size = cl->buf->last - cl->buf->pos; + + if (send + size > limit) { + size = (u_long) (limit - send); + } if (prev == cl->buf->pos) { wsabuf->len += cl->buf->last - cl->buf->pos; - prev = cl->buf->last; - + } else { - ngx_test_null(wsabuf, ngx_push_array(&wsabufs), - NGX_CHAIN_ERROR); + if (!(wsabuf = ngx_array_push(&vec))) { + return NGX_CHAIN_ERROR; + } + wsabuf->buf = (char *) cl->buf->pos; wsabuf->len = cl->buf->last - cl->buf->pos; - prev = cl->buf->last; } + + prev = cl->buf->last; + send += size; } ovlp = (LPWSAOVERLAPPED) &c->write->ovlp; ngx_memzero(ovlp, sizeof(WSAOVERLAPPED)); - rc = WSASend(c->fd, wsabufs.elts, wsabufs.nelts, &sent, 0, ovlp, NULL); + rc = WSASend(c->fd, vec.elts, vec.nelts, &sent, 0, ovlp, NULL); wev->complete = 0; @@ -167,6 +234,8 @@ ngx_chain_t *ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, err = ngx_errno; if (err == WSA_IO_PENDING) { + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "WSASend() posted"); wev->active = 1; return in; @@ -188,6 +257,9 @@ ngx_chain_t *ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, return in; } + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, + "WSASend: fd:%d, s:%ul", c->fd, sent); + } else { /* the overlapped WSASend() complete */ @@ -214,27 +286,30 @@ ngx_chain_t *ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, } } - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "WSASend: %d", sent); + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, + "WSASend ovlp: fd:%d, s:%ul", c->fd, sent); c->sent += sent; for (cl = in; cl && sent > 0; cl = cl->next) { + if (ngx_buf_special(cl->buf)) { + continue; + } + + if (sent == 0) { + break; + } size = cl->buf->last - cl->buf->pos; if (sent >= size) { sent -= size; - - if (ngx_buf_in_memory(cl->buf)) { - cl->buf->pos = cl->buf->last; - } + cl->buf->pos = cl->buf->last; continue; } - if (ngx_buf_in_memory(cl->buf)) { - cl->buf->pos += sent; - } + cl->buf->pos += sent; break; } diff --git a/src/os/win32/tray.ico b/src/os/win32/tray.ico Binary files differnew file mode 100644 index 000000000..077cbac27 --- /dev/null +++ b/src/os/win32/tray.ico |