Mercurial > hg > nginx
comparison src/os/unix/ngx_process_cycle.c @ 2111:4300c587db9e stable-0.5
r1901, r1902, r2032 merge:
bugfixes in channel:
*) avoid endless loop if epoll is used
*) use CMSG_LEN(), this fixes an alert
"sendmsg() failed (9: Bad file descriptor)" on some 64-bit platforms
*) read channel until EAGAIN
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 07 Jul 2008 11:58:55 +0000 |
parents | 2ab8bb66d3d7 |
children |
comparison
equal
deleted
inserted
replaced
2110:aeeb3ca9de06 | 2111:4300c587db9e |
---|---|
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) |