comparison src/os/unix/ngx_process_cycle.c @ 334:42974b9e97b5 NGINX_0_5_37

nginx 0.5.37 *) Bugfix: if sub_filter and SSI were used together, then responses might were transferred incorrectly. *) Bugfix: large SSI inclusions might be truncated. *) Bugfix: worker processes might not catch reconfiguration and log rotation signals. *) Bugfix: nginx could not be built on latest Fedora 9 Linux. Thanks to Roxis. *) Bugfix: a segmentation fault might occur in worker process on Linux, if keepalive was enabled. *) Bugfix: an alert "sendmsg() failed (9: Bad file descriptor)" on some 64-bit platforms while reconfiguration.
author Igor Sysoev <http://sysoev.ru>
date Mon, 07 Jul 2008 00:00:00 +0400
parents 26ff8d6b618d
children
comparison
equal deleted inserted replaced
333:30e294abe0ca 334:42974b9e97b5
1053 1053
1054 c = ev->data; 1054 c = ev->data;
1055 1055
1056 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler"); 1056 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler");
1057 1057
1058 n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log); 1058 for ( ;; ) {
1059 1059
1060 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n); 1060 n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log);
1061 1061
1062 if (n == NGX_ERROR) { 1062 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n);
1063 ngx_close_connection(c); 1063
1064 return; 1064 if (n == NGX_ERROR) {
1065 } 1065
1066 1066 if (ngx_event_flags & NGX_USE_EPOLL_EVENT) {
1067 if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) { 1067 ngx_del_conn(c, 0);
1068 if (ngx_add_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) { 1068 }
1069
1070 ngx_close_connection(c);
1069 return; 1071 return;
1070 } 1072 }
1071 } 1073
1072 1074 if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {
1073 if (n == NGX_AGAIN) { 1075 if (ngx_add_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) {
1074 return; 1076 return;
1075 } 1077 }
1076 1078 }
1077 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, 1079
1078 "channel command: %d", ch.command); 1080 if (n == NGX_AGAIN) {
1079 1081 return;
1080 switch (ch.command) { 1082 }
1081 1083
1082 case NGX_CMD_QUIT: 1084 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,
1083 ngx_quit = 1; 1085 "channel command: %d", ch.command);
1084 break; 1086
1085 1087 switch (ch.command) {
1086 case NGX_CMD_TERMINATE: 1088
1087 ngx_terminate = 1; 1089 case NGX_CMD_QUIT:
1088 break; 1090 ngx_quit = 1;
1089 1091 break;
1090 case NGX_CMD_REOPEN: 1092
1091 ngx_reopen = 1; 1093 case NGX_CMD_TERMINATE:
1092 break; 1094 ngx_terminate = 1;
1093 1095 break;
1094 case NGX_CMD_OPEN_CHANNEL: 1096
1095 1097 case NGX_CMD_REOPEN:
1096 ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0, 1098 ngx_reopen = 1;
1097 "get channel s:%i pid:%P fd:%d", ch.slot, ch.pid, ch.fd); 1099 break;
1098 1100
1099 ngx_processes[ch.slot].pid = ch.pid; 1101 case NGX_CMD_OPEN_CHANNEL:
1100 ngx_processes[ch.slot].channel[0] = ch.fd; 1102
1101 break; 1103 ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0,
1102 1104 "get channel s:%i pid:%P fd:%d",
1103 case NGX_CMD_CLOSE_CHANNEL: 1105 ch.slot, ch.pid, ch.fd);
1104 1106
1105 ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0, 1107 ngx_processes[ch.slot].pid = ch.pid;
1106 "close channel s:%i pid:%P our:%P fd:%d", 1108 ngx_processes[ch.slot].channel[0] = ch.fd;
1107 ch.slot, ch.pid, ngx_processes[ch.slot].pid, 1109 break;
1108 ngx_processes[ch.slot].channel[0]); 1110
1109 1111 case NGX_CMD_CLOSE_CHANNEL:
1110 if (close(ngx_processes[ch.slot].channel[0]) == -1) { 1112
1111 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, 1113 ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0,
1112 "close() channel failed"); 1114 "close channel s:%i pid:%P our:%P fd:%d",
1113 } 1115 ch.slot, ch.pid, ngx_processes[ch.slot].pid,
1114 1116 ngx_processes[ch.slot].channel[0]);
1115 ngx_processes[ch.slot].channel[0] = -1; 1117
1116 break; 1118 if (close(ngx_processes[ch.slot].channel[0]) == -1) {
1119 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,
1120 "close() channel failed");
1121 }
1122
1123 ngx_processes[ch.slot].channel[0] = -1;
1124 break;
1125 }
1117 } 1126 }
1118 } 1127 }
1119 1128
1120 1129
1121 #if (NGX_THREADS) 1130 #if (NGX_THREADS)