nginxtra 1.0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (363) hide show
  1. data/VERSION +1 -0
  2. data/bin/nginxtra +5 -0
  3. data/lib/nginxtra.rb +12 -0
  4. data/lib/nginxtra/action.rb +36 -0
  5. data/lib/nginxtra/actions/compile.rb +60 -0
  6. data/lib/nginxtra/actions/install.rb +99 -0
  7. data/lib/nginxtra/actions/reload.rb +14 -0
  8. data/lib/nginxtra/actions/restart.rb +15 -0
  9. data/lib/nginxtra/actions/start.rb +53 -0
  10. data/lib/nginxtra/actions/status.rb +31 -0
  11. data/lib/nginxtra/actions/stop.rb +14 -0
  12. data/lib/nginxtra/cli.rb +77 -0
  13. data/lib/nginxtra/config.rb +339 -0
  14. data/lib/nginxtra/error.rb +13 -0
  15. data/lib/nginxtra/status.rb +57 -0
  16. data/src/nginx/CHANGES +5630 -0
  17. data/src/nginx/CHANGES.ru +5716 -0
  18. data/src/nginx/LICENSE +25 -0
  19. data/src/nginx/README +3 -0
  20. data/src/nginx/auto/cc/acc +15 -0
  21. data/src/nginx/auto/cc/bcc +72 -0
  22. data/src/nginx/auto/cc/ccc +46 -0
  23. data/src/nginx/auto/cc/conf +189 -0
  24. data/src/nginx/auto/cc/gcc +183 -0
  25. data/src/nginx/auto/cc/icc +121 -0
  26. data/src/nginx/auto/cc/msvc +138 -0
  27. data/src/nginx/auto/cc/name +101 -0
  28. data/src/nginx/auto/cc/owc +104 -0
  29. data/src/nginx/auto/cc/sunc +158 -0
  30. data/src/nginx/auto/define +12 -0
  31. data/src/nginx/auto/endianess +45 -0
  32. data/src/nginx/auto/feature +123 -0
  33. data/src/nginx/auto/have +12 -0
  34. data/src/nginx/auto/have_headers +12 -0
  35. data/src/nginx/auto/headers +13 -0
  36. data/src/nginx/auto/include +61 -0
  37. data/src/nginx/auto/init +51 -0
  38. data/src/nginx/auto/install +184 -0
  39. data/src/nginx/auto/lib/conf +83 -0
  40. data/src/nginx/auto/lib/geoip/conf +79 -0
  41. data/src/nginx/auto/lib/google-perftools/conf +45 -0
  42. data/src/nginx/auto/lib/libatomic/conf +43 -0
  43. data/src/nginx/auto/lib/libatomic/make +14 -0
  44. data/src/nginx/auto/lib/libgd/conf +83 -0
  45. data/src/nginx/auto/lib/libxslt/conf +156 -0
  46. data/src/nginx/auto/lib/make +32 -0
  47. data/src/nginx/auto/lib/md5/conf +103 -0
  48. data/src/nginx/auto/lib/md5/make +96 -0
  49. data/src/nginx/auto/lib/md5/makefile.bcc +22 -0
  50. data/src/nginx/auto/lib/md5/makefile.msvc +22 -0
  51. data/src/nginx/auto/lib/md5/makefile.owc +11 -0
  52. data/src/nginx/auto/lib/openssl/conf +74 -0
  53. data/src/nginx/auto/lib/openssl/make +67 -0
  54. data/src/nginx/auto/lib/openssl/makefile.bcc +18 -0
  55. data/src/nginx/auto/lib/openssl/makefile.msvc +14 -0
  56. data/src/nginx/auto/lib/pcre/conf +180 -0
  57. data/src/nginx/auto/lib/pcre/make +64 -0
  58. data/src/nginx/auto/lib/pcre/makefile.bcc +26 -0
  59. data/src/nginx/auto/lib/pcre/makefile.msvc +22 -0
  60. data/src/nginx/auto/lib/pcre/makefile.owc +24 -0
  61. data/src/nginx/auto/lib/perl/conf +60 -0
  62. data/src/nginx/auto/lib/perl/make +36 -0
  63. data/src/nginx/auto/lib/sha1/conf +79 -0
  64. data/src/nginx/auto/lib/sha1/make +96 -0
  65. data/src/nginx/auto/lib/sha1/makefile.bcc +22 -0
  66. data/src/nginx/auto/lib/sha1/makefile.msvc +22 -0
  67. data/src/nginx/auto/lib/sha1/makefile.owc +11 -0
  68. data/src/nginx/auto/lib/test +40 -0
  69. data/src/nginx/auto/lib/zlib/conf +76 -0
  70. data/src/nginx/auto/lib/zlib/make +114 -0
  71. data/src/nginx/auto/lib/zlib/makefile.bcc +15 -0
  72. data/src/nginx/auto/lib/zlib/makefile.msvc +14 -0
  73. data/src/nginx/auto/lib/zlib/makefile.owc +14 -0
  74. data/src/nginx/auto/lib/zlib/patch.zlib.h +10 -0
  75. data/src/nginx/auto/make +417 -0
  76. data/src/nginx/auto/modules +479 -0
  77. data/src/nginx/auto/nohave +12 -0
  78. data/src/nginx/auto/options +490 -0
  79. data/src/nginx/auto/os/conf +105 -0
  80. data/src/nginx/auto/os/darwin +116 -0
  81. data/src/nginx/auto/os/freebsd +136 -0
  82. data/src/nginx/auto/os/linux +152 -0
  83. data/src/nginx/auto/os/solaris +60 -0
  84. data/src/nginx/auto/os/win32 +29 -0
  85. data/src/nginx/auto/sources +518 -0
  86. data/src/nginx/auto/stubs +8 -0
  87. data/src/nginx/auto/summary +114 -0
  88. data/src/nginx/auto/types/sizeof +83 -0
  89. data/src/nginx/auto/types/typedef +77 -0
  90. data/src/nginx/auto/types/uintptr_t +42 -0
  91. data/src/nginx/auto/types/value +12 -0
  92. data/src/nginx/auto/unix +719 -0
  93. data/src/nginx/conf/fastcgi.conf +24 -0
  94. data/src/nginx/conf/fastcgi_params +23 -0
  95. data/src/nginx/conf/koi-utf +109 -0
  96. data/src/nginx/conf/koi-win +103 -0
  97. data/src/nginx/conf/mime.types +80 -0
  98. data/src/nginx/conf/nginx.conf +118 -0
  99. data/src/nginx/conf/scgi_params +15 -0
  100. data/src/nginx/conf/uwsgi_params +15 -0
  101. data/src/nginx/conf/win-utf +126 -0
  102. data/src/nginx/configure +108 -0
  103. data/src/nginx/contrib/README +15 -0
  104. data/src/nginx/contrib/geo2nginx.pl +58 -0
  105. data/src/nginx/contrib/unicode2nginx/koi-utf +131 -0
  106. data/src/nginx/contrib/unicode2nginx/unicode-to-nginx.pl +45 -0
  107. data/src/nginx/contrib/unicode2nginx/win-utf +130 -0
  108. data/src/nginx/html/50x.html +18 -0
  109. data/src/nginx/html/index.html +8 -0
  110. data/src/nginx/man/nginx.8 +202 -0
  111. data/src/nginx/src/core/nginx.c +1333 -0
  112. data/src/nginx/src/core/nginx.h +20 -0
  113. data/src/nginx/src/core/ngx_array.c +147 -0
  114. data/src/nginx/src/core/ngx_array.h +53 -0
  115. data/src/nginx/src/core/ngx_buf.c +218 -0
  116. data/src/nginx/src/core/ngx_buf.h +162 -0
  117. data/src/nginx/src/core/ngx_conf_file.c +1506 -0
  118. data/src/nginx/src/core/ngx_conf_file.h +348 -0
  119. data/src/nginx/src/core/ngx_config.h +134 -0
  120. data/src/nginx/src/core/ngx_connection.c +1074 -0
  121. data/src/nginx/src/core/ngx_connection.h +195 -0
  122. data/src/nginx/src/core/ngx_core.h +95 -0
  123. data/src/nginx/src/core/ngx_cpuinfo.c +139 -0
  124. data/src/nginx/src/core/ngx_crc.h +39 -0
  125. data/src/nginx/src/core/ngx_crc32.c +129 -0
  126. data/src/nginx/src/core/ngx_crc32.h +79 -0
  127. data/src/nginx/src/core/ngx_crypt.c +238 -0
  128. data/src/nginx/src/core/ngx_crypt.h +20 -0
  129. data/src/nginx/src/core/ngx_cycle.c +1379 -0
  130. data/src/nginx/src/core/ngx_cycle.h +142 -0
  131. data/src/nginx/src/core/ngx_file.c +993 -0
  132. data/src/nginx/src/core/ngx_file.h +151 -0
  133. data/src/nginx/src/core/ngx_hash.c +976 -0
  134. data/src/nginx/src/core/ngx_hash.h +122 -0
  135. data/src/nginx/src/core/ngx_inet.c +1008 -0
  136. data/src/nginx/src/core/ngx_inet.h +120 -0
  137. data/src/nginx/src/core/ngx_list.c +71 -0
  138. data/src/nginx/src/core/ngx_list.h +83 -0
  139. data/src/nginx/src/core/ngx_log.c +459 -0
  140. data/src/nginx/src/core/ngx_log.h +250 -0
  141. data/src/nginx/src/core/ngx_md5.c +289 -0
  142. data/src/nginx/src/core/ngx_md5.h +60 -0
  143. data/src/nginx/src/core/ngx_murmurhash.c +50 -0
  144. data/src/nginx/src/core/ngx_murmurhash.h +19 -0
  145. data/src/nginx/src/core/ngx_open_file_cache.c +882 -0
  146. data/src/nginx/src/core/ngx_open_file_cache.h +119 -0
  147. data/src/nginx/src/core/ngx_output_chain.c +673 -0
  148. data/src/nginx/src/core/ngx_palloc.c +433 -0
  149. data/src/nginx/src/core/ngx_palloc.h +95 -0
  150. data/src/nginx/src/core/ngx_parse.c +249 -0
  151. data/src/nginx/src/core/ngx_parse.h +24 -0
  152. data/src/nginx/src/core/ngx_queue.c +80 -0
  153. data/src/nginx/src/core/ngx_queue.h +112 -0
  154. data/src/nginx/src/core/ngx_radix_tree.c +291 -0
  155. data/src/nginx/src/core/ngx_radix_tree.h +46 -0
  156. data/src/nginx/src/core/ngx_rbtree.c +383 -0
  157. data/src/nginx/src/core/ngx_rbtree.h +84 -0
  158. data/src/nginx/src/core/ngx_regex.c +206 -0
  159. data/src/nginx/src/core/ngx_regex.h +56 -0
  160. data/src/nginx/src/core/ngx_resolver.c +2201 -0
  161. data/src/nginx/src/core/ngx_resolver.h +149 -0
  162. data/src/nginx/src/core/ngx_sha1.h +31 -0
  163. data/src/nginx/src/core/ngx_shmtx.c +284 -0
  164. data/src/nginx/src/core/ngx_shmtx.h +38 -0
  165. data/src/nginx/src/core/ngx_slab.c +701 -0
  166. data/src/nginx/src/core/ngx_slab.h +54 -0
  167. data/src/nginx/src/core/ngx_spinlock.c +53 -0
  168. data/src/nginx/src/core/ngx_string.c +1837 -0
  169. data/src/nginx/src/core/ngx_string.h +231 -0
  170. data/src/nginx/src/core/ngx_times.c +407 -0
  171. data/src/nginx/src/core/ngx_times.h +51 -0
  172. data/src/nginx/src/event/modules/ngx_aio_module.c +171 -0
  173. data/src/nginx/src/event/modules/ngx_devpoll_module.c +569 -0
  174. data/src/nginx/src/event/modules/ngx_epoll_module.c +833 -0
  175. data/src/nginx/src/event/modules/ngx_eventport_module.c +602 -0
  176. data/src/nginx/src/event/modules/ngx_kqueue_module.c +785 -0
  177. data/src/nginx/src/event/modules/ngx_poll_module.c +443 -0
  178. data/src/nginx/src/event/modules/ngx_rtsig_module.c +735 -0
  179. data/src/nginx/src/event/modules/ngx_select_module.c +435 -0
  180. data/src/nginx/src/event/modules/ngx_win32_select_module.c +400 -0
  181. data/src/nginx/src/event/ngx_event.c +1275 -0
  182. data/src/nginx/src/event/ngx_event.h +573 -0
  183. data/src/nginx/src/event/ngx_event_accept.c +428 -0
  184. data/src/nginx/src/event/ngx_event_busy_lock.c +286 -0
  185. data/src/nginx/src/event/ngx_event_busy_lock.h +65 -0
  186. data/src/nginx/src/event/ngx_event_connect.c +258 -0
  187. data/src/nginx/src/event/ngx_event_connect.h +76 -0
  188. data/src/nginx/src/event/ngx_event_mutex.c +70 -0
  189. data/src/nginx/src/event/ngx_event_openssl.c +2382 -0
  190. data/src/nginx/src/event/ngx_event_openssl.h +162 -0
  191. data/src/nginx/src/event/ngx_event_pipe.c +996 -0
  192. data/src/nginx/src/event/ngx_event_pipe.h +95 -0
  193. data/src/nginx/src/event/ngx_event_posted.c +173 -0
  194. data/src/nginx/src/event/ngx_event_posted.h +75 -0
  195. data/src/nginx/src/event/ngx_event_timer.c +159 -0
  196. data/src/nginx/src/event/ngx_event_timer.h +102 -0
  197. data/src/nginx/src/http/modules/ngx_http_access_module.c +384 -0
  198. data/src/nginx/src/http/modules/ngx_http_addition_filter_module.c +250 -0
  199. data/src/nginx/src/http/modules/ngx_http_auth_basic_module.c +478 -0
  200. data/src/nginx/src/http/modules/ngx_http_autoindex_module.c +701 -0
  201. data/src/nginx/src/http/modules/ngx_http_browser_module.c +713 -0
  202. data/src/nginx/src/http/modules/ngx_http_charset_filter_module.c +1681 -0
  203. data/src/nginx/src/http/modules/ngx_http_chunked_filter_module.c +242 -0
  204. data/src/nginx/src/http/modules/ngx_http_dav_module.c +1141 -0
  205. data/src/nginx/src/http/modules/ngx_http_degradation_module.c +243 -0
  206. data/src/nginx/src/http/modules/ngx_http_empty_gif_module.c +140 -0
  207. data/src/nginx/src/http/modules/ngx_http_fastcgi_module.c +2916 -0
  208. data/src/nginx/src/http/modules/ngx_http_flv_module.c +254 -0
  209. data/src/nginx/src/http/modules/ngx_http_geo_module.c +1441 -0
  210. data/src/nginx/src/http/modules/ngx_http_geoip_module.c +671 -0
  211. data/src/nginx/src/http/modules/ngx_http_gzip_filter_module.c +1206 -0
  212. data/src/nginx/src/http/modules/ngx_http_gzip_static_module.c +299 -0
  213. data/src/nginx/src/http/modules/ngx_http_headers_filter_module.c +616 -0
  214. data/src/nginx/src/http/modules/ngx_http_image_filter_module.c +1489 -0
  215. data/src/nginx/src/http/modules/ngx_http_index_module.c +516 -0
  216. data/src/nginx/src/http/modules/ngx_http_limit_req_module.c +809 -0
  217. data/src/nginx/src/http/modules/ngx_http_limit_zone_module.c +553 -0
  218. data/src/nginx/src/http/modules/ngx_http_log_module.c +1357 -0
  219. data/src/nginx/src/http/modules/ngx_http_map_module.c +575 -0
  220. data/src/nginx/src/http/modules/ngx_http_memcached_module.c +624 -0
  221. data/src/nginx/src/http/modules/ngx_http_mp4_module.c +3000 -0
  222. data/src/nginx/src/http/modules/ngx_http_not_modified_filter_module.c +143 -0
  223. data/src/nginx/src/http/modules/ngx_http_proxy_module.c +2831 -0
  224. data/src/nginx/src/http/modules/ngx_http_random_index_module.c +317 -0
  225. data/src/nginx/src/http/modules/ngx_http_range_filter_module.c +855 -0
  226. data/src/nginx/src/http/modules/ngx_http_realip_module.c +476 -0
  227. data/src/nginx/src/http/modules/ngx_http_referer_module.c +613 -0
  228. data/src/nginx/src/http/modules/ngx_http_rewrite_module.c +1019 -0
  229. data/src/nginx/src/http/modules/ngx_http_scgi_module.c +1714 -0
  230. data/src/nginx/src/http/modules/ngx_http_secure_link_module.c +355 -0
  231. data/src/nginx/src/http/modules/ngx_http_split_clients_module.c +242 -0
  232. data/src/nginx/src/http/modules/ngx_http_ssi_filter_module.c +2913 -0
  233. data/src/nginx/src/http/modules/ngx_http_ssi_filter_module.h +114 -0
  234. data/src/nginx/src/http/modules/ngx_http_ssl_module.c +652 -0
  235. data/src/nginx/src/http/modules/ngx_http_ssl_module.h +52 -0
  236. data/src/nginx/src/http/modules/ngx_http_static_module.c +278 -0
  237. data/src/nginx/src/http/modules/ngx_http_stub_status_module.c +144 -0
  238. data/src/nginx/src/http/modules/ngx_http_sub_filter_module.c +716 -0
  239. data/src/nginx/src/http/modules/ngx_http_upstream_ip_hash_module.c +237 -0
  240. data/src/nginx/src/http/modules/ngx_http_userid_filter_module.c +846 -0
  241. data/src/nginx/src/http/modules/ngx_http_uwsgi_module.c +1774 -0
  242. data/src/nginx/src/http/modules/ngx_http_xslt_filter_module.c +984 -0
  243. data/src/nginx/src/http/modules/perl/Makefile.PL +42 -0
  244. data/src/nginx/src/http/modules/perl/nginx.pm +137 -0
  245. data/src/nginx/src/http/modules/perl/nginx.xs +986 -0
  246. data/src/nginx/src/http/modules/perl/ngx_http_perl_module.c +1076 -0
  247. data/src/nginx/src/http/modules/perl/ngx_http_perl_module.h +67 -0
  248. data/src/nginx/src/http/modules/perl/typemap +3 -0
  249. data/src/nginx/src/http/ngx_http.c +2073 -0
  250. data/src/nginx/src/http/ngx_http.h +160 -0
  251. data/src/nginx/src/http/ngx_http_busy_lock.c +307 -0
  252. data/src/nginx/src/http/ngx_http_busy_lock.h +54 -0
  253. data/src/nginx/src/http/ngx_http_cache.h +148 -0
  254. data/src/nginx/src/http/ngx_http_config.h +75 -0
  255. data/src/nginx/src/http/ngx_http_copy_filter_module.c +300 -0
  256. data/src/nginx/src/http/ngx_http_core_module.c +4736 -0
  257. data/src/nginx/src/http/ngx_http_core_module.h +541 -0
  258. data/src/nginx/src/http/ngx_http_file_cache.c +1715 -0
  259. data/src/nginx/src/http/ngx_http_header_filter_module.c +623 -0
  260. data/src/nginx/src/http/ngx_http_parse.c +1734 -0
  261. data/src/nginx/src/http/ngx_http_parse_time.c +276 -0
  262. data/src/nginx/src/http/ngx_http_postpone_filter_module.c +178 -0
  263. data/src/nginx/src/http/ngx_http_request.c +3181 -0
  264. data/src/nginx/src/http/ngx_http_request.h +573 -0
  265. data/src/nginx/src/http/ngx_http_request_body.c +644 -0
  266. data/src/nginx/src/http/ngx_http_script.c +1752 -0
  267. data/src/nginx/src/http/ngx_http_script.h +257 -0
  268. data/src/nginx/src/http/ngx_http_special_response.c +789 -0
  269. data/src/nginx/src/http/ngx_http_upstream.c +4555 -0
  270. data/src/nginx/src/http/ngx_http_upstream.h +350 -0
  271. data/src/nginx/src/http/ngx_http_upstream_round_robin.c +791 -0
  272. data/src/nginx/src/http/ngx_http_upstream_round_robin.h +85 -0
  273. data/src/nginx/src/http/ngx_http_variables.c +2053 -0
  274. data/src/nginx/src/http/ngx_http_variables.h +115 -0
  275. data/src/nginx/src/http/ngx_http_write_filter_module.c +315 -0
  276. data/src/nginx/src/mail/ngx_mail.c +542 -0
  277. data/src/nginx/src/mail/ngx_mail.h +407 -0
  278. data/src/nginx/src/mail/ngx_mail_auth_http_module.c +1452 -0
  279. data/src/nginx/src/mail/ngx_mail_core_module.c +553 -0
  280. data/src/nginx/src/mail/ngx_mail_handler.c +773 -0
  281. data/src/nginx/src/mail/ngx_mail_imap_handler.c +457 -0
  282. data/src/nginx/src/mail/ngx_mail_imap_module.c +253 -0
  283. data/src/nginx/src/mail/ngx_mail_imap_module.h +39 -0
  284. data/src/nginx/src/mail/ngx_mail_parse.c +885 -0
  285. data/src/nginx/src/mail/ngx_mail_pop3_handler.c +500 -0
  286. data/src/nginx/src/mail/ngx_mail_pop3_module.c +264 -0
  287. data/src/nginx/src/mail/ngx_mail_pop3_module.h +38 -0
  288. data/src/nginx/src/mail/ngx_mail_proxy_module.c +1089 -0
  289. data/src/nginx/src/mail/ngx_mail_smtp_handler.c +872 -0
  290. data/src/nginx/src/mail/ngx_mail_smtp_module.c +308 -0
  291. data/src/nginx/src/mail/ngx_mail_smtp_module.h +45 -0
  292. data/src/nginx/src/mail/ngx_mail_ssl_module.c +491 -0
  293. data/src/nginx/src/mail/ngx_mail_ssl_module.h +52 -0
  294. data/src/nginx/src/misc/ngx_cpp_test_module.cpp +27 -0
  295. data/src/nginx/src/misc/ngx_google_perftools_module.c +126 -0
  296. data/src/nginx/src/os/unix/ngx_aio_read.c +109 -0
  297. data/src/nginx/src/os/unix/ngx_aio_read_chain.c +78 -0
  298. data/src/nginx/src/os/unix/ngx_aio_write.c +109 -0
  299. data/src/nginx/src/os/unix/ngx_aio_write_chain.c +100 -0
  300. data/src/nginx/src/os/unix/ngx_alloc.c +90 -0
  301. data/src/nginx/src/os/unix/ngx_alloc.h +45 -0
  302. data/src/nginx/src/os/unix/ngx_atomic.h +311 -0
  303. data/src/nginx/src/os/unix/ngx_channel.c +258 -0
  304. data/src/nginx/src/os/unix/ngx_channel.h +34 -0
  305. data/src/nginx/src/os/unix/ngx_daemon.c +69 -0
  306. data/src/nginx/src/os/unix/ngx_darwin.h +20 -0
  307. data/src/nginx/src/os/unix/ngx_darwin_config.h +96 -0
  308. data/src/nginx/src/os/unix/ngx_darwin_init.c +166 -0
  309. data/src/nginx/src/os/unix/ngx_darwin_sendfile_chain.c +366 -0
  310. data/src/nginx/src/os/unix/ngx_errno.c +87 -0
  311. data/src/nginx/src/os/unix/ngx_errno.h +68 -0
  312. data/src/nginx/src/os/unix/ngx_file_aio_read.c +208 -0
  313. data/src/nginx/src/os/unix/ngx_files.c +566 -0
  314. data/src/nginx/src/os/unix/ngx_files.h +343 -0
  315. data/src/nginx/src/os/unix/ngx_freebsd.h +24 -0
  316. data/src/nginx/src/os/unix/ngx_freebsd_config.h +119 -0
  317. data/src/nginx/src/os/unix/ngx_freebsd_init.c +259 -0
  318. data/src/nginx/src/os/unix/ngx_freebsd_rfork_thread.c +756 -0
  319. data/src/nginx/src/os/unix/ngx_freebsd_rfork_thread.h +122 -0
  320. data/src/nginx/src/os/unix/ngx_freebsd_sendfile_chain.c +436 -0
  321. data/src/nginx/src/os/unix/ngx_gcc_atomic_amd64.h +82 -0
  322. data/src/nginx/src/os/unix/ngx_gcc_atomic_ppc.h +155 -0
  323. data/src/nginx/src/os/unix/ngx_gcc_atomic_sparc64.h +82 -0
  324. data/src/nginx/src/os/unix/ngx_gcc_atomic_x86.h +127 -0
  325. data/src/nginx/src/os/unix/ngx_linux.h +18 -0
  326. data/src/nginx/src/os/unix/ngx_linux_aio_read.c +137 -0
  327. data/src/nginx/src/os/unix/ngx_linux_config.h +117 -0
  328. data/src/nginx/src/os/unix/ngx_linux_init.c +91 -0
  329. data/src/nginx/src/os/unix/ngx_linux_sendfile_chain.c +378 -0
  330. data/src/nginx/src/os/unix/ngx_os.h +84 -0
  331. data/src/nginx/src/os/unix/ngx_posix_config.h +153 -0
  332. data/src/nginx/src/os/unix/ngx_posix_init.c +124 -0
  333. data/src/nginx/src/os/unix/ngx_process.c +590 -0
  334. data/src/nginx/src/os/unix/ngx_process.h +87 -0
  335. data/src/nginx/src/os/unix/ngx_process_cycle.c +1390 -0
  336. data/src/nginx/src/os/unix/ngx_process_cycle.h +61 -0
  337. data/src/nginx/src/os/unix/ngx_pthread_thread.c +278 -0
  338. data/src/nginx/src/os/unix/ngx_readv_chain.c +258 -0
  339. data/src/nginx/src/os/unix/ngx_recv.c +180 -0
  340. data/src/nginx/src/os/unix/ngx_send.c +73 -0
  341. data/src/nginx/src/os/unix/ngx_setproctitle.c +135 -0
  342. data/src/nginx/src/os/unix/ngx_setproctitle.h +52 -0
  343. data/src/nginx/src/os/unix/ngx_shmem.c +126 -0
  344. data/src/nginx/src/os/unix/ngx_shmem.h +29 -0
  345. data/src/nginx/src/os/unix/ngx_socket.c +116 -0
  346. data/src/nginx/src/os/unix/ngx_socket.h +64 -0
  347. data/src/nginx/src/os/unix/ngx_solaris.h +16 -0
  348. data/src/nginx/src/os/unix/ngx_solaris_config.h +107 -0
  349. data/src/nginx/src/os/unix/ngx_solaris_init.c +75 -0
  350. data/src/nginx/src/os/unix/ngx_solaris_sendfilev_chain.c +251 -0
  351. data/src/nginx/src/os/unix/ngx_sunpro_amd64.il +43 -0
  352. data/src/nginx/src/os/unix/ngx_sunpro_atomic_sparc64.h +61 -0
  353. data/src/nginx/src/os/unix/ngx_sunpro_sparc64.il +36 -0
  354. data/src/nginx/src/os/unix/ngx_sunpro_x86.il +44 -0
  355. data/src/nginx/src/os/unix/ngx_thread.h +128 -0
  356. data/src/nginx/src/os/unix/ngx_time.c +104 -0
  357. data/src/nginx/src/os/unix/ngx_time.h +66 -0
  358. data/src/nginx/src/os/unix/ngx_udp_recv.c +115 -0
  359. data/src/nginx/src/os/unix/ngx_user.c +109 -0
  360. data/src/nginx/src/os/unix/ngx_user.h +24 -0
  361. data/src/nginx/src/os/unix/ngx_writev_chain.c +181 -0
  362. data/src/nginx/src/os/unix/rfork_thread.S +73 -0
  363. metadata +419 -0
