nginxtra 1.6.3.9 → 1.8.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/bin/nginxtra +1 -1
  3. data/bin/nginxtra_rails +1 -1
  4. data/lib/nginxtra/version.rb +1 -1
  5. data/vendor/nginx/CHANGES +358 -14
  6. data/vendor/nginx/CHANGES.ru +372 -18
  7. data/vendor/nginx/LICENSE +2 -2
  8. data/vendor/nginx/auto/cc/clang +5 -0
  9. data/vendor/nginx/auto/cc/gcc +5 -0
  10. data/vendor/nginx/auto/lib/google-perftools/conf +1 -1
  11. data/vendor/nginx/auto/lib/openssl/make +0 -5
  12. data/vendor/nginx/auto/lib/perl/conf +9 -1
  13. data/vendor/nginx/auto/make +1 -1
  14. data/vendor/nginx/auto/modules +11 -0
  15. data/vendor/nginx/auto/options +10 -2
  16. data/vendor/nginx/auto/os/darwin +0 -1
  17. data/vendor/nginx/auto/os/freebsd +6 -23
  18. data/vendor/nginx/auto/sources +16 -14
  19. data/vendor/nginx/auto/summary +3 -24
  20. data/vendor/nginx/auto/threads +20 -0
  21. data/vendor/nginx/auto/types/sizeof +2 -12
  22. data/vendor/nginx/auto/unix +50 -6
  23. data/vendor/nginx/configure +5 -0
  24. data/vendor/nginx/contrib/vim/syntax/nginx.vim +183 -50
  25. data/vendor/nginx/src/core/nginx.c +21 -9
  26. data/vendor/nginx/src/core/nginx.h +8 -2
  27. data/vendor/nginx/src/core/ngx_buf.c +88 -0
  28. data/vendor/nginx/src/core/ngx_buf.h +15 -1
  29. data/vendor/nginx/src/core/ngx_conf_file.c +4 -1
  30. data/vendor/nginx/src/core/ngx_connection.c +25 -66
  31. data/vendor/nginx/src/core/ngx_connection.h +1 -3
  32. data/vendor/nginx/src/core/ngx_core.h +11 -3
  33. data/vendor/nginx/src/core/ngx_crypt.c +1 -1
  34. data/vendor/nginx/src/core/ngx_cycle.c +7 -1
  35. data/vendor/nginx/src/core/ngx_cycle.h +6 -2
  36. data/vendor/nginx/src/core/ngx_file.c +13 -5
  37. data/vendor/nginx/src/core/ngx_file.h +6 -0
  38. data/vendor/nginx/src/core/ngx_log.c +215 -21
  39. data/vendor/nginx/src/core/ngx_log.h +9 -1
  40. data/vendor/nginx/src/core/ngx_output_chain.c +104 -15
  41. data/vendor/nginx/src/core/ngx_palloc.c +3 -7
  42. data/vendor/nginx/src/core/ngx_rbtree.c +2 -4
  43. data/vendor/nginx/src/core/ngx_rbtree.h +2 -4
  44. data/vendor/nginx/src/core/ngx_regex.c +14 -6
  45. data/vendor/nginx/src/core/ngx_resolver.c +16 -23
  46. data/vendor/nginx/src/core/ngx_resolver.h +8 -7
  47. data/vendor/nginx/src/core/ngx_shmtx.c +1 -1
  48. data/vendor/nginx/src/core/ngx_slab.c +89 -2
  49. data/vendor/nginx/src/core/ngx_slab.h +3 -0
  50. data/vendor/nginx/src/core/ngx_string.c +58 -2
  51. data/vendor/nginx/src/core/ngx_string.h +1 -0
  52. data/vendor/nginx/src/core/ngx_syslog.c +374 -0
  53. data/vendor/nginx/src/core/ngx_syslog.h +30 -0
  54. data/vendor/nginx/src/core/ngx_thread_pool.c +630 -0
  55. data/vendor/nginx/src/core/ngx_thread_pool.h +36 -0
  56. data/vendor/nginx/src/core/ngx_times.c +19 -2
  57. data/vendor/nginx/src/core/ngx_times.h +1 -0
  58. data/vendor/nginx/src/event/modules/ngx_aio_module.c +1 -1
  59. data/vendor/nginx/src/event/modules/ngx_devpoll_module.c +9 -24
  60. data/vendor/nginx/src/event/modules/ngx_epoll_module.c +152 -28
  61. data/vendor/nginx/src/event/modules/ngx_eventport_module.c +43 -25
  62. data/vendor/nginx/src/event/modules/ngx_kqueue_module.c +86 -156
  63. data/vendor/nginx/src/event/modules/ngx_poll_module.c +21 -37
  64. data/vendor/nginx/src/event/modules/ngx_rtsig_module.c +15 -27
  65. data/vendor/nginx/src/event/modules/ngx_select_module.c +10 -12
  66. data/vendor/nginx/src/event/modules/ngx_win32_select_module.c +7 -9
  67. data/vendor/nginx/src/event/ngx_event.c +5 -33
  68. data/vendor/nginx/src/event/ngx_event.h +15 -50
  69. data/vendor/nginx/src/event/ngx_event_accept.c +11 -10
  70. data/vendor/nginx/src/event/ngx_event_connect.c +0 -11
  71. data/vendor/nginx/src/event/ngx_event_connect.h +1 -4
  72. data/vendor/nginx/src/event/ngx_event_openssl.c +622 -38
  73. data/vendor/nginx/src/event/ngx_event_openssl.h +20 -2
  74. data/vendor/nginx/src/event/ngx_event_openssl_stapling.c +5 -1
  75. data/vendor/nginx/src/event/ngx_event_pipe.c +45 -19
  76. data/vendor/nginx/src/event/ngx_event_pipe.h +3 -0
  77. data/vendor/nginx/src/event/ngx_event_posted.c +7 -145
  78. data/vendor/nginx/src/event/ngx_event_posted.h +12 -39
  79. data/vendor/nginx/src/event/ngx_event_timer.c +50 -70
  80. data/vendor/nginx/src/event/ngx_event_timer.h +2 -14
  81. data/vendor/nginx/src/http/modules/ngx_http_addition_filter_module.c +1 -1
  82. data/vendor/nginx/src/http/modules/ngx_http_autoindex_module.c +416 -71
  83. data/vendor/nginx/src/http/modules/ngx_http_charset_filter_module.c +19 -15
  84. data/vendor/nginx/src/http/modules/ngx_http_dav_module.c +16 -4
  85. data/vendor/nginx/src/http/modules/ngx_http_fastcgi_module.c +601 -134
  86. data/vendor/nginx/src/http/modules/ngx_http_geo_module.c +1 -1
  87. data/vendor/nginx/src/http/modules/ngx_http_geoip_module.c +9 -3
  88. data/vendor/nginx/src/http/modules/ngx_http_gunzip_filter_module.c +9 -3
  89. data/vendor/nginx/src/http/modules/ngx_http_gzip_filter_module.c +9 -3
  90. data/vendor/nginx/src/http/modules/ngx_http_gzip_static_module.c +0 -2
  91. data/vendor/nginx/src/http/modules/ngx_http_headers_filter_module.c +197 -91
  92. data/vendor/nginx/src/http/modules/ngx_http_image_filter_module.c +1 -0
  93. data/vendor/nginx/src/http/modules/ngx_http_limit_conn_module.c +65 -162
  94. data/vendor/nginx/src/http/modules/ngx_http_limit_req_module.c +53 -67
  95. data/vendor/nginx/src/http/modules/ngx_http_log_module.c +128 -23
  96. data/vendor/nginx/src/http/modules/ngx_http_memcached_module.c +25 -6
  97. data/vendor/nginx/src/http/modules/ngx_http_mp4_module.c +1 -1
  98. data/vendor/nginx/src/http/modules/ngx_http_not_modified_filter_module.c +39 -13
  99. data/vendor/nginx/src/http/modules/ngx_http_proxy_module.c +697 -141
  100. data/vendor/nginx/src/http/modules/ngx_http_rewrite_module.c +5 -1
  101. data/vendor/nginx/src/http/modules/ngx_http_scgi_module.c +282 -125
  102. data/vendor/nginx/src/http/modules/ngx_http_ssi_filter_module.c +4 -1
  103. data/vendor/nginx/src/http/modules/ngx_http_ssl_module.c +44 -1
  104. data/vendor/nginx/src/http/modules/ngx_http_ssl_module.h +2 -0
  105. data/vendor/nginx/src/http/modules/ngx_http_stub_status_module.c +10 -8
  106. data/vendor/nginx/src/http/modules/ngx_http_sub_filter_module.c +18 -3
  107. data/vendor/nginx/src/http/modules/ngx_http_upstream_hash_module.c +641 -0
  108. data/vendor/nginx/src/http/modules/ngx_http_upstream_ip_hash_module.c +1 -1
  109. data/vendor/nginx/src/http/modules/ngx_http_upstream_keepalive_module.c +3 -21
  110. data/vendor/nginx/src/http/modules/ngx_http_upstream_least_conn_module.c +0 -5
  111. data/vendor/nginx/src/http/modules/ngx_http_uwsgi_module.c +449 -125
  112. data/vendor/nginx/src/http/modules/ngx_http_xslt_filter_module.c +4 -2
  113. data/vendor/nginx/src/http/modules/perl/ngx_http_perl_module.c +2 -1
  114. data/vendor/nginx/src/http/ngx_http.c +10 -5
  115. data/vendor/nginx/src/http/ngx_http.h +4 -4
  116. data/vendor/nginx/src/http/ngx_http_cache.h +26 -1
  117. data/vendor/nginx/src/http/ngx_http_copy_filter_module.c +109 -68
  118. data/vendor/nginx/src/http/ngx_http_core_module.c +191 -46
  119. data/vendor/nginx/src/http/ngx_http_core_module.h +16 -4
  120. data/vendor/nginx/src/http/ngx_http_file_cache.c +584 -67
  121. data/vendor/nginx/src/http/ngx_http_parse.c +55 -4
  122. data/vendor/nginx/src/http/ngx_http_request.c +14 -6
  123. data/vendor/nginx/src/http/ngx_http_request.h +12 -4
  124. data/vendor/nginx/src/http/ngx_http_request_body.c +114 -28
  125. data/vendor/nginx/src/http/ngx_http_spdy.c +383 -229
  126. data/vendor/nginx/src/http/ngx_http_spdy.h +8 -5
  127. data/vendor/nginx/src/http/ngx_http_spdy_filter_module.c +12 -4
  128. data/vendor/nginx/src/http/ngx_http_special_response.c +2 -2
  129. data/vendor/nginx/src/http/ngx_http_upstream.c +808 -132
  130. data/vendor/nginx/src/http/ngx_http_upstream.h +33 -3
  131. data/vendor/nginx/src/http/ngx_http_upstream_round_robin.c +72 -65
  132. data/vendor/nginx/src/http/ngx_http_upstream_round_robin.h +1 -2
  133. data/vendor/nginx/src/http/ngx_http_variables.c +47 -3
  134. data/vendor/nginx/src/http/ngx_http_write_filter_module.c +15 -6
  135. data/vendor/nginx/src/mail/ngx_mail.c +2 -3
  136. data/vendor/nginx/src/mail/ngx_mail.h +2 -0
  137. data/vendor/nginx/src/mail/ngx_mail_auth_http_module.c +140 -11
  138. data/vendor/nginx/src/mail/ngx_mail_core_module.c +3 -3
  139. data/vendor/nginx/src/mail/ngx_mail_handler.c +79 -2
  140. data/vendor/nginx/src/mail/ngx_mail_imap_module.c +3 -1
  141. data/vendor/nginx/src/mail/ngx_mail_pop3_module.c +3 -1
  142. data/vendor/nginx/src/mail/ngx_mail_smtp_module.c +3 -1
  143. data/vendor/nginx/src/mail/ngx_mail_ssl_module.c +125 -1
  144. data/vendor/nginx/src/mail/ngx_mail_ssl_module.h +8 -0
  145. data/vendor/nginx/src/misc/ngx_cpp_test_module.cpp +1 -1
  146. data/vendor/nginx/src/os/unix/ngx_aio_read_chain.c +1 -1
  147. data/vendor/nginx/src/os/unix/ngx_channel.c +0 -7
  148. data/vendor/nginx/src/os/unix/ngx_darwin_config.h +0 -3
  149. data/vendor/nginx/src/os/unix/ngx_darwin_sendfile_chain.c +44 -208
  150. data/vendor/nginx/src/os/unix/ngx_file_aio_read.c +25 -17
  151. data/vendor/nginx/src/os/unix/ngx_files.c +109 -0
  152. data/vendor/nginx/src/os/unix/ngx_files.h +6 -0
  153. data/vendor/nginx/src/os/unix/ngx_freebsd_config.h +0 -6
  154. data/vendor/nginx/src/os/unix/ngx_freebsd_sendfile_chain.c +78 -206
  155. data/vendor/nginx/src/os/unix/ngx_linux_aio_read.c +25 -14
  156. data/vendor/nginx/src/os/unix/ngx_linux_config.h +4 -1
  157. data/vendor/nginx/src/os/unix/ngx_linux_sendfile_chain.c +235 -194
  158. data/vendor/nginx/src/os/unix/ngx_os.h +25 -3
  159. data/vendor/nginx/src/os/unix/ngx_posix_init.c +4 -2
  160. data/vendor/nginx/src/os/unix/ngx_process_cycle.c +13 -195
  161. data/vendor/nginx/src/os/unix/ngx_process_cycle.h +0 -1
  162. data/vendor/nginx/src/os/unix/ngx_readv_chain.c +27 -108
  163. data/vendor/nginx/src/os/unix/ngx_setproctitle.h +2 -2
  164. data/vendor/nginx/src/os/unix/ngx_solaris_sendfilev_chain.c +12 -67
  165. data/vendor/nginx/src/os/unix/ngx_thread.h +26 -83
  166. data/vendor/nginx/src/os/unix/ngx_thread_cond.c +87 -0
  167. data/vendor/nginx/src/os/unix/ngx_thread_id.c +70 -0
  168. data/vendor/nginx/src/os/unix/ngx_thread_mutex.c +174 -0
  169. data/vendor/nginx/src/os/unix/ngx_user.c +2 -20
  170. data/vendor/nginx/src/os/unix/ngx_writev_chain.c +129 -98
  171. metadata +16 -17
  172. data/vendor/nginx/auto/lib/zlib/patch.zlib.h +0 -10
  173. data/vendor/nginx/src/event/ngx_event_busy_lock.c +0 -286
  174. data/vendor/nginx/src/event/ngx_event_busy_lock.h +0 -65
  175. data/vendor/nginx/src/event/ngx_event_mutex.c +0 -70
  176. data/vendor/nginx/src/http/ngx_http_busy_lock.c +0 -307
  177. data/vendor/nginx/src/http/ngx_http_busy_lock.h +0 -54
  178. data/vendor/nginx/src/os/unix/ngx_freebsd_rfork_thread.c +0 -756
  179. data/vendor/nginx/src/os/unix/ngx_freebsd_rfork_thread.h +0 -122
  180. data/vendor/nginx/src/os/unix/ngx_pthread_thread.c +0 -278
  181. data/vendor/nginx/src/os/unix/rfork_thread.S +0 -73
