Mercurial > hg > nginx-vendor-0-7
comparison src/os/unix/ngx_process_cycle.c @ 10:46833bd150cb NGINX_0_1_5
nginx 0.1.5
*) Bugfix: on Solaris and Linux there may be too many "recvmsg()
returned not enough data" alerts.
*) Bugfix: there were the "writev() failed (22: Invalid argument)"
errors on Solaris in proxy mode without sendfile. On other platforms
that do not support sendfile at all the process got caught in an
endless loop.
*) Bugfix: segmentation fault on Solaris in proxy mode and using
sendfile.
*) Bugfix: segmentation fault on Solaris.
*) Bugfix: on-line upgrade did not work on Linux.
*) Bugfix: the ngx_http_autoindex_module module did not escape the
spaces, the quotes, and the percent signs in the directory listing.
*) Change: the decrease of the copy operations.
*) Feature: the userid_p3p directive.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Thu, 11 Nov 2004 00:00:00 +0300 |
parents | 4b2dafa26fe2 |
children | 74b1868dd3cd |
comparison
equal
deleted
inserted
replaced
9:77eee314ddbd | 10:46833bd150cb |
---|---|
320 { | 320 { |
321 continue; | 321 continue; |
322 } | 322 } |
323 | 323 |
324 ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0, | 324 ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0, |
325 "pass channel s:%d pid:" PID_T_FMT | 325 "pass channel s:%d pid:%P fd:%d to s:%i pid:%P fd:%d", |
326 " fd:%d to s:%d pid:" PID_T_FMT " fd:%d", | 326 ch.slot, ch.pid, ch.fd, |
327 ch.slot, ch.pid, ch.fd, | 327 i, ngx_processes[i].pid, |
328 i, ngx_processes[i].pid, | 328 ngx_processes[i].channel[0]); |
329 ngx_processes[i].channel[0]); | |
330 | 329 |
331 /* TODO: NGX_AGAIN */ | 330 /* TODO: NGX_AGAIN */ |
332 | 331 |
333 ngx_write_channel(ngx_processes[i].channel[0], | 332 ngx_write_channel(ngx_processes[i].channel[0], |
334 &ch, sizeof(ngx_channel_t), cycle->log); | 333 &ch, sizeof(ngx_channel_t), cycle->log); |
382 | 381 |
383 | 382 |
384 for (i = 0; i < ngx_last_process; i++) { | 383 for (i = 0; i < ngx_last_process; i++) { |
385 | 384 |
386 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 385 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
387 "child: %d " PID_T_FMT " e:%d t:%d d:%d r:%d j:%d", | 386 "child: %d %P e:%d t:%d d:%d r:%d j:%d", |
388 i, | 387 i, |
389 ngx_processes[i].pid, | 388 ngx_processes[i].pid, |
390 ngx_processes[i].exiting, | 389 ngx_processes[i].exiting, |
391 ngx_processes[i].exited, | 390 ngx_processes[i].exited, |
392 ngx_processes[i].detached, | 391 ngx_processes[i].detached, |
419 continue; | 418 continue; |
420 } | 419 } |
421 } | 420 } |
422 | 421 |
423 ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, | 422 ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, |
424 "kill (" PID_T_FMT ", %d)" , | 423 "kill (%P, %d)" , ngx_processes[i].pid, signo); |
425 ngx_processes[i].pid, signo); | |
426 | 424 |
427 if (kill(ngx_processes[i].pid, signo) == -1) { | 425 if (kill(ngx_processes[i].pid, signo) == -1) { |
428 err = ngx_errno; | 426 err = ngx_errno; |
429 ngx_log_error(NGX_LOG_ALERT, cycle->log, err, | 427 ngx_log_error(NGX_LOG_ALERT, cycle->log, err, |
430 "kill(%d, %d) failed", | 428 "kill(%P, %d) failed", |
431 ngx_processes[i].pid, signo); | 429 ngx_processes[i].pid, signo); |
432 | 430 |
433 if (err == NGX_ESRCH) { | 431 if (err == NGX_ESRCH) { |
434 ngx_processes[i].exited = 1; | 432 ngx_processes[i].exited = 1; |
435 ngx_processes[i].exiting = 0; | 433 ngx_processes[i].exiting = 0; |
457 | 455 |
458 live = 0; | 456 live = 0; |
459 for (i = 0; i < ngx_last_process; i++) { | 457 for (i = 0; i < ngx_last_process; i++) { |
460 | 458 |
461 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 459 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
462 "child: %d " PID_T_FMT " e:%d t:%d d:%d r:%d j:%d", | 460 "child: %d %P e:%d t:%d d:%d r:%d j:%d", |
463 i, | 461 i, |
464 ngx_processes[i].pid, | 462 ngx_processes[i].pid, |
465 ngx_processes[i].exiting, | 463 ngx_processes[i].exiting, |
466 ngx_processes[i].exited, | 464 ngx_processes[i].exited, |
467 ngx_processes[i].detached, | 465 ngx_processes[i].detached, |
490 { | 488 { |
491 continue; | 489 continue; |
492 } | 490 } |
493 | 491 |
494 ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0, | 492 ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0, |
495 "pass close channel s:%d pid:" PID_T_FMT | 493 "pass close channel s:%i pid:%P to:%P", |
496 " to:" PID_T_FMT, ch.slot, ch.pid, ngx_processes[n].pid); | 494 ch.slot, ch.pid, ngx_processes[n].pid); |
497 | 495 |
498 /* TODO: NGX_AGAIN */ | 496 /* TODO: NGX_AGAIN */ |
499 | 497 |
500 ngx_write_channel(ngx_processes[n].channel[0], | 498 ngx_write_channel(ngx_processes[n].channel[0], |
501 &ch, sizeof(ngx_channel_t), cycle->log); | 499 &ch, sizeof(ngx_channel_t), cycle->log); |
784 | 782 |
785 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler"); | 783 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler"); |
786 | 784 |
787 n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log); | 785 n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log); |
788 | 786 |
789 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %d", n); | 787 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n); |
790 | 788 |
791 if (n <= 0) { | 789 if (n == NGX_ERROR) { |
790 if (close(c->fd) == -1) { | |
791 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, | |
792 "close() channel failed"); | |
793 } | |
794 | |
795 c->fd = -1; | |
796 return; | |
797 } | |
798 | |
799 if (n == NGX_AGAIN) { | |
792 return; | 800 return; |
793 } | 801 } |
794 | 802 |
795 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, | 803 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, |
796 "channel command: %d", ch.command); | 804 "channel command: %d", ch.command); |
810 break; | 818 break; |
811 | 819 |
812 case NGX_CMD_OPEN_CHANNEL: | 820 case NGX_CMD_OPEN_CHANNEL: |
813 | 821 |
814 ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0, | 822 ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0, |
815 "get channel s:%d pid:" PID_T_FMT " fd:%d", | 823 "get channel s:%i pid:%P fd:%d", ch.slot, ch.pid, ch.fd); |
816 ch.slot, ch.pid, ch.fd); | |
817 | 824 |
818 ngx_processes[ch.slot].pid = ch.pid; | 825 ngx_processes[ch.slot].pid = ch.pid; |
819 ngx_processes[ch.slot].channel[0] = ch.fd; | 826 ngx_processes[ch.slot].channel[0] = ch.fd; |
820 break; | 827 break; |
821 | 828 |
822 case NGX_CMD_CLOSE_CHANNEL: | 829 case NGX_CMD_CLOSE_CHANNEL: |
823 | 830 |
824 ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0, | 831 ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0, |
825 "close channel s:%d pid:" PID_T_FMT " our:" PID_T_FMT | 832 "close channel s:%i pid:%P our:%P fd:%d", |
826 " fd:%d", | |
827 ch.slot, ch.pid, ngx_processes[ch.slot].pid, | 833 ch.slot, ch.pid, ngx_processes[ch.slot].pid, |
828 ngx_processes[ch.slot].channel[0]); | 834 ngx_processes[ch.slot].channel[0]); |
829 | 835 |
830 if (close(ngx_processes[ch.slot].channel[0]) == -1) { | 836 if (close(ngx_processes[ch.slot].channel[0]) == -1) { |
831 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "close() failed"); | 837 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "close() failed"); |
880 ngx_sched_yield(); | 886 ngx_sched_yield(); |
881 } | 887 } |
882 } | 888 } |
883 | 889 |
884 | 890 |
885 static void* ngx_worker_thread_cycle(void *data) | 891 static void *ngx_worker_thread_cycle(void *data) |
886 { | 892 { |
887 ngx_thread_t *thr = data; | 893 ngx_thread_t *thr = data; |
888 | 894 |
889 sigset_t set; | 895 sigset_t set; |
890 ngx_err_t err; | 896 ngx_err_t err; |
907 ngx_thread_sigmask_n " failed"); | 913 ngx_thread_sigmask_n " failed"); |
908 return (void *) 1; | 914 return (void *) 1; |
909 } | 915 } |
910 | 916 |
911 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, | 917 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, |
912 "thread " TID_T_FMT " started", ngx_thread_self()); | 918 "thread " NGX_TID_T_FMT " started", ngx_thread_self()); |
913 | 919 |
914 ngx_setthrtitle("worker thread"); | 920 ngx_setthrtitle("worker thread"); |
915 | 921 |
916 if (!(tls = ngx_calloc(sizeof(ngx_core_tls_t), cycle->log))) { | 922 if (!(tls = ngx_calloc(sizeof(ngx_core_tls_t), cycle->log))) { |
917 return (void *) 1; | 923 return (void *) 1; |
939 thr->state = NGX_THREAD_EXIT; | 945 thr->state = NGX_THREAD_EXIT; |
940 | 946 |
941 ngx_mutex_unlock(ngx_posted_events_mutex); | 947 ngx_mutex_unlock(ngx_posted_events_mutex); |
942 | 948 |
943 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, | 949 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, |
944 "thread %d is done", ngx_thread_self()); | 950 "thread " NGX_TID_T_FMT " is done", |
951 ngx_thread_self()); | |
945 | 952 |
946 return (void *) 0; | 953 return (void *) 0; |
947 } | 954 } |
948 | 955 |
949 thr->state = NGX_THREAD_BUSY; | 956 thr->state = NGX_THREAD_BUSY; |