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;