Mercurial > hg > nginx
comparison src/event/modules/ngx_kqueue_module.c @ 111:1c002f2b77ed
nginx-0.0.1-2003-07-03-20:30:22 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 03 Jul 2003 16:30:22 +0000 |
parents | 00bee6e7b485 |
children | da763a85be66 |
comparison
equal
deleted
inserted
replaced
110:152567c11325 | 111:1c002f2b77ed |
---|---|
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 u_int changes; | 14 int kqueue; |
15 u_int events; | 15 struct kevent *change_list; |
16 u_int changes; | |
17 struct kevent *event_list; | |
18 u_int events; | |
16 } ngx_kqueue_conf_t; | 19 } ngx_kqueue_conf_t; |
17 | 20 |
18 | 21 |
19 static int ngx_kqueue_init(ngx_log_t *log); | 22 static int ngx_kqueue_init(ngx_log_t *log); |
20 static void ngx_kqueue_done(ngx_log_t *log); | 23 static void ngx_kqueue_done(ngx_log_t *log); |
79 &ngx_kqueue_module_ctx, /* module context */ | 82 &ngx_kqueue_module_ctx, /* module context */ |
80 ngx_kqueue_commands, /* module directives */ | 83 ngx_kqueue_commands, /* module directives */ |
81 NGX_EVENT_MODULE, /* module type */ | 84 NGX_EVENT_MODULE, /* module type */ |
82 NULL /* init module */ | 85 NULL /* init module */ |
83 }; | 86 }; |
87 | |
88 | |
89 #if 0 | |
90 | |
91 static int ngx_kqueue_init(ngx_cycle_t *cycle, ngx_log_t *log) | |
92 { | |
93 struct timespec ts; | |
94 ngx_kqueue_conf_t *kcf; | |
95 | |
96 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module); | |
97 | |
98 ngx_log_debug(log, "CH: %d" _ kcf->changes); | |
99 ngx_log_debug(log, "EV: %d" _ kcf->events); | |
100 | |
101 if (ngx_kqueue == -1) { | |
102 kcf->kqueue = kqueue(); | |
103 | |
104 if (kcf->kqueue == -1) { | |
105 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed"); | |
106 return NGX_ERROR; | |
107 } | |
108 | |
109 } else { | |
110 kcf->kqueue = ngx_kqueue; | |
111 } | |
112 | |
113 if (max_changes < kcf->changes) { | |
114 if (nchanges) { | |
115 ts.tv_sec = 0; | |
116 ts.tv_nsec = 0; | |
117 | |
118 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) { | |
119 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent() failed"); | |
120 return NGX_ERROR; | |
121 } | |
122 | |
123 nchanges = 0; | |
124 } | |
125 | |
126 ngx_test_null(kcf->change_list, | |
127 ngx_alloc(kcf->changes * sizeof(struct kevent), log), | |
128 NGX_ERROR); | |
129 | |
130 } else { | |
131 kcf->change_list = change_list; | |
132 } | |
133 | |
134 if (nevents < kcf->events) { | |
135 ngx_test_null(kcf->event_list, | |
136 ngx_alloc(kcf->events * sizeof(struct kevent), log), | |
137 NGX_ERROR); | |
138 } else { | |
139 kcf->event_list = event_list; | |
140 } | |
141 | |
142 if (ngx_event_timer_init(cycle, log) == NGX_ERROR) { | |
143 return NGX_ERROR; | |
144 } | |
145 | |
146 return NGX_OK; | |
147 } | |
148 | |
149 | |
150 static void ngx_kqueue_commit(ngx_cycle_t *cycle, ngx_log_t *log) | |
151 { | |
152 ngx_kqueue_conf_t *kcf; | |
153 | |
154 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module); | |
155 | |
156 ngx_kqueue = kcf->kqueue; | |
157 | |
158 if (change_list != kcf->change_list) { | |
159 ngx_free(change_list); | |
160 change_list = kcf->change_list; | |
161 } | |
162 | |
163 max_changes = kcf->changes; | |
164 | |
165 if (event_list != kcf->event_list) { | |
166 ngx_free(event_list); | |
167 event_list = kcf->event_list; | |
168 } | |
169 | |
170 nevents = kcf->events; | |
171 | |
172 ngx_event_timer_commit(cycle, log); | |
173 | |
174 /* TODO: re-add active events with new udata | |
175 if ecf->connections was increased */ | |
176 | |
177 ngx_event_actions = ngx_kqueue_module_ctx.actions; | |
178 ngx_io = ngx_os_io; | |
179 | |
180 ngx_event_flags = NGX_HAVE_LEVEL_EVENT | |
181 |NGX_HAVE_ONESHOT_EVENT | |
182 #if (HAVE_CLEAR_EVENT) | |
183 |NGX_HAVE_CLEAR_EVENT | |
184 #else | |
185 |NGX_USE_LEVEL_EVENT | |
186 #endif | |
187 #if (HAVE_LOWAT_EVENT) | |
188 |NGX_HAVE_LOWAT_EVENT | |
189 #endif | |
190 |NGX_HAVE_KQUEUE_EVENT; | |
191 } | |
192 | |
193 | |
194 static void ngx_kqueue_rollback(ngx_cycle_t *cycle, ngx_log_t *log) | |
195 { | |
196 ngx_kqueue_conf_t *kcf; | |
197 | |
198 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module); | |
199 | |
200 if (ngx_kqueue == -1) { | |
201 if (close(kcf->kqueue) == -1) { | |
202 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, | |
203 "kqueue close() failed"); | |
204 } | |
205 } | |
206 | |
207 if (change_list != kcf->change_list) { | |
208 ngx_free(kcf->change_list); | |
209 } | |
210 | |
211 if (event_list != kcf->event_list) { | |
212 ngx_free(kcf->event_list); | |
213 } | |
214 | |
215 ngx_event_timer_rollback(cycle, log); | |
216 } | |
217 | |
218 #endif | |
84 | 219 |
85 | 220 |
86 static int ngx_kqueue_init(ngx_log_t *log) | 221 static int ngx_kqueue_init(ngx_log_t *log) |
87 { | 222 { |
88 struct timespec ts; | 223 struct timespec ts; |