@@ -93,6 +93,13 @@ int port_getn(int port, port_event_t list[], uint_t max, uint_t *nget,
93
93
  return -1;
94
94
  }
95
95
 
96
+ int port_send(int port, int events, void *user);
97
+
98
+ int port_send(int port, int events, void *user)
99
+ {
100
+ return -1;
101
+ }
102
+
96
103
 
97
104
  int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid);
98
105
 
@@ -133,6 +140,7 @@ static ngx_int_t ngx_eventport_add_event(ngx_event_t *ev, ngx_int_t event,
133
140
  ngx_uint_t flags);
134
141
  static ngx_int_t ngx_eventport_del_event(ngx_event_t *ev, ngx_int_t event,
135
142
  ngx_uint_t flags);
143
+ static ngx_int_t ngx_eventport_notify(ngx_event_handler_pt handler);
136
144
  static ngx_int_t ngx_eventport_process_events(ngx_cycle_t *cycle,
137
145
  ngx_msec_t timer, ngx_uint_t flags);
138
146
 
@@ -143,6 +151,7 @@ static int ep = -1;
143
151
  static port_event_t *event_list;
144
152
  static ngx_uint_t nevents;
145
153
  static timer_t event_timer = (timer_t) -1;
154
+ static ngx_event_t notify_event;
146
155
 