@@ -0,0 +1,259 @@
1
+
2
+ /*
3
+ * Copyright (C) Igor Sysoev
4
+ * Copyright (C) Nginx, Inc.
5
+ */
6
+
7
+
8
+ #include <ngx_config.h>
9
+ #include <ngx_core.h>
10
+
11
+
12
+ /* FreeBSD 3.0 at least */
13
+ char ngx_freebsd_kern_ostype[16];
14
+ char ngx_freebsd_kern_osrelease[128];
15
+ int ngx_freebsd_kern_osreldate;
16
+ int ngx_freebsd_hw_ncpu;
17
+ int ngx_freebsd_kern_ipc_somaxconn;
18
+ u_long ngx_freebsd_net_inet_tcp_sendspace;
19
+
20
+ /* FreeBSD 4.9 */
21
+ int ngx_freebsd_machdep_hlt_logical_cpus;
22
+
23
+
24
+ ngx_uint_t ngx_freebsd_sendfile_nbytes_bug;
25
+ ngx_uint_t ngx_freebsd_use_tcp_nopush;
26
+ ngx_uint_t ngx_freebsd_debug_malloc;
27
+
28
+
29
+ static ngx_os_io_t ngx_freebsd_io = {
30
+ ngx_unix_recv,
31
+ ngx_readv_chain,
32
+ ngx_udp_unix_recv,
33
+ ngx_unix_send,
34
+ #if (NGX_HAVE_SENDFILE)
35
+ ngx_freebsd_sendfile_chain,
36
+ NGX_IO_SENDFILE
37
+ #else
38
+ ngx_writev_chain,
39
+ 0
40
+ #endif
41
+ };
42
+
43
+
44
+ typedef struct {
45
+ char *name;
46
+ void *value;
47
+ size_t size;
48
+ ngx_uint_t exists;
49
+ } sysctl_t;
50
+
51
+
52
+ sysctl_t sysctls[] = {
53
+ { "hw.ncpu",
54
+ &ngx_freebsd_hw_ncpu,
55
+ sizeof(ngx_freebsd_hw_ncpu), 0 },
56
+
57
+ { "machdep.hlt_logical_cpus",
58
+ &ngx_freebsd_machdep_hlt_logical_cpus,
59
+ sizeof(ngx_freebsd_machdep_hlt_logical_cpus), 0 },
60
+
61
+ { "net.inet.tcp.sendspace",
62
+ &ngx_freebsd_net_inet_tcp_sendspace,
63
+ sizeof(ngx_freebsd_net_inet_tcp_sendspace), 0 },
64
+
65
+ { "kern.ipc.somaxconn",
66
+ &ngx_freebsd_kern_ipc_somaxconn,
67
+ sizeof(ngx_freebsd_kern_ipc_somaxconn), 0 },
68
+
69
+ { NULL, NULL, 0, 0 }
70
+ };
71
+
72
+
73
+ void
74
+ ngx_debug_init()
75
+ {
76
+ #if (NGX_DEBUG_MALLOC)
77
+
78
+ #if __FreeBSD_version >= 500014
79
+ _malloc_options = "J";
80
+ #else
81
+ malloc_options = "J";
82
+ #endif
83
+
84
+ ngx_freebsd_debug_malloc = 1;
85
+
86
+ #else
87
+ char *mo;
88
+
89
+ mo = getenv("MALLOC_OPTIONS");
90
+
91
+ if (mo && ngx_strchr(mo, 'J')) {
92
+ ngx_freebsd_debug_malloc = 1;
93
+ }
94
+ #endif
95
+ }
96
+
97
+
98
+ ngx_int_t
99
+ ngx_os_specific_init(ngx_log_t *log)
100
+ {
101
+ int version;
102
+ size_t size;
103
+ ngx_err_t err;
104
+ ngx_uint_t i;
105
+
106
+ size = sizeof(ngx_freebsd_kern_ostype);
107
+ if (sysctlbyname("kern.ostype",
108
+ ngx_freebsd_kern_ostype, &size, NULL, 0) == -1) {
109
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
110
+ "sysctlbyname(kern.ostype) failed");
111
+
112
+ if (ngx_errno != NGX_ENOMEM) {
113
+ return NGX_ERROR;
114
+ }
115
+
116
+ ngx_freebsd_kern_ostype[size - 1] = '\0';
117
+ }
118
+
119
+ size = sizeof(ngx_freebsd_kern_osrelease);
120
+ if (sysctlbyname("kern.osrelease",
121
+ ngx_freebsd_kern_osrelease, &size, NULL, 0) == -1) {
122
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
123
+ "sysctlbyname(kern.osrelease) failed");
124
+
125
+ if (ngx_errno != NGX_ENOMEM) {
126
+ return NGX_ERROR;
127
+ }
128
+
129
+ ngx_freebsd_kern_osrelease[size - 1] = '\0';
130
+ }
131
+
132
+
133
+ size = sizeof(int);
134
+ if (sysctlbyname("kern.osreldate",
135
+ &ngx_freebsd_kern_osreldate, &size, NULL, 0) == -1) {
136
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
137
+ "sysctlbyname(kern.osreldate) failed");
138
+ return NGX_ERROR;
139
+ }
140
+
141
+ version = ngx_freebsd_kern_osreldate;
142
+
143
+
144
+ #if (NGX_HAVE_SENDFILE)
145
+
146
+ /*
147
+ * The determination of the sendfile() "nbytes bug" is complex enough.
148
+ * There are two sendfile() syscalls: a new #393 has no bug while
149
+ * an old #336 has the bug in some versions and has not in others.
150
+ * Besides libc_r wrapper also emulates the bug in some versions.
151
+ * There is no way to say exactly if syscall #336 in FreeBSD circa 4.6
152
+ * has the bug. We use the algorithm that is correct at least for
153
+ * RELEASEs and for syscalls only (not libc_r wrapper).
154
+ *
155
+ * 4.6.1-RELEASE and below have the bug
156
+ * 4.6.2-RELEASE and above have the new syscall
157
+ *
158
+ * We detect the new sendfile() syscall available at the compile time
159
+ * to allow an old binary to run correctly on an updated FreeBSD system.
160
+ */
161
+
162
+ #if (__FreeBSD__ == 4 && __FreeBSD_version >= 460102) \
163
+ || __FreeBSD_version == 460002 || __FreeBSD_version >= 500039
164
+
165
+ /* a new syscall without the bug */
166
+
167
+ ngx_freebsd_sendfile_nbytes_bug = 0;
168
+
169
+ #else
170
+
171
+ /* an old syscall that may have the bug */
172
+
173
+ ngx_freebsd_sendfile_nbytes_bug = 1;
174
+
175
+ #endif
176
+
177
+ #endif /* NGX_HAVE_SENDFILE */
178
+
179
+
180
+ if ((version < 500000 && version >= 440003) || version >= 500017) {
181
+ ngx_freebsd_use_tcp_nopush = 1;
182
+ }
183
+
184
+
185
+ for (i = 0; sysctls[i].name; i++) {
186
+ size = sysctls[i].size;
187
+
188
+ if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0)
189
+ == 0)
190
+ {
191
+ sysctls[i].exists = 1;
192
+ continue;
193
+ }
194
+
195
+ err = ngx_errno;
196
+
197
+ if (err == NGX_ENOENT) {
198
+ continue;
199
+ }
200
+
201
+ ngx_log_error(NGX_LOG_ALERT, log, err,
202
+ "sysctlbyname(%s) failed", sysctls[i].name);
203
+ return NGX_ERROR;
204
+ }
205
+
206
+ if (ngx_freebsd_machdep_hlt_logical_cpus) {
207
+ ngx_ncpu = ngx_freebsd_hw_ncpu / 2;
208
+
209
+ } else {
210
+ ngx_ncpu = ngx_freebsd_hw_ncpu;
211
+ }
212
+
213
+ if (version < 600008 && ngx_freebsd_kern_ipc_somaxconn > 32767) {
214
+ ngx_log_error(NGX_LOG_ALERT, log, 0,
215
+ "sysctl kern.ipc.somaxconn must be less than 32768");
216
+ return NGX_ERROR;
217
+ }
218
+
219
+ ngx_tcp_nodelay_and_tcp_nopush = 1;
220
+
221
+ ngx_os_io = ngx_freebsd_io;
222
+
223
+ return NGX_OK;
224
+ }
225
+
226
+
227
+ void
228
+ ngx_os_specific_status(ngx_log_t *log)
229
+ {
230
+ u_long value;
231
+ ngx_uint_t i;
232
+
233
+ ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",
234
+ ngx_freebsd_kern_ostype, ngx_freebsd_kern_osrelease);
235
+
236
+ #ifdef __DragonFly_version
237
+ ngx_log_error(NGX_LOG_NOTICE, log, 0,
238
+ "kern.osreldate: %d, built on %d",
239
+ ngx_freebsd_kern_osreldate, __DragonFly_version);
240
+ #else
241
+ ngx_log_error(NGX_LOG_NOTICE, log, 0,
242
+ "kern.osreldate: %d, built on %d",
243
+ ngx_freebsd_kern_osreldate, __FreeBSD_version);
244
+ #endif
245
+
246
+ for (i = 0; sysctls[i].name; i++) {
247
+ if (sysctls[i].exists) {
248
+ if (sysctls[i].size == sizeof(long)) {
249
+ value = *(long *) sysctls[i].value;
250
+
251
+ } else {
252
+ value = *(int *) sysctls[i].value;
253
+ }
254
+
255
+ ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l",
256
+ sysctls[i].name, value);
257
+ }
258
+ }
259
+ }
@@ -0,0 +1,756 @@
1
+
2
+ /*
3
+ * Copyright (C) Igor Sysoev
4
+ * Copyright (C) Nginx, Inc.
5
+ */
6
+
7
+
8
+ #include <ngx_config.h>
9
+ #include <ngx_core.h>
10
+
11
+ /*
12
+ * The threads implementation uses the rfork(RFPROC|RFTHREAD|RFMEM) syscall
13
+ * to create threads. All threads use the stacks of the same size mmap()ed
14
+ * below the main stack. Thus the current thread id is determinated via
15
+ * the stack pointer value.
16
+ *
17
+ * The mutex implementation uses the ngx_atomic_cmp_set() operation
18
+ * to acquire a mutex and the SysV semaphore to wait on a mutex and to wake up
19
+ * the waiting threads. The light mutex does not use semaphore, so after
20
+ * spinning in the lock the thread calls sched_yield(). However the light
21
+ * mutecies are intended to be used with the "trylock" operation only.
22
+ * The SysV semop() is a cheap syscall, particularly if it has little sembuf's
23
+ * and does not use SEM_UNDO.
24
+ *
25
+ * The condition variable implementation uses the signal #64.
26
+ * The signal handler is SIG_IGN so the kill() is a cheap syscall.
27
+ * The thread waits a signal in kevent(). The use of the EVFILT_SIGNAL
28
+ * is safe since FreeBSD 4.10-STABLE.
29
+ *
30
+ * This threads implementation currently works on i386 (486+) and amd64
31
+ * platforms only.
32
+ */
33
+
34
+
35
+ char *ngx_freebsd_kern_usrstack;
36
+ size_t ngx_thread_stack_size;
37
+
38
+
39
+ static size_t rz_size;
40
+ static size_t usable_stack_size;
41
+ static char *last_stack;
42
+
43
+ static ngx_uint_t nthreads;
44
+ static ngx_uint_t max_threads;
45
+
46
+ static ngx_uint_t nkeys;
47
+ static ngx_tid_t *tids; /* the threads tids array */
48
+ void **ngx_tls; /* the threads tls's array */
49
+
50
+ /* the thread-safe libc errno */
51
+
52
+ static int errno0; /* the main thread's errno */
53
+ static int *errnos; /* the threads errno's array */
54
+
55
+ int *
56
+ __error()
57
+ {
58
+ int tid;
59
+
60
+ tid = ngx_gettid();
61
+
62
+ return tid ? &errnos[tid - 1] : &errno0;
63
+ }
64
+
65
+
66
+ /*
67
+ * __isthreaded enables the spinlocks in some libc functions, i.e. in malloc()
68
+ * and some other places. Nevertheless we protect our malloc()/free() calls
69
+ * by own mutex that is more efficient than the spinlock.
70
+ *
71
+ * _spinlock() is a weak referenced stub in src/lib/libc/gen/_spinlock_stub.c
72
+ * that does nothing.
73
+ */
74
+
75
+ extern int __isthreaded;
76
+
77
+ void
78
+ _spinlock(ngx_atomic_t *lock)
79
+ {
80
+ ngx_int_t tries;
81
+
82
+ tries = 0;
83
+
84
+ for ( ;; ) {
85
+
86
+ if (*lock) {
87
+ if (ngx_ncpu > 1 && tries++ < 1000) {
88
+ continue;
89
+ }
90
+
91
+ sched_yield();
92
+ tries = 0;
93
+
94
+ } else {
95
+ if (ngx_atomic_cmp_set(lock, 0, 1)) {
96
+ return;
97
+ }
98
+ }
99
+ }
100
+ }
101
+
102
+
103
+ /*
104
+ * Before FreeBSD 5.1 _spinunlock() is a simple #define in
105
+ * src/lib/libc/include/spinlock.h that zeroes lock.
106
+ *
107
+ * Since FreeBSD 5.1 _spinunlock() is a weak referenced stub in
108
+ * src/lib/libc/gen/_spinlock_stub.c that does nothing.
109
+ */
110
+
111
+ #ifndef _spinunlock
112
+
113
+ void
114
+ _spinunlock(ngx_atomic_t *lock)
115
+ {
116
+ *lock = 0;
117
+ }
118
+
119
+ #endif
120
+
121
+
122
+ ngx_err_t
123
+ ngx_create_thread(ngx_tid_t *tid, ngx_thread_value_t (*func)(void *arg),
124
+ void *arg, ngx_log_t *log)
125
+ {
126
+ ngx_pid_t id;
127
+ ngx_err_t err;
128
+ char *stack, *stack_top;
129
+
130
+ if (nthreads >= max_threads) {
131
+ ngx_log_error(NGX_LOG_CRIT, log, 0,
132
+ "no more than %ui threads can be created", max_threads);
133
+ return NGX_ERROR;
134
+ }
135
+
136
+ last_stack -= ngx_thread_stack_size;
137
+
138
+ stack = mmap(last_stack, usable_stack_size, PROT_READ|PROT_WRITE,
139
+ MAP_STACK, -1, 0);
140
+
141
+ if (stack == MAP_FAILED) {
142
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
143
+ "mmap(%p:%uz, MAP_STACK) thread stack failed",
144
+ last_stack, usable_stack_size);
145
+ return NGX_ERROR;
146
+ }
147
+
148
+ if (stack != last_stack) {
149
+ ngx_log_error(NGX_LOG_ALERT, log, 0,
150
+ "stack %p address was changed to %p", last_stack, stack);
151
+ return NGX_ERROR;
152
+ }
153
+
154
+ stack_top = stack + usable_stack_size;
155
+
156
+ ngx_log_debug2(NGX_LOG_DEBUG_CORE, log, 0,
157
+ "thread stack: %p-%p", stack, stack_top);
158
+
159
+ ngx_set_errno(0);
160
+
161
+ id = rfork_thread(RFPROC|RFTHREAD|RFMEM, stack_top,
162
+ (ngx_rfork_thread_func_pt) func, arg);
163
+
164
+ err = ngx_errno;
165
+
166
+ if (id == -1) {
167
+ ngx_log_error(NGX_LOG_ALERT, log, err, "rfork() failed");
168
+
169
+ } else {
170
+ *tid = id;
171
+ nthreads = (ngx_freebsd_kern_usrstack - stack_top)
172
+ / ngx_thread_stack_size;
173
+ tids[nthreads] = id;
174
+
175
+ ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "rfork()ed thread: %P", id);
176
+ }
177
+
178
+ return err;
179
+ }
180
+
181
+
182
+ ngx_int_t
183
+ ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle)
184
+ {
185
+ char *red_zone, *zone;
186
+ size_t len;
187
+ ngx_int_t i;
188
+ struct sigaction sa;
189
+
190
+ max_threads = n + 1;
191
+
192
+ for (i = 0; i < n; i++) {
193
+ ngx_memzero(&sa, sizeof(struct sigaction));
194
+ sa.sa_handler = SIG_IGN;
195
+ sigemptyset(&sa.sa_mask);
196
+ if (sigaction(NGX_CV_SIGNAL, &sa, NULL) == -1) {
197
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
198
+ "sigaction(%d, SIG_IGN) failed", NGX_CV_SIGNAL);
199
+ return NGX_ERROR;
200
+ }
201
+ }
202
+
203
+ len = sizeof(ngx_freebsd_kern_usrstack);
204
+ if (sysctlbyname("kern.usrstack", &ngx_freebsd_kern_usrstack, &len,
205
+ NULL, 0) == -1)
206
+ {
207
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
208
+ "sysctlbyname(kern.usrstack) failed");
209
+ return NGX_ERROR;
210
+ }
211
+
212
+ /* the main thread stack red zone */
213
+ rz_size = ngx_pagesize;
214
+ red_zone = ngx_freebsd_kern_usrstack - (size + rz_size);
215
+
216
+ ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,
217
+ "usrstack: %p red zone: %p",
218
+ ngx_freebsd_kern_usrstack, red_zone);
219
+
220
+ zone = mmap(red_zone, rz_size, PROT_NONE, MAP_ANON, -1, 0);
221
+ if (zone == MAP_FAILED) {
222
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
223
+ "mmap(%p:%uz, PROT_NONE, MAP_ANON) red zone failed",
224
+ red_zone, rz_size);
225
+ return NGX_ERROR;
226
+ }
227
+
228
+ if (zone != red_zone) {
229
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
230
+ "red zone %p address was changed to %p", red_zone, zone);
231
+ return NGX_ERROR;
232
+ }
233
+
234
+ /* create the thread errno' array */
235
+
236
+ errnos = ngx_calloc(n * sizeof(int), cycle->log);
237
+ if (errnos == NULL) {
238
+ return NGX_ERROR;
239
+ }
240
+
241
+ /* create the thread tids array */
242
+
243
+ tids = ngx_calloc((n + 1) * sizeof(ngx_tid_t), cycle->log);
244
+ if (tids == NULL) {
245
+ return NGX_ERROR;
246
+ }
247
+
248
+ tids[0] = ngx_pid;
249
+
250
+ /* create the thread tls' array */
251
+
252
+ ngx_tls = ngx_calloc(NGX_THREAD_KEYS_MAX * (n + 1) * sizeof(void *),
253
+ cycle->log);
254
+ if (ngx_tls == NULL) {
255
+ return NGX_ERROR;
256
+ }
257
+
258
+ nthreads = 1;
259
+
260
+ last_stack = zone + rz_size;
261
+ usable_stack_size = size;
262
+ ngx_thread_stack_size = size + rz_size;
263
+
264
+ /* allow the spinlock in libc malloc() */
265
+ __isthreaded = 1;
266
+
267
+ ngx_threaded = 1;
268
+
269
+ return NGX_OK;
270
+ }
271
+
272
+
273
+ ngx_tid_t
274
+ ngx_thread_self()
275
+ {
276
+ ngx_int_t tid;
277
+
278
+ tid = ngx_gettid();
279
+
280
+ if (tids == NULL) {
281
+ return ngx_pid;
282
+ }
283
+
284
+ return tids[tid];
285
+ }
286
+
287
+
288
+ ngx_err_t
289
+ ngx_thread_key_create(ngx_tls_key_t *key)
290
+ {
291
+ if (nkeys >= NGX_THREAD_KEYS_MAX) {
292
+ return NGX_ENOMEM;
293
+ }
294
+
295
+ *key = nkeys++;
296
+
297
+ return 0;
298
+ }
299
+
300
+
301
+ ngx_err_t
302
+ ngx_thread_set_tls(ngx_tls_key_t key, void *value)
303
+ {
304
+ if (key >= NGX_THREAD_KEYS_MAX) {
305
+ return NGX_EINVAL;
306
+ }
307
+
308
+ ngx_tls[key * NGX_THREAD_KEYS_MAX + ngx_gettid()] = value;
309
+ return 0;
310
+ }
311
+
312
+
313
+ ngx_mutex_t *
314
+ ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags)
315
+ {
316
+ ngx_mutex_t *m;
317
+ union semun op;
318
+
319
+ m = ngx_alloc(sizeof(ngx_mutex_t), log);
320
+ if (m == NULL) {
321
+ return NULL;
322
+ }
323
+
324
+ m->lock = 0;
325
+ m->log = log;
326
+
327
+ if (flags & NGX_MUTEX_LIGHT) {
328
+ m->semid = -1;
329
+ return m;
330
+ }
331
+
332
+ m->semid = semget(IPC_PRIVATE, 1, SEM_R|SEM_A);
333
+ if (m->semid == -1) {
334
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semget() failed");
335
+ return NULL;
336
+ }
337
+
338
+ op.val = 0;
339
+
340
+ if (semctl(m->semid, 0, SETVAL, op) == -1) {
341
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semctl(SETVAL) failed");
342
+
343
+ if (semctl(m->semid, 0, IPC_RMID) == -1) {
344
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
345
+ "semctl(IPC_RMID) failed");
346
+ }
347
+
348
+ return NULL;
349
+ }
350
+
351
+ return m;
352
+ }
353
+
354
+
355
+ void
356
+ ngx_mutex_destroy(ngx_mutex_t *m)
357
+ {
358
+ if (semctl(m->semid, 0, IPC_RMID) == -1) {
359
+ ngx_log_error(NGX_LOG_ALERT, m->log, ngx_errno,
360
+ "semctl(IPC_RMID) failed");
361
+ }
362
+
363
+ ngx_free((void *) m);
364
+ }
365
+
366
+
367
+ ngx_int_t
368
+ ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try)
369
+ {
370
+ uint32_t lock, old;
371
+ ngx_uint_t tries;
372
+ struct sembuf op;
373
+
374
+ if (!ngx_threaded) {
375
+ return NGX_OK;
376
+ }
377
+
378
+ #if (NGX_DEBUG)
379
+ if (try) {
380
+ ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0,
381
+ "try lock mutex %p lock:%XD", m, m->lock);
382
+ } else {
383
+ ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0,
384
+ "lock mutex %p lock:%XD", m, m->lock);
385
+ }
386
+ #endif
387
+
388
+ old = m->lock;
389
+ tries = 0;
390
+
391
+ for ( ;; ) {
392
+ if (old & NGX_MUTEX_LOCK_BUSY) {
393
+
394
+ if (try) {
395
+ return NGX_AGAIN;
396
+ }
397
+
398
+ if (ngx_ncpu > 1 && tries++ < 1000) {
399
+
400
+ /* the spinlock is used only on the SMP system */
401
+
402
+ old = m->lock;
403
+ continue;
404
+ }
405
+
406
+ if (m->semid == -1) {
407
+ sched_yield();
408
+
409
+ tries = 0;
410
+ old = m->lock;
411
+ continue;
412
+ }
413
+
414
+ ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0,
415
+ "mutex %p lock:%XD", m, m->lock);
416
+
417
+ /*
418
+ * The mutex is locked so we increase a number
419
+ * of the threads that are waiting on the mutex
420
+ */
421
+
422
+ lock = old + 1;
423
+
424
+ if ((lock & ~NGX_MUTEX_LOCK_BUSY) > nthreads) {
425
+ ngx_log_error(NGX_LOG_ALERT, m->log, ngx_errno,
426
+ "%D threads wait for mutex %p, "
427
+ "while only %ui threads are available",
428
+ lock & ~NGX_MUTEX_LOCK_BUSY, m, nthreads);
429
+ ngx_abort();
430
+ }
431
+
432
+ if (ngx_atomic_cmp_set(&m->lock, old, lock)) {
433
+
434
+ ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0,
435
+ "wait mutex %p lock:%XD", m, m->lock);
436
+
437
+ /*
438
+ * The number of the waiting threads has been increased
439
+ * and we would wait on the SysV semaphore.
440
+ * A semaphore should wake up us more efficiently than
441
+ * a simple sched_yield() or usleep().
442
+ */
443
+
444
+ op.sem_num = 0;
445
+ op.sem_op = -1;
446
+ op.sem_flg = 0;
447
+
448
+ if (semop(m->semid, &op, 1) == -1) {
449
+ ngx_log_error(NGX_LOG_ALERT, m->log, ngx_errno,
450
+ "semop() failed while waiting on mutex %p", m);
451
+ ngx_abort();
452
+ }
453
+
454
+ ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0,
455
+ "mutex waked up %p lock:%XD", m, m->lock);
456
+
457
+ tries = 0;
458
+ old = m->lock;
459
+ continue;
460
+ }
461
+
462
+ old = m->lock;
463
+
464
+ } else {
465
+ lock = old | NGX_MUTEX_LOCK_BUSY;
466
+
467
+ if (ngx_atomic_cmp_set(&m->lock, old, lock)) {
468
+
469
+ /* we locked the mutex */
470
+
471
+ break;
472
+ }
473
+
474
+ old = m->lock;
475
+ }
476
+
477
+ if (tries++ > 1000) {
478
+
479
+ ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0,
480
+ "mutex %p is contested", m);
481
+
482
+ /* the mutex is probably contested so we are giving up now */
483
+
484
+ sched_yield();
485
+
486
+ tries = 0;
487
+ old = m->lock;
488
+ }
489
+ }
490
+
491
+ ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0,
492
+ "mutex %p is locked, lock:%XD", m, m->lock);
493
+
494
+ return NGX_OK;
495
+ }
496
+
497
+
498
+ void
499
+ ngx_mutex_unlock(ngx_mutex_t *m)
500
+ {
501
+ uint32_t lock, old;
502
+ struct sembuf op;
503
+
504
+ if (!ngx_threaded) {
505
+ return;
506
+ }
507
+
508
+ old = m->lock;
509
+
510
+ if (!(old & NGX_MUTEX_LOCK_BUSY)) {
511
+ ngx_log_error(NGX_LOG_ALERT, m->log, 0,
512
+ "trying to unlock the free mutex %p", m);
513
+ ngx_abort();
514
+ }
515
+
516
+ /* free the mutex */
517
+
518
+ #if 0
519
+ ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0,
520
+ "unlock mutex %p lock:%XD", m, old);
521
+ #endif
522
+
523
+ for ( ;; ) {
524
+ lock = old & ~NGX_MUTEX_LOCK_BUSY;
525
+
526
+ if (ngx_atomic_cmp_set(&m->lock, old, lock)) {
527
+ break;
528
+ }
529
+
530
+ old = m->lock;
531
+ }
532
+
533
+ if (m->semid == -1) {
534
+ ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0,
535
+ "mutex %p is unlocked", m);
536
+
537
+ return;
538
+ }
539
+
540
+ /* check whether we need to wake up a waiting thread */
541
+
542
+ old = m->lock;
543
+
544
+ for ( ;; ) {
545
+ if (old & NGX_MUTEX_LOCK_BUSY) {
546
+
547
+ /* the mutex is just locked by another thread */
548
+
549
+ break;
550
+ }
551
+
552
+ if (old == 0) {
553
+ break;
554
+ }
555
+
556
+ /* there are the waiting threads */
557
+
558
+ lock = old - 1;
559
+
560
+ if (ngx_atomic_cmp_set(&m->lock, old, lock)) {
561
+
562
+ /* wake up the thread that waits on semaphore */
563
+
564
+ ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0,
565
+ "wake up mutex %p", m);
566
+
567
+ op.sem_num = 0;
568
+ op.sem_op = 1;
569
+ op.sem_flg = 0;
570
+
571
+ if (semop(m->semid, &op, 1) == -1) {
572
+ ngx_log_error(NGX_LOG_ALERT, m->log, ngx_errno,
573
+ "semop() failed while waking up on mutex %p", m);
574
+ ngx_abort();
575
+ }
576
+
577
+ break;
578
+ }
579
+
580
+ old = m->lock;
581
+ }
582
+
583
+ ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0,
584
+ "mutex %p is unlocked", m);
585
+
586
+ return;
587
+ }
588
+
589
+
590
+ ngx_cond_t *
591
+ ngx_cond_init(ngx_log_t *log)
592
+ {
593
+ ngx_cond_t *cv;
594
+
595
+ cv = ngx_alloc(sizeof(ngx_cond_t), log);
596
+ if (cv == NULL) {
597
+ return NULL;
598
+ }
599
+
600
+ cv->signo = NGX_CV_SIGNAL;
601
+ cv->tid = -1;
602
+ cv->log = log;
603
+ cv->kq = -1;
604
+
605
+ return cv;
606
+ }
607
+
608
+
609
+ void
610
+ ngx_cond_destroy(ngx_cond_t *cv)
611
+ {
612
+ if (close(cv->kq) == -1) {
613
+ ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno,
614
+ "kqueue close() failed");
615
+ }
616
+
617
+ ngx_free(cv);
618
+ }
619
+
620
+
621
+ ngx_int_t
622
+ ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m)
623
+ {
624
+ int n;
625
+ ngx_err_t err;
626
+ struct kevent kev;
627
+ struct timespec ts;
628
+
629
+ if (cv->kq == -1) {
630
+
631
+ /*
632
+ * We have to add the EVFILT_SIGNAL filter in the rfork()ed thread.
633
+ * Otherwise the thread would not get a signal event.
634
+ *
635
+ * However, we have not to open the kqueue in the thread,
636
+ * it is simply handy do it together.
637
+ */
638
+
639
+ cv->kq = kqueue();
640
+ if (cv->kq == -1) {
641
+ ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno, "kqueue() failed");
642
+ return NGX_ERROR;
643
+ }
644
+
645
+ ngx_log_debug2(NGX_LOG_DEBUG_CORE, cv->log, 0,
646
+ "cv kq:%d signo:%d", cv->kq, cv->signo);
647
+
648
+ kev.ident = cv->signo;
649
+ kev.filter = EVFILT_SIGNAL;
650
+ kev.flags = EV_ADD;
651
+ kev.fflags = 0;
652
+ kev.data = 0;
653
+ kev.udata = NULL;
654
+
655
+ ts.tv_sec = 0;
656
+ ts.tv_nsec = 0;
657
+
658
+ if (kevent(cv->kq, &kev, 1, NULL, 0, &ts) == -1) {
659
+ ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno, "kevent() failed");
660
+ return NGX_ERROR;
661
+ }
662
+
663
+ cv->tid = ngx_thread_self();
664
+ }
665
+
666
+ ngx_mutex_unlock(m);
667
+
668
+ ngx_log_debug3(NGX_LOG_DEBUG_CORE, cv->log, 0,
669
+ "cv %p wait, kq:%d, signo:%d", cv, cv->kq, cv->signo);
670
+
671
+ for ( ;; ) {
672
+ n = kevent(cv->kq, NULL, 0, &kev, 1, NULL);
673
+
674
+ ngx_log_debug2(NGX_LOG_DEBUG_CORE, cv->log, 0,
675
+ "cv %p kevent: %d", cv, n);
676
+
677
+ if (n == -1) {
678
+ err = ngx_errno;
679
+ ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
680
+ cv->log, ngx_errno,
681
+ "kevent() failed while waiting condition variable %p",
682
+ cv);
683
+
684
+ if (err == NGX_EINTR) {
685
+ break;
686
+ }
687
+
688
+ return NGX_ERROR;
689
+ }
690
+
691
+ if (n == 0) {
692
+ ngx_log_error(NGX_LOG_ALERT, cv->log, 0,
693
+ "kevent() returned no events "
694
+ "while waiting condition variable %p",
695
+ cv);
696
+ continue;
697
+ }
698
+
699
+ if (kev.filter != EVFILT_SIGNAL) {
700
+ ngx_log_error(NGX_LOG_ALERT, cv->log, 0,
701
+ "kevent() returned unexpected events: %d "
702
+ "while waiting condition variable %p",
703
+ kev.filter, cv);
704
+ continue;
705
+ }
706
+
707
+ if (kev.ident != (uintptr_t) cv->signo) {
708
+ ngx_log_error(NGX_LOG_ALERT, cv->log, 0,
709
+ "kevent() returned unexpected signal: %d ",
710
+ "while waiting condition variable %p",
711
+ kev.ident, cv);
712
+ continue;
713
+ }
714
+
715
+ break;
716
+ }
717
+
718
+ ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p is waked up", cv);
719
+
720
+ ngx_mutex_lock(m);
721
+
722
+ return NGX_OK;
723
+ }
724
+
725
+
726
+ ngx_int_t
727
+ ngx_cond_signal(ngx_cond_t *cv)
728
+ {
729
+ ngx_err_t err;
730
+
731
+ ngx_log_debug3(NGX_LOG_DEBUG_CORE, cv->log, 0,
732
+ "cv %p to signal %P %d",
733
+ cv, cv->tid, cv->signo);
734
+
735
+ if (cv->tid == -1) {
736
+ return NGX_OK;
737
+ }
738
+
739
+ if (kill(cv->tid, cv->signo) == -1) {
740
+
741
+ err = ngx_errno;
742
+
743
+ ngx_log_error(NGX_LOG_ALERT, cv->log, err,
744
+ "kill() failed while signaling condition variable %p", cv);
745
+
746
+ if (err == NGX_ESRCH) {
747
+ cv->tid = -1;
748
+ }
749
+
750
+ return NGX_ERROR;
751
+ }
752
+
753
+ ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p is signaled", cv);
754
+
755
+ return NGX_OK;
756
+ }