comparison src/event/modules/ngx_iocp_module.c @ 278:0ba4821f4460

nginx-0.0.2-2004-03-04-10:04:55 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 04 Mar 2004 07:04:55 +0000
parents bdd631bf1a1c
children 7c7183b3ea8b
comparison
equal deleted inserted replaced
277:e91499541410 278:0ba4821f4460
1 1
2 /* 2 /*
3 * Copyright (C) 2002-2003 Igor Sysoev, http://sysoev.ru 3 * Copyright (C) 2002-2004 Igor Sysoev, http://sysoev.ru/en/
4 */ 4 */
5 5
6 6
7 #include <ngx_config.h> 7 #include <ngx_config.h>
8 #include <ngx_core.h> 8 #include <ngx_core.h>
9 #include <ngx_event.h> 9 #include <ngx_event.h>
10 #include <ngx_iocp_module.h> 10 #include <ngx_iocp_module.h>
11 11
12 12
13 static int ngx_iocp_init(ngx_cycle_t *cycle); 13 static ngx_int_t ngx_iocp_init(ngx_cycle_t *cycle);
14 static void ngx_iocp_done(ngx_cycle_t *cycle); 14 static void ngx_iocp_done(ngx_cycle_t *cycle);
15 static int ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key); 15 static ngx_int_t ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key);
16 static int ngx_iocp_del_connection(ngx_connection_t *c, u_int flags); 16 static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, u_int flags);
17 static int ngx_iocp_process_events(ngx_log_t *log); 17 static ngx_int_t ngx_iocp_process_events(ngx_log_t *log);
18 static void *ngx_iocp_create_conf(ngx_cycle_t *cycle); 18 static void *ngx_iocp_create_conf(ngx_cycle_t *cycle);
19 static char *ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf); 19 static char *ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf);
20 20
21 21
22 static ngx_str_t iocp_name = ngx_string("iocp"); 22 static ngx_str_t iocp_name = ngx_string("iocp");
87 87
88 88
89 static HANDLE iocp; 89 static HANDLE iocp;
90 90
91 91
92 static int ngx_iocp_init(ngx_cycle_t *cycle) 92 static ngx_int_t ngx_iocp_init(ngx_cycle_t *cycle)
93 { 93 {
94 ngx_iocp_conf_t *cf; 94 ngx_iocp_conf_t *cf;
95 95
96 cf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module); 96 cf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module);
97 97
104 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, 104 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
105 "CreateIoCompletionPort() failed"); 105 "CreateIoCompletionPort() failed");
106 return NGX_ERROR; 106 return NGX_ERROR;
107 } 107 }
108 108
109 if (ngx_event_timer_init(cycle) == NGX_ERROR) {
110 return NGX_ERROR;
111 }
112
113 ngx_io = ngx_iocp_io; 109 ngx_io = ngx_iocp_io;
114 110
115 ngx_event_actions = ngx_iocp_module_ctx.actions; 111 ngx_event_actions = ngx_iocp_module_ctx.actions;
116 112
117 ngx_event_flags = NGX_USE_AIO_EVENT|NGX_USE_IOCP_EVENT; 113 ngx_event_flags = NGX_USE_AIO_EVENT|NGX_USE_IOCP_EVENT;
126 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, 122 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
127 "iocp CloseHandle() failed"); 123 "iocp CloseHandle() failed");
128 } 124 }
129 125
130 iocp = NULL; 126 iocp = NULL;
131 127 }
132 ngx_event_timer_done(cycle); 128
133 } 129
134 130 static ngx_int_t ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key)
135
136 static int ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key)
137 { 131 {
138 ngx_connection_t *c; 132 ngx_connection_t *c;
139 133
140 c = (ngx_connection_t *) ev->data; 134 c = (ngx_connection_t *) ev->data;
141 135
142 c->read->active = 1; 136 c->read->active = 1;
143 c->write->active = 1; 137 c->write->active = 1;
144 138
145 ngx_log_debug(ev->log, "iocp add: %d, %d:%08x" _ c->fd _ key _ &ev->ovlp); 139 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
140 "iocp add: fd:%d k:%d ov:" PTR_FMT, c->fd, key, &ev->ovlp);
146 141
147 if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) { 142 if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) {
148 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, 143 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
149 "CreateIoCompletionPort() failed"); 144 "CreateIoCompletionPort() failed");
150 return NGX_ERROR; 145 return NGX_ERROR;
152 147
153 return NGX_OK; 148 return NGX_OK;
154 } 149 }
155 150
156 151
157 static int ngx_iocp_del_connection(ngx_connection_t *c, u_int flags) 152 static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, u_int flags)
158 { 153 {
159 if (CancelIo((HANDLE) c->fd) == 0) { 154 if (CancelIo((HANDLE) c->fd) == 0) {
160 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed"); 155 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed");
161 return NGX_ERROR; 156 return NGX_ERROR;
162 } 157 }
163 158
164 return NGX_OK; 159 return NGX_OK;
165 } 160 }
166 161
167 162
168 static int ngx_iocp_process_events(ngx_log_t *log) 163 static ngx_int_t ngx_iocp_process_events(ngx_log_t *log)
169 { 164 {
170 int rc; 165 int rc;
171 u_int key; 166 u_int key;
172 size_t bytes; 167 size_t bytes;
173 ngx_err_t err; 168 ngx_err_t err;
176 struct timeval tv; 171 struct timeval tv;
177 ngx_epoch_msec_t delta; 172 ngx_epoch_msec_t delta;
178 ngx_event_ovlp_t *ovlp; 173 ngx_event_ovlp_t *ovlp;
179 174
180 timer = ngx_event_find_timer(); 175 timer = ngx_event_find_timer();
181 176 ngx_old_elapsed_msec = ngx_elapsed_msec;
182 if (timer) { 177
183 ngx_gettimeofday(&tv); 178 if (timer == 0) {
184 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
185
186 } else {
187 timer = INFINITE; 179 timer = INFINITE;
188 delta = 0; 180 }
189 } 181
190 182 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "iocp timer: %d", timer);
191 ngx_log_debug(log, "iocp timer: %d" _ timer);
192 183
193 rc = GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &key, 184 rc = GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &key,
194 (LPOVERLAPPED *) &ovlp, timer); 185 (LPOVERLAPPED *) &ovlp, timer);
195
196 ngx_log_debug(log, "iocp: %d, %d, %d:%08x" _ rc _ bytes _ key _ ovlp);
197 186
198 if (rc == 0) { 187 if (rc == 0) {
199 err = ngx_errno; 188 err = ngx_errno;
200 } else { 189 } else {
201 err = 0; 190 err = 0;
202 } 191 }
203 192
204 ngx_gettimeofday(&tv); 193 ngx_gettimeofday(&tv);
205 194 ngx_time_update(tv.tv_sec);
206 if (ngx_cached_time != tv.tv_sec) { 195
207 ngx_cached_time = tv.tv_sec; 196 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0,
208 ngx_time_update(); 197 "iocp: %d b:%d k:%d ov:" PTR_FMT, rc, bytes, key, ovlp);
209 } 198
210 199 delta = ngx_elapsed_msec;
211 if (timer != INFINITE) { 200 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec;
212 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
213 ngx_event_expire_timers((ngx_msec_t) delta);
214 }
215 201
216 if (err) { 202 if (err) {
217 if (ovlp == NULL) { 203 if (ovlp == NULL) {
218 if (err != WAIT_TIMEOUT) { 204 if (err != WAIT_TIMEOUT) {
219 ngx_log_error(NGX_LOG_ALERT, log, err, 205 ngx_log_error(NGX_LOG_ALERT, log, err,
225 } else { 211 } else {
226 ovlp->error = err; 212 ovlp->error = err;
227 } 213 }
228 } 214 }
229 215
216 if (timer != INFINITE) {
217 delta = ngx_elapsed_msec - delta;
218
219 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
220 "iocp timer: %d, delta: %d", timer, (int) delta);
221 }
222
230 if (ovlp) { 223 if (ovlp) {
231 ev = ovlp->event; 224 ev = ovlp->event;
232 225
233 ngx_log_debug(log, "iocp ev: %08x" _ ev); 226 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "iocp event:" PTR_FMT, ev);
234 227
235 switch (key) { 228 switch (key) {
229
236 case NGX_IOCP_ACCEPT: 230 case NGX_IOCP_ACCEPT:
237 if (bytes) { 231 if (bytes) {
238 ev->ready = 1; 232 ev->ready = 1;
239 } 233 }
240 break; 234 break;
248 ev->ready = 1; 242 ev->ready = 1;
249 } 243 }
250 244
251 ev->available = bytes; 245 ev->available = bytes;
252 246
253 ngx_log_debug(log, "iocp ev handler: %08x" _ ev->event_handler); 247 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
248 "iocp event handler: %08x" PTR_FMT, ev->event_handler);
254 249
255 ev->event_handler(ev); 250 ev->event_handler(ev);
251 }
252
253 if (timer != INFINITE && delta) {
254 ngx_event_expire_timers((ngx_msec_t) delta);
256 } 255 }
257 256
258 return NGX_OK; 257 return NGX_OK;
259 } 258 }
260 259