147
156
  static ngx_str_t eventport_name = ngx_string("eventport");
148
157
 
@@ -172,7 +181,7 @@ ngx_event_module_t ngx_eventport_module_ctx = {
172
181
  ngx_eventport_del_event, /* disable an event */
173
182
  NULL, /* add an connection */
174
183
  NULL, /* delete an connection */
175
- NULL, /* process the changes */
184
+ ngx_eventport_notify, /* trigger a notify */
176
185
  ngx_eventport_process_events, /* process the events */
177
186
  ngx_eventport_init, /* init the events */
178
187
  ngx_eventport_done, /* done the events */
@@ -214,6 +223,9 @@ ngx_eventport_init(ngx_cycle_t *cycle, ngx_msec_t timer)
214
223
  "port_create() failed");
215
224
  return NGX_ERROR;
216
225
  }
226
+
227
+ notify_event.active = 1;
228
+ notify_event.log = cycle->log;
217
229
  }
218
230
 
219
231
  if (nevents < epcf->events) {
@@ -405,6 +417,21 @@ ngx_eventport_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
405
417
  }
406
418
 
407
419
 
420
+ static ngx_int_t
421
+ ngx_eventport_notify(ngx_event_handler_pt handler)
422
+ {
423
+ notify_event.handler = handler;
424
+
425
+ if (port_send(ep, 0, &notify_event) != 0) {
426
+ ngx_log_error(NGX_LOG_ALERT, notify_event.log, ngx_errno,
427
+ "port_send() failed");
428
+ return NGX_ERROR;
429
+ }
430
+
431
+ return NGX_OK;
432
+ }
433
+
434
+
408
435
  ngx_int_t
