Mercurial > hg > nginx
comparison src/event/modules/ngx_iocp_module.c @ 59:e8cdc2989cee
nginx-0.0.1-2003-02-06-20:21:13 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 06 Feb 2003 17:21:13 +0000 |
parents | |
children | e43f406e4525 |
comparison
equal
deleted
inserted
replaced
58:6b13b1cadabe | 59:e8cdc2989cee |
---|---|
1 | |
2 #include <ngx_config.h> | |
3 | |
4 #include <ngx_core.h> | |
5 #include <ngx_log.h> | |
6 #include <ngx_errno.h> | |
7 #include <ngx_time.h> | |
8 #include <ngx_connection.h> | |
9 #include <ngx_event.h> | |
10 #include <ngx_event_timer.h> | |
11 | |
12 #include <ngx_iocp_module.h> | |
13 | |
14 | |
15 int ngx_iocp_threads = 0;; | |
16 | |
17 | |
18 static HANDLE iocp; | |
19 static ngx_event_t *timer_queue; | |
20 | |
21 | |
22 int ngx_iocp_init(int max_connections, ngx_log_t *log) | |
23 { | |
24 iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, | |
25 NULL, 0, ngx_iocp_threads); | |
26 | |
27 if (iocp == NULL) { | |
28 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, | |
29 "CreateIoCompletionPort() failed"); | |
30 return NGX_ERROR; | |
31 } | |
32 | |
33 timer_queue = ngx_event_init_timer(log); | |
34 if (timer_queue == NULL) { | |
35 return NGX_ERROR; | |
36 } | |
37 | |
38 ngx_event_actions.process = ngx_iocp_process_events; | |
39 | |
40 ngx_event_flags = NGX_HAVE_AIO_EVENT|NGX_HAVE_IOCP_EVENT; | |
41 | |
42 return NGX_OK; | |
43 } | |
44 | |
45 | |
46 int ngx_iocp_add_event(ngx_event_t *ev) | |
47 { | |
48 ngx_connection_t *c; | |
49 | |
50 c = (ngx_connection_t *) ev->data; | |
51 | |
52 ngx_log_debug(ev->log, "iocp: %d, %08x:%08x" _ c->fd _ ev _ &ev->ovlp); | |
53 | |
54 if (CreateIoCompletionPort((HANDLE) c->fd, iocp, (DWORD) ev, 0) == NULL) { | |
55 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, | |
56 "CreateIoCompletionPort() failed"); | |
57 return NGX_ERROR; | |
58 } | |
59 | |
60 return NGX_OK; | |
61 } | |
62 | |
63 | |
64 int ngx_iocp_process_events(ngx_log_t *log) | |
65 { | |
66 int rc; | |
67 size_t bytes; | |
68 ngx_err_t err; | |
69 ngx_msec_t timer, delta; | |
70 ngx_event_t *ev, *e; | |
71 ngx_event_ovlp_t *ovlp; | |
72 | |
73 ngx_log_debug(log, "iocp"); | |
74 | |
75 timer = ngx_event_find_timer(); | |
76 | |
77 if (timer) { | |
78 delta = ngx_msec(); | |
79 | |
80 } else { | |
81 timer = INFINITE; | |
82 delta = 0; | |
83 } | |
84 | |
85 ngx_log_debug(log, "iocp timer: %d" _ timer); | |
86 | |
87 #if 1 | |
88 rc = GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &e, | |
89 (LPOVERLAPPED *) &ovlp, timer); | |
90 ngx_log_debug(log, "iocp: %d, %d:%08x:%08x" _ rc _ bytes _ e _ ovlp); | |
91 if (rc == 0) { | |
92 #else | |
93 if (GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &e, | |
94 (LPOVERLAPPED *) &ovlp, timer) == 0) { | |
95 #endif | |
96 err = ngx_errno; | |
97 | |
98 if (ovlp == NULL) { | |
99 if (err != WAIT_TIMEOUT) { | |
100 ngx_log_error(NGX_LOG_ALERT, log, err, | |
101 "GetQueuedCompletionStatus() failed"); | |
102 | |
103 return NGX_ERROR; | |
104 } | |
105 | |
106 } else { | |
107 ovlp->error = err; | |
108 } | |
109 } | |
110 | |
111 if (timer != INFINITE) { | |
112 delta = ngx_msec() - delta; | |
113 } | |
114 | |
115 if (ovlp) { | |
116 ev = ovlp->event; | |
117 | |
118 ngx_log_debug(log, "iocp ev: %08x" _ ev); | |
119 | |
120 if (ev == e) { | |
121 ev->ready = 1; | |
122 ev->available = bytes; | |
123 } | |
124 | |
125 ngx_log_debug(log, "iocp ev: %08x" _ ev->event_handler); | |
126 | |
127 if (ev->event_handler(ev) == NGX_ERROR) { | |
128 ev->close_handler(ev); | |
129 } | |
130 } | |
131 | |
132 if (timer != INFINITE) { | |
133 ngx_event_expire_timers(delta); | |
134 } | |
135 | |
136 return NGX_OK; | |
137 } |