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;