409
436
  ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
410
437
  ngx_uint_t flags)
@@ -414,7 +441,8 @@ ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
414
441
  ngx_err_t err;
415
442
  ngx_int_t instance;
416
443
  ngx_uint_t i, level;
417
- ngx_event_t *ev, *rev, *wev, **queue;
444
+ ngx_event_t *ev, *rev, *wev;
445
+ ngx_queue_t *queue;
418
446
  ngx_connection_t *c;
419
447
  struct timespec ts, *tp;
420
448
 
@@ -466,8 +494,6 @@ ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
466
494
  return NGX_ERROR;
467
495
  }
468
496
 
469
- ngx_mutex_lock(ngx_posted_events_mutex);
470
-
471
497
  for (i = 0; i < events; i++) {
472
498
 
473
499
  if (event_list[i].portev_source == PORT_SOURCE_TIMER) {
@@ -534,19 +560,13 @@ ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
534
560
  wev->active = 0;
535
561
 
536
562
  if (revents & POLLIN) {
537
-
538
- if ((flags & NGX_POST_THREAD_EVENTS) && !rev->accept) {
539
- rev->posted_ready = 1;
540
-
541
- } else {
542
- rev->ready = 1;
543
- }
563
+ rev->ready = 1;
544
564
 
545
565
  if (flags & NGX_POST_EVENTS) {
546
- queue = (ngx_event_t **) (rev->accept ?
547
- &ngx_posted_accept_events : &ngx_posted_events);
566
+ queue = rev->accept ? &ngx_posted_accept_events
567
+ : &ngx_posted_events;
548
568
 
549
- ngx_locked_post_event(rev, queue);
569
+ ngx_post_event(rev, queue);
550
570
 
551
571
  } else {
552
572
  rev->handler(rev);
@@ -574,16 +594,10 @@ ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
574
594
  }
575
595
 
576
596
  if (revents & POLLOUT) {
577
-
578
- if (flags & NGX_POST_THREAD_EVENTS) {
579
- wev->posted_ready = 1;
580
-
581
- } else {
582
- wev->ready = 1;
583
- }
597
+ wev->ready = 1;
584
598
 
585
599
  if (flags & NGX_POST_EVENTS) {
586
- ngx_locked_post_event(wev, &ngx_posted_events);
600
+ ngx_post_event(wev, &ngx_posted_events);
587
601
 
588
602
  } else {
589
603
  wev->handler(wev);
@@ -592,16 +606,20 @@ ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
592
606
 
593
607
  continue;
594
608
 
609
+ case PORT_SOURCE_USER:
610
+
611
+ ev->handler(ev);
612
+
613
+ continue;
614
+
595
615
  default:
596
616
  ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
597
- "unexpected even_port object %d",
617
+ "unexpected eventport object %d",
598
618
  event_list[i].portev_object);
599
619
  continue;
600
620
  }
601
621
  }
602
622
 
603
- ngx_mutex_unlock(ngx_posted_events_mutex);
604
-
605
623
  return NGX_OK;
606
624
  }
607
625
 
@@ -17,6 +17,9 @@ typedef struct {
17
17
 
18
18
 
19
19
  static ngx_int_t ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer);
20
+ #ifdef EVFILT_USER
21
+ static ngx_int_t ngx_kqueue_notify_init(ngx_log_t *log);
22
+ #endif
20
23
  static void ngx_kqueue_done(ngx_cycle_t *cycle);
21
24
  static ngx_int_t ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event,
22
25
  ngx_uint_t flags);
