comparison src/event/modules/ngx_kqueue_module.c @ 12:055ed05235ae

nginx-0.0.1-2002-09-13-18:47:42 import
author Igor Sysoev <igor@sysoev.ru>
date Fri, 13 Sep 2002 14:47:42 +0000
parents f323b4f74e4a
children f8a0d0f31a24
comparison
equal deleted inserted replaced
11:f323b4f74e4a 12:055ed05235ae
32 int size = sizeof(struct kevent) * 512; 32 int size = sizeof(struct kevent) * 512;
33 33
34 nchanges = 0; 34 nchanges = 0;
35 nevents = 512; 35 nevents = 512;
36 36
37 if ((kq = kqueue()) == -1) { 37 kq = kqueue();
38 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, 38
39 "kqueue() failed"); 39 if (kq == -1) {
40 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed");
40 exit(1); 41 exit(1);
41 } 42 }
42 43
43 change_list = ngx_alloc(size, log); 44 change_list = ngx_alloc(size, log);
44 event_list = ngx_alloc(size, log); 45 event_list = ngx_alloc(size, log);
50 ngx_event_actions.add = ngx_kqueue_add_event; 51 ngx_event_actions.add = ngx_kqueue_add_event;
51 ngx_event_actions.del = ngx_kqueue_del_event; 52 ngx_event_actions.del = ngx_kqueue_del_event;
52 ngx_event_actions.timer = ngx_kqueue_add_timer; 53 ngx_event_actions.timer = ngx_kqueue_add_timer;
53 ngx_event_actions.process = ngx_kqueue_process_events; 54 ngx_event_actions.process = ngx_kqueue_process_events;
54 #endif 55 #endif
55
56 } 56 }
57 57
58 int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) 58 int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags)
59 { 59 {
60 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0; 60 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0;
70 int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) 70 int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags)
71 { 71 {
72 struct timespec ts = { 0, 0 }; 72 struct timespec ts = { 0, 0 };
73 ngx_connection_t *cn = (ngx_connection_t *) ev->data; 73 ngx_connection_t *cn = (ngx_connection_t *) ev->data;
74 74
75 ngx_log_debug(ev->log, "ngx_kqueue_set_event: %d: ft:%d f:%08x" _ 75 ngx_log_debug(ev->log, "kqueue set event: %d: ft:%d f:%08x" _
76 cn->fd _ filter _ flags); 76 cn->fd _ filter _ flags);
77 77
78 if (nchanges >= nevents) { 78 if (nchanges >= nevents) {
79 ngx_log_error(NGX_LOG_WARN, ev->log, 0, 79 ngx_log_error(NGX_LOG_WARN, ev->log, 0,
80 "ngx_kqueue_set_event: change list is filled up"); 80 "ngx_kqueue_set_event: change list is filled up");
81 81
82 if (kevent(kq, change_list, nchanges, NULL, 0, &ts) == -1) { 82 if (kevent(kq, change_list, nchanges, NULL, 0, &ts) == -1) {
83 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, 83 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent failed");
84 "ngx_kqueue_set_event: kevent failed"); 84 return NGX_ERROR;
85 return -1;
86 } 85 }
87 nchanges = 0; 86 nchanges = 0;
88 } 87 }
89 88
90 change_list[nchanges].ident = cn->fd; 89 change_list[nchanges].ident = cn->fd;
93 change_list[nchanges].fflags = 0; 92 change_list[nchanges].fflags = 0;
94 change_list[nchanges].data = 0; 93 change_list[nchanges].data = 0;
95 change_list[nchanges].udata = ev; 94 change_list[nchanges].udata = ev;
96 nchanges++; 95 nchanges++;
97 96
98 return 0; 97 return NGX_OK;
99 } 98 }
100 99
101 int ngx_kqueue_process_events(ngx_log_t *log) 100 int ngx_kqueue_process_events(ngx_log_t *log)
102 { 101 {
103 int events, i; 102 int events, i;
113 tp = &ts; 112 tp = &ts;
114 gettimeofday(&tv, NULL); 113 gettimeofday(&tv, NULL);
115 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000; 114 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
116 } 115 }
117 116
118 ngx_log_debug(log, "ngx_kqueue_process_events: timer: %d" _ timer); 117 ngx_log_debug(log, "kevent timer: %d" _ timer);
119 118
120 if ((events = kevent(kq, change_list, nchanges, event_list, nevents, tp)) 119 events = kevent(kq, change_list, nchanges, event_list, nevents, tp);
121 == -1) { 120 if (events == -1) {
122 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, 121 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent failed");
123 "ngx_kqueue_process_events: kevent failed"); 122 return NGX_ERROR;
124 return -1;
125 } 123 }
126 124
127 nchanges = 0; 125 nchanges = 0;
128 126
129 if (timer) { 127 if (timer) {
130 gettimeofday(&tv, NULL); 128 gettimeofday(&tv, NULL);
131 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; 129 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
132 130
133 } else { 131 } else {
134 ngx_assert((events != 0), return -1, log, 132 ngx_assert((events != 0), return NGX_ERROR, log,
135 "ngx_kqueue_process_events: "
136 "kevent returns no events without timeout"); 133 "kevent returns no events without timeout");
137 } 134 }
138 135
139 ngx_log_debug(log, "ngx_kqueue_process_events: " 136 ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ delta);
140 "timer: %d, delta: %d" _ timer _ delta);
141 137
142 if (timer) { 138 if (timer) {
143 if (delta >= timer) { 139 if (delta >= timer) {
144 for (ev = timer_queue.timer_next; 140 for (ev = timer_queue.timer_next;
145 ev != &timer_queue && delta >= ev->timer_delta; 141 ev != &timer_queue && delta >= ev->timer_delta;
159 } 155 }
160 } 156 }
161 157
162 for (i = 0; i < events; i++) { 158 for (i = 0; i < events; i++) {
163 159
164 ngx_log_debug(log, "ngx_kqueue_process_events: kevent: " 160 ngx_log_debug(log, "kevent: %d: ft:%d f:%08x ff:%08x d:%d ud:%08x" _
165 "%d: ft:%d f:%08x ff:%08x d:%d ud:%08x" _
166 event_list[i].ident _ event_list[i].filter _ 161 event_list[i].ident _ event_list[i].filter _
167 event_list[i].flags _ event_list[i].fflags _ 162 event_list[i].flags _ event_list[i].fflags _
168 event_list[i].data _ event_list[i].udata); 163 event_list[i].data _ event_list[i].udata);
169 164
170 if (event_list[i].flags & EV_ERROR) { 165 if (event_list[i].flags & EV_ERROR) {
171 ngx_log_error(NGX_LOG_ALERT, log, event_list[i].data, 166 ngx_log_error(NGX_LOG_ALERT, log, event_list[i].data,
172 "ngx_kqueue_process_events: kevent error on %d", 167 "kevent error on %d", event_list[i].ident);
173 event_list[i].ident);
174 continue; 168 continue;
175 } 169 }
176 170
177 ev = (ngx_event_t *) event_list[i].udata; 171 ev = (ngx_event_t *) event_list[i].udata;
178 172
196 190
197 break; 191 break;
198 192
199 default: 193 default:
200 ngx_assert(0, /* void */, log, 194 ngx_assert(0, /* void */, log,
201 "ngx_kqueue_process_events: unknown filter %d" _ 195 "unknown kevent filter %d" _ event_list[i].filter);
202 event_list[i].filter); 196 }
203 } 197 }
204 } 198
205 199 return NGX_OK;
206 return 0;
207 } 200 }
208 201
209 void ngx_kqueue_add_timer(ngx_event_t *ev, ngx_msec_t timer) 202 void ngx_kqueue_add_timer(ngx_event_t *ev, ngx_msec_t timer)
210 { 203 {
211 ngx_event_t *e; 204 ngx_event_t *e;