comparison src/event/modules/ngx_kqueue_module.c @ 113:d7f606e25b99

nginx-0.0.1-2003-07-04-19:10:33 import
author Igor Sysoev <igor@sysoev.ru>
date Fri, 04 Jul 2003 15:10:33 +0000
parents da763a85be66
children ac69ab96328d
comparison
equal deleted inserted replaced
112:da763a85be66 113:d7f606e25b99
9 #include <ngx_event.h> 9 #include <ngx_event.h>
10 #include <ngx_kqueue_module.h> 10 #include <ngx_kqueue_module.h>
11 11
12 12
13 typedef struct { 13 typedef struct {
14 int kqueue;
15 struct kevent *change_list;
16 u_int changes; 14 u_int changes;
17 struct kevent *event_list;
18 u_int events; 15 u_int events;
19 } ngx_kqueue_conf_t; 16 } ngx_kqueue_conf_t;
20 17
21 18
22 static int ngx_kqueue_init(ngx_log_t *log); 19 static int ngx_kqueue_init(ngx_cycle_t *cycle);
23 static void ngx_kqueue_done(ngx_log_t *log); 20 static void ngx_kqueue_done(ngx_cycle_t *cycle);
24 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags); 21 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags);
25 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags); 22 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags);
26 static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags); 23 static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags);
27 static int ngx_kqueue_process_events(ngx_log_t *log); 24 static int ngx_kqueue_process_events(ngx_log_t *log);
28 25
70 ngx_kqueue_del_event, /* disable an event */ 67 ngx_kqueue_del_event, /* disable an event */
71 NULL, /* add an connection */ 68 NULL, /* add an connection */
72 NULL, /* delete an connection */ 69 NULL, /* delete an connection */
73 ngx_kqueue_process_events, /* process the events */ 70 ngx_kqueue_process_events, /* process the events */
74 ngx_kqueue_init, /* init the events */ 71 ngx_kqueue_init, /* init the events */
75 #if 0
76 ngx_kqueue_commit, /* commit the events */
77 ngx_kqueue_rollback, /* rollback the events */
78 #endif
79 ngx_kqueue_done /* done the events */ 72 ngx_kqueue_done /* done the events */
80 } 73 }
81 74
82 }; 75 };
83 76
85 NGX_MODULE, 78 NGX_MODULE,
86 &ngx_kqueue_module_ctx, /* module context */ 79 &ngx_kqueue_module_ctx, /* module context */
87 ngx_kqueue_commands, /* module directives */ 80 ngx_kqueue_commands, /* module directives */
88 NGX_EVENT_MODULE, /* module type */ 81 NGX_EVENT_MODULE, /* module type */
89 NULL, /* init module */ 82 NULL, /* init module */
90 NULL, /* commit module */
91 NULL, /* rollback module */
92 #if 0
93 NULL /* init child */ 83 NULL /* init child */
94 #endif
95 }; 84 };
96 85
97 86
98 #if 0 87
99 88 static int ngx_kqueue_init(ngx_cycle_t *cycle)
100 static int ngx_kqueue_init(ngx_cycle_t *cycle, ngx_log_t *log)
101 { 89 {
102 struct timespec ts; 90 struct timespec ts;
103 ngx_kqueue_conf_t *kcf; 91 ngx_kqueue_conf_t *kcf;
104 92
105 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module); 93 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module);
106 94
107 ngx_log_debug(log, "CH: %d" _ kcf->changes); 95 ngx_log_debug(cycle->log, "CH: %d" _ kcf->changes);
108 ngx_log_debug(log, "EV: %d" _ kcf->events); 96 ngx_log_debug(cycle->log, "EV: %d" _ kcf->events);
109 97
110 if (ngx_kqueue == -1) { 98 if (ngx_kqueue == -1) {
111 kcf->kqueue = kqueue(); 99 ngx_kqueue = kqueue();
112 100
113 if (kcf->kqueue == -1) { 101 if (ngx_kqueue == -1) {
114 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed"); 102 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
103 "kqueue() failed");
115 return NGX_ERROR; 104 return NGX_ERROR;
116 } 105 }
117
118 } else {
119 kcf->kqueue = ngx_kqueue;
120 } 106 }
121 107
122 if (max_changes < kcf->changes) { 108 if (max_changes < kcf->changes) {
123 if (nchanges) { 109 if (nchanges) {
124 ts.tv_sec = 0; 110 ts.tv_sec = 0;
125 ts.tv_nsec = 0; 111 ts.tv_nsec = 0;
126 112
127 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) { 113 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) {
128 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent() failed"); 114 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
115 "kevent() failed");
129 return NGX_ERROR; 116 return NGX_ERROR;
130 } 117 }
131
132 nchanges = 0; 118 nchanges = 0;
133 } 119 }
134 120
135 ngx_test_null(kcf->change_list, 121 if (change_list) {
136 ngx_alloc(kcf->changes * sizeof(struct kevent), log), 122 ngx_free(change_list);
123 }
124
125 ngx_test_null(change_list,
126 ngx_alloc(kcf->changes * sizeof(struct kevent),
127 cycle->log),
137 NGX_ERROR); 128 NGX_ERROR);
138 129 }
139 } else { 130
140 kcf->change_list = change_list; 131 max_changes = kcf->changes;
141 }
142 132
143 if (nevents < kcf->events) { 133 if (nevents < kcf->events) {
144 ngx_test_null(kcf->event_list, 134 if (event_list) {
145 ngx_alloc(kcf->events * sizeof(struct kevent), log), 135 ngx_free(event_list);
136 }
137
138 ngx_test_null(event_list,
139 ngx_alloc(kcf->events * sizeof(struct kevent),
140 cycle->log),
146 NGX_ERROR); 141 NGX_ERROR);
147 } else { 142 }
148 kcf->event_list = event_list; 143
149 } 144 nevents = kcf->events;
150 145
151 if (ngx_event_timer_init(cycle, log) == NGX_ERROR) { 146 if (ngx_event_timer_init(cycle) == NGX_ERROR) {
152 return NGX_ERROR; 147 return NGX_ERROR;
153 } 148 }
154 149
155 return NGX_OK; 150 ngx_io = ngx_os_io;
156 }
157
158
159 static void ngx_kqueue_commit(ngx_cycle_t *cycle, ngx_log_t *log)
160 {
161 ngx_kqueue_conf_t *kcf;
162
163 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module);
164
165 ngx_kqueue = kcf->kqueue;
166
167 if (change_list != kcf->change_list) {
168 ngx_free(change_list);
169 change_list = kcf->change_list;
170 }
171
172 max_changes = kcf->changes;
173
174 if (event_list != kcf->event_list) {
175 ngx_free(event_list);
176 event_list = kcf->event_list;
177 }
178
179 nevents = kcf->events;
180
181 ngx_event_timer_commit(cycle, log);
182 151
183 ngx_event_actions = ngx_kqueue_module_ctx.actions; 152 ngx_event_actions = ngx_kqueue_module_ctx.actions;
184 ngx_io = ngx_os_io;
185 153
186 ngx_event_flags = NGX_HAVE_LEVEL_EVENT 154 ngx_event_flags = NGX_HAVE_LEVEL_EVENT
187 |NGX_HAVE_ONESHOT_EVENT 155 |NGX_HAVE_ONESHOT_EVENT
188 #if (HAVE_CLEAR_EVENT) 156 #if (HAVE_CLEAR_EVENT)
189 |NGX_HAVE_CLEAR_EVENT 157 |NGX_HAVE_CLEAR_EVENT
192 #endif 160 #endif
193 #if (HAVE_LOWAT_EVENT) 161 #if (HAVE_LOWAT_EVENT)
194 |NGX_HAVE_LOWAT_EVENT 162 |NGX_HAVE_LOWAT_EVENT
195 #endif 163 #endif
196 |NGX_HAVE_KQUEUE_EVENT; 164 |NGX_HAVE_KQUEUE_EVENT;
197 }
198
199
200 static void ngx_kqueue_rollback(ngx_cycle_t *cycle, ngx_log_t *log)
201 {
202 ngx_kqueue_conf_t *kcf;
203
204 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module);
205
206 if (ngx_kqueue == -1) {
207 if (close(kcf->kqueue) == -1) {
208 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
209 "kqueue close() failed");
210 }
211 }
212
213 if (change_list != kcf->change_list) {
214 ngx_free(kcf->change_list);
215 }
216
217 if (event_list != kcf->event_list) {
218 ngx_free(kcf->event_list);
219 }
220
221 ngx_event_timer_rollback(cycle, log);
222 }
223
224 #endif
225
226
227 static int ngx_kqueue_init(ngx_log_t *log)
228 {
229 struct timespec ts;
230 ngx_kqueue_conf_t *kcf;
231
232 kcf = ngx_event_get_conf(ngx_kqueue_module);
233
234 ngx_log_debug(log, "CH: %d" _ kcf->changes);
235 ngx_log_debug(log, "EV: %d" _ kcf->events);
236
237 if (ngx_kqueue == -1) {
238 ngx_kqueue = kqueue();
239
240 if (ngx_kqueue == -1) {
241 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed");
242 return NGX_ERROR;
243 }
244 }
245
246 if (max_changes < kcf->changes) {
247 if (nchanges) {
248 ts.tv_sec = 0;
249 ts.tv_nsec = 0;
250
251 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) {
252 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent() failed");
253 return NGX_ERROR;
254 }
255 }
256
257 if (change_list) {
258 ngx_free(change_list);
259 }
260
261 ngx_test_null(change_list,
262 ngx_alloc(kcf->changes * sizeof(struct kevent), log),
263 NGX_ERROR);
264 }
265
266 max_changes = kcf->changes;
267 nchanges = 0;
268
269 if (nevents < kcf->events) {
270 if (event_list) {
271 ngx_free(event_list);
272 }
273
274 ngx_test_null(event_list,
275 ngx_alloc(kcf->events * sizeof(struct kevent), log),
276 NGX_ERROR);
277 }
278
279 nevents = kcf->events;
280
281 if (ngx_event_timer_init(log) == NGX_ERROR) {
282 return NGX_ERROR;
283 }
284
285 /* TODO: re-add active events with new udata
286 if ecf->connections was increased */
287
288 ngx_event_actions = ngx_kqueue_module_ctx.actions;
289
290 ngx_event_flags = NGX_HAVE_LEVEL_EVENT
291 |NGX_HAVE_ONESHOT_EVENT
292 #if (HAVE_CLEAR_EVENT)
293 |NGX_HAVE_CLEAR_EVENT
294 #else
295 |NGX_USE_LEVEL_EVENT
296 #endif
297 #if (HAVE_LOWAT_EVENT)
298 |NGX_HAVE_LOWAT_EVENT
299 #endif
300 |NGX_HAVE_KQUEUE_EVENT;
301 165
302 return NGX_OK; 166 return NGX_OK;
303 } 167 }
304 168
305 169
306 static void ngx_kqueue_done(ngx_log_t *log) 170 static void ngx_kqueue_done(ngx_cycle_t *cycle)
307 { 171 {
308 if (close(ngx_kqueue) == -1) { 172 if (close(ngx_kqueue) == -1) {
309 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kqueue close() failed"); 173 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
174 "kqueue close() failed");
310 } 175 }
311 176
312 ngx_kqueue = -1; 177 ngx_kqueue = -1;
313 178
314 ngx_event_timer_done(log); 179 ngx_event_timer_done(cycle);
315 180
316 ngx_free(change_list); 181 ngx_free(change_list);
317 ngx_free(event_list); 182 ngx_free(event_list);
318 183
319 change_list = NULL; 184 change_list = NULL;