@@ -24,7 +27,9 @@ static ngx_int_t ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event,
24
27
  ngx_uint_t flags);
25
28
  static ngx_int_t ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter,
26
29
  ngx_uint_t flags);
27
- static ngx_int_t ngx_kqueue_process_changes(ngx_cycle_t *cycle, ngx_uint_t try);
30
+ #ifdef EVFILT_USER
31
+ static ngx_int_t ngx_kqueue_notify(ngx_event_handler_pt handler);
32
+ #endif
28
33
  static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
29
34
  ngx_uint_t flags);
30
35
  static ngx_inline void ngx_kqueue_dump_event(ngx_log_t *log,
@@ -36,25 +41,16 @@ static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf);
36
41
 
37
42
  int ngx_kqueue = -1;
38
43
 
39
- /*
40
- * The "change_list" should be declared as ngx_thread_volatile.
41
- * However, the use of the change_list is localized in kqueue functions and
42
- * is protected by the mutex so even the "icc -ipo" should not build the code
43
- * with the race condition. Thus we avoid the declaration to make a more
44
- * readable code.
45
- */
46
-
47
- static struct kevent *change_list, *change_list0, *change_list1;
44
+ static struct kevent *change_list;
48
45
  static struct kevent *event_list;
49
46
  static ngx_uint_t max_changes, nchanges, nevents;
