Mercurial > hg > nginx
comparison src/event/modules/ngx_kqueue_module.c @ 6030:4652f8f26b12
Removed unix ngx_threaded and related ngx_process_changes.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Fri, 20 Mar 2015 06:43:19 +0300 |
parents | e284f3ff6831 |
children | dc92298b1852 |
comparison
equal
deleted
inserted
replaced
6029:e284f3ff6831 | 6030:4652f8f26b12 |
---|---|
28 static ngx_int_t ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter, | 28 static ngx_int_t ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter, |
29 ngx_uint_t flags); | 29 ngx_uint_t flags); |
30 #ifdef EVFILT_USER | 30 #ifdef EVFILT_USER |
31 static ngx_int_t ngx_kqueue_notify(ngx_event_handler_pt handler); | 31 static ngx_int_t ngx_kqueue_notify(ngx_event_handler_pt handler); |
32 #endif | 32 #endif |
33 static ngx_int_t ngx_kqueue_process_changes(ngx_cycle_t *cycle, ngx_uint_t try); | |
34 static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, | 33 static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, |
35 ngx_uint_t flags); | 34 ngx_uint_t flags); |
36 static ngx_inline void ngx_kqueue_dump_event(ngx_log_t *log, | 35 static ngx_inline void ngx_kqueue_dump_event(ngx_log_t *log, |
37 struct kevent *kev); | 36 struct kevent *kev); |
38 | 37 |
40 static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf); | 39 static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf); |
41 | 40 |
42 | 41 |
43 int ngx_kqueue = -1; | 42 int ngx_kqueue = -1; |
44 | 43 |
45 /* | 44 static struct kevent *change_list; |
46 * The "change_list" should be declared as ngx_thread_volatile. | |
47 * However, the use of the change_list is localized in kqueue functions and | |
48 * is protected by the mutex so even the "icc -ipo" should not build the code | |
49 * with the race condition. Thus we avoid the declaration to make a more | |
50 * readable code. | |
51 */ | |
52 | |
53 static struct kevent *change_list, *change_list0, *change_list1; | |
54 static struct kevent *event_list; | 45 static struct kevent *event_list; |
55 static ngx_uint_t max_changes, nchanges, nevents; | 46 static ngx_uint_t max_changes, nchanges, nevents; |
56 | 47 |
57 #ifdef EVFILT_USER | 48 #ifdef EVFILT_USER |
58 static ngx_event_t notify_event; | 49 static ngx_event_t notify_event; |
97 #ifdef EVFILT_USER | 88 #ifdef EVFILT_USER |
98 ngx_kqueue_notify, /* trigger a notify */ | 89 ngx_kqueue_notify, /* trigger a notify */ |
99 #else | 90 #else |
100 NULL, /* trigger a notify */ | 91 NULL, /* trigger a notify */ |
101 #endif | 92 #endif |
102 ngx_kqueue_process_changes, /* process the changes */ | |
103 ngx_kqueue_process_events, /* process the events */ | 93 ngx_kqueue_process_events, /* process the events */ |
104 ngx_kqueue_init, /* init the events */ | 94 ngx_kqueue_init, /* init the events */ |
105 ngx_kqueue_done /* done the events */ | 95 ngx_kqueue_done /* done the events */ |
106 } | 96 } |
107 | 97 |
163 return NGX_ERROR; | 153 return NGX_ERROR; |
164 } | 154 } |
165 nchanges = 0; | 155 nchanges = 0; |
166 } | 156 } |
167 | 157 |
168 if (change_list0) { | 158 if (change_list) { |
169 ngx_free(change_list0); | 159 ngx_free(change_list); |
170 } | 160 } |
171 | 161 |
172 change_list0 = ngx_alloc(kcf->changes * sizeof(struct kevent), | 162 change_list = ngx_alloc(kcf->changes * sizeof(struct kevent), |
173 cycle->log); | 163 cycle->log); |
174 if (change_list0 == NULL) { | 164 if (change_list == NULL) { |
175 return NGX_ERROR; | 165 return NGX_ERROR; |
176 } | 166 } |
177 | |
178 if (change_list1) { | |
179 ngx_free(change_list1); | |
180 } | |
181 | |
182 change_list1 = ngx_alloc(kcf->changes * sizeof(struct kevent), | |
183 cycle->log); | |
184 if (change_list1 == NULL) { | |
185 return NGX_ERROR; | |
186 } | |
187 | |
188 change_list = change_list0; | |
189 } | 167 } |
190 | 168 |
191 max_changes = kcf->changes; | 169 max_changes = kcf->changes; |
192 | 170 |
193 if (nevents < kcf->events) { | 171 if (nevents < kcf->events) { |
288 "kqueue close() failed"); | 266 "kqueue close() failed"); |
289 } | 267 } |
290 | 268 |
291 ngx_kqueue = -1; | 269 ngx_kqueue = -1; |
292 | 270 |
293 ngx_free(change_list1); | 271 ngx_free(change_list); |
294 ngx_free(change_list0); | |
295 ngx_free(event_list); | 272 ngx_free(event_list); |
296 | 273 |
297 change_list1 = NULL; | |
298 change_list0 = NULL; | |
299 change_list = NULL; | 274 change_list = NULL; |
300 event_list = NULL; | 275 event_list = NULL; |
301 max_changes = 0; | 276 max_changes = 0; |
302 nchanges = 0; | 277 nchanges = 0; |
303 nevents = 0; | 278 nevents = 0; |
529 ngx_err_t err; | 504 ngx_err_t err; |
530 ngx_event_t *ev; | 505 ngx_event_t *ev; |
531 ngx_queue_t *queue; | 506 ngx_queue_t *queue; |
532 struct timespec ts, *tp; | 507 struct timespec ts, *tp; |
533 | 508 |
534 if (ngx_threaded) { | 509 n = (int) nchanges; |
535 if (ngx_kqueue_process_changes(cycle, 0) == NGX_ERROR) { | 510 nchanges = 0; |
536 return NGX_ERROR; | |
537 } | |
538 | |
539 n = 0; | |
540 | |
541 } else { | |
542 n = (int) nchanges; | |
543 nchanges = 0; | |
544 } | |
545 | 511 |
546 if (timer == NGX_TIMER_INFINITE) { | 512 if (timer == NGX_TIMER_INFINITE) { |
547 tp = NULL; | 513 tp = NULL; |
548 | 514 |
549 } else { | 515 } else { |
702 | 668 |
703 ev->handler(ev); | 669 ev->handler(ev); |
704 } | 670 } |
705 | 671 |
706 return NGX_OK; | 672 return NGX_OK; |
707 } | |
708 | |
709 | |
710 static ngx_int_t | |
711 ngx_kqueue_process_changes(ngx_cycle_t *cycle, ngx_uint_t try) | |
712 { | |
713 int n; | |
714 ngx_int_t rc; | |
715 ngx_err_t err; | |
716 struct timespec ts; | |
717 struct kevent *changes; | |
718 | |
719 if (nchanges == 0) { | |
720 return NGX_OK; | |
721 } | |
722 | |
723 changes = change_list; | |
724 if (change_list == change_list0) { | |
725 change_list = change_list1; | |
726 } else { | |
727 change_list = change_list0; | |
728 } | |
729 | |
730 n = (int) nchanges; | |
731 nchanges = 0; | |
732 | |
733 ts.tv_sec = 0; | |
734 ts.tv_nsec = 0; | |
735 | |
736 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
737 "kevent changes: %d", n); | |
738 | |
739 if (kevent(ngx_kqueue, changes, n, NULL, 0, &ts) == -1) { | |
740 err = ngx_errno; | |
741 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, | |
742 cycle->log, err, "kevent() failed"); | |
743 rc = NGX_ERROR; | |
744 | |
745 } else { | |
746 rc = NGX_OK; | |
747 } | |
748 | |
749 return rc; | |
750 } | 673 } |
751 | 674 |
752 | 675 |
753 static ngx_inline void | 676 static ngx_inline void |
754 ngx_kqueue_dump_event(ngx_log_t *log, struct kevent *kev) | 677 ngx_kqueue_dump_event(ngx_log_t *log, struct kevent *kev) |