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)