50
47
 
51
- #if (NGX_THREADS)
52
- static ngx_mutex_t *list_mutex;
53
- static ngx_mutex_t *kevent_mutex;
48
+ #ifdef EVFILT_USER
49
+ static ngx_event_t notify_event;
50
+ static struct kevent notify_kev;
54
51
  #endif
55
52
 
56
53
 
57
-
58
54
  static ngx_str_t kqueue_name = ngx_string("kqueue");
59
55
 
60
56
  static ngx_command_t ngx_kqueue_commands[] = {
@@ -89,7 +85,11 @@ ngx_event_module_t ngx_kqueue_module_ctx = {
89
85
  ngx_kqueue_del_event, /* disable an event */
90
86
  NULL, /* add an connection */
91
87
  NULL, /* delete an connection */
92
- ngx_kqueue_process_changes, /* process the changes */
88
+ #ifdef EVFILT_USER
89
+ ngx_kqueue_notify, /* trigger a notify */
90
+ #else
91
+ NULL, /* trigger a notify */
92
+ #endif
93
93
  ngx_kqueue_process_events, /* process the events */
94
94
  ngx_kqueue_init, /* init the events */
95
95
  ngx_kqueue_done /* done the events */
@@ -133,18 +133,10 @@ ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer)
133
133
  return NGX_ERROR;
134
134
  }
135
135
 
136
- #if (NGX_THREADS)
137
-
138
- list_mutex = ngx_mutex_init(cycle->log, 0);
139
- if (list_mutex == NULL) {
136
+ #ifdef EVFILT_USER
137
+ if (ngx_kqueue_notify_init(cycle->log) != NGX_OK) {
140
138
  return NGX_ERROR;
141
139
  }
142
-
143
- kevent_mutex = ngx_mutex_init(cycle->log, 0);
144
- if (kevent_mutex == NULL) {
145
- return NGX_ERROR;
146
- }
147
-
148
140
  #endif
149
141
  }
150
142
 
@@ -163,27 +155,15 @@ ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer)
163
155
  nchanges = 0;
164
156
  }
165
157
 
166
- if (change_list0) {
167
- ngx_free(change_list0);
158
+ if (change_list) {
159
+ ngx_free(change_list);
168
160
  }
169
161
 
170
- change_list0 = ngx_alloc(kcf->changes * sizeof(struct kevent),
171
- cycle->log);
172
- if (change_list0 == NULL) {
162
+ change_list = ngx_alloc(kcf->changes * sizeof(struct kevent),
163
+ cycle->log);
164
+ if (change_list == NULL) {
173
165
  return NGX_ERROR;
174
166
  }
175
-
176
- if (change_list1) {
177
- ngx_free(change_list1);
178
- }
179
-
180
- change_list1 = ngx_alloc(kcf->changes * sizeof(struct kevent),
181
- cycle->log);
182
- if (change_list1 == NULL) {
183
- return NGX_ERROR;
184
- }
185
-
186
- change_list = change_list0;
187
167
  }
188
168
 
189
169
  max_changes = kcf->changes;
@@ -247,6 +227,37 @@ ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer)
247
227
  }
248
228
 
249
229
 
230
+ #ifdef EVFILT_USER
231
+
232
+ static ngx_int_t
233
+ ngx_kqueue_notify_init(ngx_log_t *log)
234
+ {
235
+ notify_kev.ident = 0;
236
+ notify_kev.filter = EVFILT_USER;
237
+ notify_kev.data = 0;
238
+ notify_kev.flags = EV_ADD|EV_CLEAR;
239
+ notify_kev.fflags = 0;
240
+ notify_kev.udata = 0;
241
+
242
+ if (kevent(ngx_kqueue, &notify_kev, 1, NULL, 0, NULL) == -1) {
243
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
244
+ "kevent(EVFILT_USER, EV_ADD) failed");
245
+ return NGX_ERROR;
246
+ }
247
+
248
+ notify_event.active = 1;
249
+ notify_event.log = log;
250
+
251
+ notify_kev.flags = 0;
252
+ notify_kev.fflags = NOTE_TRIGGER;
253
+ notify_kev.udata = NGX_KQUEUE_UDATA_T ((uintptr_t) &notify_event);
254
+
255
+ return NGX_OK;
256
+ }
257
+
258
+ #endif
259
+
260
+
250
261
  static void
251
262
  ngx_kqueue_done(ngx_cycle_t *cycle)
252
263
  {
@@ -257,17 +268,9 @@ ngx_kqueue_done(ngx_cycle_t *cycle)
257
268
 
258
269
  ngx_kqueue = -1;
259
270
 
260
- #if (NGX_THREADS)
261
- ngx_mutex_destroy(kevent_mutex);
262
- ngx_mutex_destroy(list_mutex);
263
- #endif
264
-
265
- ngx_free(change_list1);
266
- ngx_free(change_list0);
271
+ ngx_free(change_list);
267
272
  ngx_free(event_list);
268
273
 
269
- change_list1 = NULL;
270
- change_list0 = NULL;
271
274
  change_list = NULL;
272
275
  event_list = NULL;
273
276
  max_changes = 0;
@@ -289,8 +292,6 @@ ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
289
292
  ev->disabled = 0;
290
293
  ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;
291
294
 
292
- ngx_mutex_lock(list_mutex);
293
-
294
295
  #if 0
295
296
 
296
297
  if (ev->index < nchanges
@@ -315,8 +316,6 @@ ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
315
316
  e->index = ev->index;
316
317
  }
317
318
 
318
- ngx_mutex_unlock(list_mutex);
319
-
320
319
  return NGX_OK;
321
320
  }
322
321
 
@@ -325,8 +324,6 @@ ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
325
324
  ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
326
325
  "previous event on #%d were not passed in kernel", c->fd);
327
326
 
328
- ngx_mutex_unlock(list_mutex);
329
-
330
327
  return NGX_ERROR;
331
328
  }
332
329
 
@@ -334,8 +331,6 @@ ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
334
331
 
335
332
  rc = ngx_kqueue_set_event(ev, event, EV_ADD|EV_ENABLE|flags);
336
333
 
337
- ngx_mutex_unlock(list_mutex);
338
-
339
334
  return rc;
340
335
  }
341
336
 
@@ -349,8 +344,6 @@ ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
349
344
  ev->active = 0;
350
345
  ev->disabled = 0;
351
346
 
352
- ngx_mutex_lock(list_mutex);
353
-
354
347
  if (ev->index < nchanges
355
348
  && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)
356
349
  == (uintptr_t) ev)
@@ -370,8 +363,6 @@ ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
370
363
  e->index = ev->index;
371
364
  }
372
365
 
373
- ngx_mutex_unlock(list_mutex);
374
-
375
366
  return NGX_OK;
376
367
  }
377
368
 
@@ -382,7 +373,6 @@ ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
382
373
  */
383
374
 
384
375
  if (flags & NGX_CLOSE_EVENT) {
385
- ngx_mutex_unlock(list_mutex);
386
376
  return NGX_OK;
387
377
  }
388
378
 
@@ -395,8 +385,6 @@ ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
395
385
 
396
386
  rc = ngx_kqueue_set_event(ev, event, flags);
397
387
 
398
- ngx_mutex_unlock(list_mutex);
399
-
400
388
  return rc;
401
389
  }
402
390
 
@@ -487,6 +475,25 @@ ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter, ngx_uint_t flags)
487
475
  }
488
476
 
489
477
 
478
+ #ifdef EVFILT_USER
479
+
480
+ static ngx_int_t
481
+ ngx_kqueue_notify(ngx_event_handler_pt handler)
482
+ {
483
+ notify_event.handler = handler;
484
+
485
+ if (kevent(ngx_kqueue, &notify_kev, 1, NULL, 0, NULL) == -1) {
486
+ ngx_log_error(NGX_LOG_ALERT, notify_event.log, ngx_errno,
487
+ "kevent(EVFILT_USER, NOTE_TRIGGER) failed");
488
+ return NGX_ERROR;
489
+ }
490
+
491
+ return NGX_OK;
492
+ }
493
+
494
+ #endif
495
+
496
+
490
497
  static ngx_int_t
491
498
  ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
492
499
  ngx_uint_t flags)
@@ -495,20 +502,12 @@ ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
495
502
  ngx_int_t i, instance;
496
503
  ngx_uint_t level;
497
504
  ngx_err_t err;
498
- ngx_event_t *ev, **queue;
505
+ ngx_event_t *ev;
506
+ ngx_queue_t *queue;
499
507
  struct timespec ts, *tp;
500
508
 
501
- if (ngx_threaded) {
502
- if (ngx_kqueue_process_changes(cycle, 0) == NGX_ERROR) {
503
- return NGX_ERROR;
504
- }
505
-
506
- n = 0;
507
-
508
- } else {
509
- n = (int) nchanges;
510
- nchanges = 0;
511
- }
509
+ n = (int) nchanges;
510
+ nchanges = 0;
512
511
 
513
512
  if (timer == NGX_TIMER_INFINITE) {
514
513
  tp = NULL;
@@ -573,8 +572,6 @@ ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
573
572
  return NGX_ERROR;
574
573
  }
575
574
 
576
- ngx_mutex_lock(ngx_posted_events_mutex);
577
-
578
575
  for (i = 0; i < events; i++) {
579
576
 
580
577
  ngx_kqueue_dump_event(cycle->log, &event_list[i]);
@@ -626,24 +623,6 @@ ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
626
623
  ev->active = 0;
627
624
  }
628
625
 
629
- #if (NGX_THREADS)
630
-
631
- if ((flags & NGX_POST_THREAD_EVENTS) && !ev->accept) {
632
- ev->posted_ready = 1;
633
- ev->posted_available = event_list[i].data;
634
-
635
- if (event_list[i].flags & EV_EOF) {
636
- ev->posted_eof = 1;
637
- ev->posted_errno = event_list[i].fflags;
638
- }
639
-
640
- ngx_locked_post_event(ev, &ngx_posted_events);
641
-
642
- continue;
643
- }
644
-
645
- #endif
646
-
647
626
  ev->available = event_list[i].data;
648
627
 
649
628
  if (event_list[i].flags & EV_EOF) {
@@ -666,6 +645,11 @@ ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
666
645
 
667
646
  break;
668
647
 
648
+ #ifdef EVFILT_USER
649
+ case EVFILT_USER:
650
+ break;
651
+ #endif
652
+
669
653
  default:
670
654
  ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
671
655
  "unexpected kevent() filter %d",
@@ -674,9 +658,10 @@ ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
674
658
  }
675
659
 
676
660
  if (flags & NGX_POST_EVENTS) {
677
- queue = (ngx_event_t **) (ev->accept ? &ngx_posted_accept_events:
678
- &ngx_posted_events);
679
- ngx_locked_post_event(ev, queue);
661
+ queue = ev->accept ? &ngx_posted_accept_events
662
+ : &ngx_posted_events;
663
+
664
+ ngx_post_event(ev, queue);
680
665
 
681
666
  continue;
682
667
  }
@@ -684,65 +669,10 @@ ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
684
669
  ev->handler(ev);
685
670
  }
686
671
 
687
- ngx_mutex_unlock(ngx_posted_events_mutex);
688
-
689
672
  return NGX_OK;
690
673
  }
691
674
 
692
675
 
693
- static ngx_int_t
694
- ngx_kqueue_process_changes(ngx_cycle_t *cycle, ngx_uint_t try)
695
- {
696
- int n;
697
- ngx_int_t rc;
698
- ngx_err_t err;
699
- struct timespec ts;
700
- struct kevent *changes;
701
-
702
- ngx_mutex_lock(kevent_mutex);
703
-
704
- ngx_mutex_lock(list_mutex);
705
-
706
- if (nchanges == 0) {
707
- ngx_mutex_unlock(list_mutex);
708
- ngx_mutex_unlock(kevent_mutex);
709
- return NGX_OK;
710
- }
711
-
712
- changes = change_list;
713
- if (change_list == change_list0) {
714
- change_list = change_list1;
715
- } else {
716
- change_list = change_list0;
717
- }
718
-
719
- n = (int) nchanges;
720
- nchanges = 0;
721
-
722
- ngx_mutex_unlock(list_mutex);
723
-
724
- ts.tv_sec = 0;
725
- ts.tv_nsec = 0;
726
-
727
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
728
- "kevent changes: %d", n);
729
-
730
- if (kevent(ngx_kqueue, changes, n, NULL, 0, &ts) == -1) {
731
- err = ngx_errno;
732
- ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
733
- cycle->log, err, "kevent() failed");
734
- rc = NGX_ERROR;
735
-
736
- } else {
737
- rc = NGX_OK;
738
- }
739
-
740
- ngx_mutex_unlock(kevent_mutex);
741
-
742
- return rc;
743
- }
744
-
745
-
746
676
  static ngx_inline void
747
677
  ngx_kqueue_dump_event(ngx_log_t *log, struct kevent *kev)
748
678
  {