passenger 4.0.20 → 4.0.21

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (496) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.gitignore +1 -0
  5. data/.travis.yml +1 -1
  6. data/NEWS +15 -0
  7. data/README.md +5 -3
  8. data/Rakefile +1 -0
  9. data/bin/passenger-config +1 -5
  10. data/bin/passenger-install-apache2-module +53 -5
  11. data/bin/passenger-install-nginx-module +19 -6
  12. data/bin/passenger-memory-stats +3 -3
  13. data/build/agents.rb +11 -8
  14. data/build/apache2.rb +9 -5
  15. data/build/basics.rb +15 -21
  16. data/build/common_library.rb +16 -6
  17. data/build/cplusplus_support.rb +5 -5
  18. data/build/cxx_tests.rb +3 -3
  19. data/build/documentation.rb +1 -1
  20. data/build/misc.rb +4 -37
  21. data/build/node_tests.rb +29 -0
  22. data/build/oxt_tests.rb +1 -1
  23. data/build/packaging.rb +29 -10
  24. data/build/preprocessor.rb +2 -1
  25. data/build/test_basics.rb +15 -6
  26. data/debian.template/locations.ini.template +1 -0
  27. data/debian.template/passenger.install.template +1 -0
  28. data/dev/copy_boost_headers.rb +7 -3
  29. data/dev/run_travis.sh +32 -16
  30. data/doc/Users guide Apache.idmap.txt +22 -34
  31. data/doc/Users guide Apache.txt +20 -234
  32. data/doc/Users guide Nginx.idmap.txt +84 -66
  33. data/doc/Users guide Nginx.txt +50 -1
  34. data/doc/Users guide Standalone.idmap.txt +74 -0
  35. data/doc/Users guide Standalone.txt +22 -9
  36. data/doc/Users guide.txt +51 -0
  37. data/doc/users_guide_snippets/environment_variables.txt +0 -3
  38. data/doc/users_guide_snippets/installation.txt +337 -380
  39. data/doc/users_guide_snippets/installation/run_installer.txt +58 -0
  40. data/doc/users_guide_snippets/installation/verify_running_epilogue.txt +6 -0
  41. data/doc/users_guide_snippets/support_information.txt +2 -9
  42. data/doc/users_guide_snippets/troubleshooting/default.txt +112 -0
  43. data/doc/users_guide_snippets/troubleshooting/rails.txt +56 -0
  44. data/doc/users_guide_snippets/where_to_get_support.txt +9 -0
  45. data/ext/apache2/Bucket.h +1 -1
  46. data/ext/apache2/Configuration.hpp +0 -44
  47. data/ext/apache2/CreateDirConfig.cpp +1 -1
  48. data/ext/apache2/CreateDirConfig.cpp.erb +1 -1
  49. data/ext/apache2/Hooks.cpp +28 -21
  50. data/ext/apache2/MergeDirConfig.cpp +1 -0
  51. data/ext/apache2/MergeDirConfig.cpp.erb +1 -1
  52. data/ext/apache2/SetHeaders.cpp +73 -0
  53. data/ext/apache2/SetHeaders.cpp.erb +88 -0
  54. data/ext/boost/algorithm/string/detail/find_format.hpp +5 -5
  55. data/ext/boost/algorithm/string/detail/find_format_all.hpp +5 -5
  56. data/ext/boost/algorithm/string/detail/finder.hpp +1 -1
  57. data/ext/boost/algorithm/string/formatter.hpp +2 -2
  58. data/ext/boost/assert.hpp +6 -1
  59. data/ext/boost/atomic.hpp +18 -0
  60. data/ext/boost/atomic/atomic.hpp +241 -0
  61. data/ext/boost/atomic/detail/base.hpp +585 -0
  62. data/ext/boost/atomic/detail/cas32strong.hpp +885 -0
  63. data/ext/boost/atomic/detail/cas32weak.hpp +947 -0
  64. data/ext/boost/atomic/detail/cas64strong.hpp +443 -0
  65. data/ext/boost/atomic/detail/config.hpp +54 -0
  66. data/ext/boost/atomic/detail/gcc-alpha.hpp +368 -0
  67. data/ext/boost/atomic/detail/gcc-armv6plus.hpp +252 -0
  68. data/ext/boost/atomic/detail/gcc-cas.hpp +157 -0
  69. data/ext/boost/atomic/detail/gcc-ppc.hpp +2850 -0
  70. data/ext/boost/atomic/detail/gcc-sparcv9.hpp +1259 -0
  71. data/ext/boost/atomic/detail/gcc-x86.hpp +1766 -0
  72. data/ext/boost/atomic/detail/generic-cas.hpp +206 -0
  73. data/ext/boost/atomic/detail/interlocked.hpp +200 -0
  74. data/ext/boost/atomic/detail/linux-arm.hpp +189 -0
  75. data/ext/boost/atomic/detail/lockpool.hpp +97 -0
  76. data/ext/boost/atomic/detail/platform.hpp +62 -0
  77. data/ext/boost/atomic/detail/type-classification.hpp +45 -0
  78. data/ext/boost/chrono/config.hpp +8 -3
  79. data/ext/boost/chrono/duration.hpp +9 -10
  80. data/ext/boost/chrono/system_clocks.hpp +1 -1
  81. data/ext/boost/chrono/time_point.hpp +4 -3
  82. data/ext/boost/config/auto_link.hpp +53 -52
  83. data/ext/boost/config/compiler/borland.hpp +1 -0
  84. data/ext/boost/config/compiler/clang.hpp +24 -1
  85. data/ext/boost/config/compiler/codegear.hpp +1 -0
  86. data/ext/boost/config/compiler/common_edg.hpp +1 -0
  87. data/ext/boost/config/compiler/cray.hpp +1 -0
  88. data/ext/boost/config/compiler/digitalmars.hpp +1 -0
  89. data/ext/boost/config/compiler/gcc.hpp +29 -3
  90. data/ext/boost/config/compiler/gcc_xml.hpp +2 -1
  91. data/ext/boost/config/compiler/hp_acc.hpp +1 -0
  92. data/ext/boost/config/compiler/intel.hpp +1 -1
  93. data/ext/boost/config/compiler/metrowerks.hpp +1 -0
  94. data/ext/boost/config/compiler/mpw.hpp +1 -0
  95. data/ext/boost/config/compiler/pathscale.hpp +1 -0
  96. data/ext/boost/config/compiler/pgi.hpp +1 -0
  97. data/ext/boost/config/compiler/sunpro_cc.hpp +1 -0
  98. data/ext/boost/config/compiler/vacpp.hpp +3 -2
  99. data/ext/boost/config/compiler/visualc.hpp +25 -11
  100. data/ext/boost/config/platform/vxworks.hpp +353 -15
  101. data/ext/boost/config/select_compiler_config.hpp +4 -4
  102. data/ext/boost/config/stdlib/dinkumware.hpp +10 -3
  103. data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
  104. data/ext/boost/config/suffix.hpp +45 -19
  105. data/ext/boost/date_time/format_date_parser.hpp +1 -11
  106. data/ext/boost/date_time/strings_from_facet.hpp +5 -3
  107. data/ext/boost/detail/atomic_redef_macros.hpp +19 -0
  108. data/ext/boost/detail/atomic_undef_macros.hpp +39 -0
  109. data/ext/boost/detail/endian.hpp +52 -4
  110. data/ext/boost/detail/scoped_enum_emulation.hpp +10 -10
  111. data/ext/boost/detail/select_type.hpp +36 -0
  112. data/ext/boost/exception/current_exception_cast.hpp +1 -1
  113. data/ext/boost/exception/detail/error_info_impl.hpp +3 -5
  114. data/ext/boost/exception/detail/exception_ptr.hpp +3 -3
  115. data/ext/boost/exception/detail/is_output_streamable.hpp +1 -1
  116. data/ext/boost/exception/detail/object_hex_dump.hpp +1 -1
  117. data/ext/boost/exception/detail/type_info.hpp +1 -1
  118. data/ext/boost/exception/diagnostic_information.hpp +15 -14
  119. data/ext/boost/exception/exception.hpp +1 -1
  120. data/ext/boost/exception/get_error_info.hpp +1 -1
  121. data/ext/boost/exception/info.hpp +12 -13
  122. data/ext/boost/exception/to_string.hpp +6 -1
  123. data/ext/boost/exception/to_string_stub.hpp +9 -1
  124. data/ext/boost/foreach.hpp +5 -5
  125. data/ext/boost/function/function_template.hpp +6 -6
  126. data/ext/boost/functional/hash/detail/float_functions.hpp +90 -0
  127. data/ext/boost/functional/hash/detail/hash_float.hpp +11 -2
  128. data/ext/boost/functional/hash/extensions.hpp +14 -2
  129. data/ext/boost/functional/hash/hash.hpp +26 -5
  130. data/ext/boost/get_pointer.hpp +17 -2
  131. data/ext/boost/integer_traits.hpp +1 -1
  132. data/ext/boost/lexical_cast.hpp +615 -395
  133. data/ext/boost/libs/atomic/lockpool.cpp +24 -0
  134. data/ext/boost/libs/system/src/error_code.cpp +25 -18
  135. data/ext/boost/libs/thread/src/future.cpp +7 -5
  136. data/ext/boost/libs/thread/src/pthread/once.cpp +9 -3
  137. data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +90 -0
  138. data/ext/boost/libs/thread/src/pthread/thread.cpp +129 -95
  139. data/ext/boost/libs/thread/src/pthread/timeconv.inl +20 -1
  140. data/ext/boost/limits.hpp +1 -1
  141. data/ext/boost/math/policies/policy.hpp +10 -0
  142. data/ext/boost/math/special_functions/detail/round_fwd.hpp +17 -4
  143. data/ext/boost/math/special_functions/fpclassify.hpp +114 -45
  144. data/ext/boost/math/special_functions/math_fwd.hpp +195 -83
  145. data/ext/boost/math/special_functions/sign.hpp +13 -8
  146. data/ext/boost/math/tools/config.hpp +38 -16
  147. data/ext/boost/move/algorithm.hpp +275 -0
  148. data/ext/boost/move/core.hpp +332 -0
  149. data/ext/boost/move/detail/config_begin.hpp +23 -0
  150. data/ext/boost/move/detail/config_end.hpp +20 -0
  151. data/ext/boost/move/detail/meta_utils.hpp +158 -0
  152. data/ext/boost/move/iterator.hpp +298 -0
  153. data/ext/boost/move/move.hpp +10 -1256
  154. data/ext/boost/move/traits.hpp +142 -0
  155. data/ext/boost/move/utility.hpp +194 -0
  156. data/ext/boost/mpl/assert.hpp +72 -4
  157. data/ext/boost/noncopyable.hpp +15 -3
  158. data/ext/boost/pointer_to_other.hpp +55 -0
  159. data/ext/boost/range/concepts.hpp +4 -4
  160. data/ext/boost/range/detail/extract_optional_type.hpp +1 -1
  161. data/ext/boost/range/empty.hpp +1 -1
  162. data/ext/boost/range/iterator_range_core.hpp +4 -1
  163. data/ext/boost/range/iterator_range_io.hpp +2 -2
  164. data/ext/boost/ratio/config.hpp +6 -0
  165. data/ext/boost/ratio/detail/overflow_helpers.hpp +2 -2
  166. data/ext/boost/smart_ptr/allocate_shared_array.hpp +250 -0
  167. data/ext/boost/smart_ptr/detail/allocate_array_helper.hpp +169 -0
  168. data/ext/boost/smart_ptr/detail/array_deleter.hpp +124 -0
  169. data/ext/boost/smart_ptr/detail/array_traits.hpp +53 -0
  170. data/ext/boost/smart_ptr/detail/array_utility.hpp +178 -0
  171. data/ext/boost/smart_ptr/detail/make_array_helper.hpp +157 -0
  172. data/ext/boost/smart_ptr/detail/operator_bool.hpp +16 -9
  173. data/ext/boost/smart_ptr/detail/shared_count.hpp +78 -7
  174. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +15 -0
  175. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +12 -6
  176. data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +1 -0
  177. data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +1 -0
  178. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +1 -0
  179. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +1 -0
  180. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +1 -0
  181. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +1 -0
  182. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +1 -0
  183. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +1 -0
  184. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +1 -0
  185. data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +1 -0
  186. data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +1 -0
  187. data/ext/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +162 -0
  188. data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +1 -0
  189. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +1 -0
  190. data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +1 -0
  191. data/ext/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +1 -0
  192. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +15 -0
  193. data/ext/boost/smart_ptr/detail/sp_forward.hpp +39 -0
  194. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +19 -3
  195. data/ext/boost/smart_ptr/detail/sp_if_array.hpp +31 -0
  196. data/ext/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
  197. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +5 -12
  198. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +4 -4
  199. data/ext/boost/smart_ptr/make_shared.hpp +5 -1060
  200. data/ext/boost/smart_ptr/make_shared_array.hpp +247 -0
  201. data/ext/boost/smart_ptr/make_shared_object.hpp +1128 -0
  202. data/ext/boost/smart_ptr/scoped_array.hpp +32 -7
  203. data/ext/boost/smart_ptr/scoped_ptr.hpp +31 -5
  204. data/ext/boost/smart_ptr/shared_array.hpp +135 -20
  205. data/ext/boost/smart_ptr/shared_ptr.hpp +444 -126
  206. data/ext/boost/smart_ptr/weak_ptr.hpp +39 -28
  207. data/ext/boost/static_assert.hpp +74 -17
  208. data/ext/boost/system/error_code.hpp +76 -68
  209. data/ext/boost/system/system_error.hpp +5 -1
  210. data/ext/boost/thread/barrier.hpp +6 -2
  211. data/ext/boost/thread/completion_latch.hpp +233 -0
  212. data/ext/boost/thread/condition.hpp +6 -1
  213. data/ext/boost/thread/detail/async_func.hpp +571 -0
  214. data/ext/boost/thread/detail/config.hpp +248 -40
  215. data/ext/boost/thread/detail/counter.hpp +93 -0
  216. data/ext/boost/thread/detail/delete.hpp +12 -0
  217. data/ext/boost/thread/detail/invoke.hpp +1351 -0
  218. data/ext/boost/thread/detail/is_convertible.hpp +48 -0
  219. data/ext/boost/thread/detail/lockable_wrapper.hpp +45 -0
  220. data/ext/boost/thread/detail/log.hpp +83 -0
  221. data/ext/boost/thread/detail/make_tuple_indices.hpp +224 -0
  222. data/ext/boost/thread/detail/move.hpp +32 -16
  223. data/ext/boost/thread/detail/thread.hpp +236 -41
  224. data/ext/boost/thread/detail/thread_group.hpp +55 -9
  225. data/ext/boost/thread/detail/thread_interruption.hpp +4 -1
  226. data/ext/boost/thread/exceptions.hpp +2 -0
  227. data/ext/boost/thread/externally_locked.hpp +351 -0
  228. data/ext/boost/thread/externally_locked_stream.hpp +170 -0
  229. data/ext/boost/thread/future.hpp +2517 -455
  230. data/ext/boost/thread/future_error_code.hpp +61 -0
  231. data/ext/boost/thread/is_locked_by_this_thread.hpp +39 -0
  232. data/ext/boost/thread/latch.hpp +142 -0
  233. data/ext/boost/thread/lock_algorithms.hpp +468 -0
  234. data/ext/boost/thread/lock_concepts.hpp +197 -0
  235. data/ext/boost/thread/lock_factories.hpp +78 -0
  236. data/ext/boost/thread/lock_guard.hpp +88 -0
  237. data/ext/boost/thread/lock_options.hpp +31 -0
  238. data/ext/boost/thread/lock_traits.hpp +45 -0
  239. data/ext/boost/thread/lock_types.hpp +1226 -0
  240. data/ext/boost/thread/lockable_adapter.hpp +226 -0
  241. data/ext/boost/thread/lockable_concepts.hpp +157 -0
  242. data/ext/boost/thread/lockable_traits.hpp +207 -0
  243. data/ext/boost/thread/locks.hpp +5 -1816
  244. data/ext/boost/thread/mutex.hpp +33 -1
  245. data/ext/boost/thread/null_mutex.hpp +243 -0
  246. data/ext/boost/thread/once.hpp +10 -1
  247. data/ext/boost/thread/poly_lockable.hpp +68 -0
  248. data/ext/boost/thread/poly_lockable_adapter.hpp +89 -0
  249. data/ext/boost/thread/poly_shared_lockable.hpp +135 -0
  250. data/ext/boost/thread/poly_shared_lockable_adapter.hpp +170 -0
  251. data/ext/boost/thread/pthread/condition_variable.hpp +74 -26
  252. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +54 -27
  253. data/ext/boost/thread/pthread/mutex.hpp +101 -38
  254. data/ext/boost/thread/pthread/once.hpp +459 -44
  255. data/ext/boost/thread/pthread/once_atomic.hpp +313 -0
  256. data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -10
  257. data/ext/boost/thread/pthread/shared_mutex.hpp +226 -61
  258. data/ext/boost/thread/pthread/shared_mutex_assert.hpp +724 -0
  259. data/ext/boost/thread/pthread/thread_data.hpp +53 -50
  260. data/ext/boost/thread/pthread/timespec.hpp +96 -12
  261. data/ext/boost/thread/recursive_mutex.hpp +44 -1
  262. data/ext/boost/thread/reverse_lock.hpp +3 -2
  263. data/ext/boost/thread/scoped_thread.hpp +285 -0
  264. data/ext/boost/thread/shared_lock_guard.hpp +2 -1
  265. data/ext/boost/thread/shared_mutex.hpp +23 -0
  266. data/ext/boost/thread/strict_lock.hpp +235 -0
  267. data/ext/boost/thread/sync_bounded_queue.hpp +594 -0
  268. data/ext/boost/thread/sync_queue.hpp +516 -0
  269. data/ext/boost/thread/synchronized_value.hpp +1001 -0
  270. data/ext/boost/thread/testable_mutex.hpp +148 -0
  271. data/ext/boost/thread/thread.hpp +1 -13
  272. data/ext/boost/thread/thread_functors.hpp +57 -0
  273. data/ext/boost/thread/thread_guard.hpp +46 -0
  274. data/ext/boost/thread/thread_only.hpp +29 -0
  275. data/ext/boost/thread/v2/shared_mutex.hpp +1062 -0
  276. data/ext/boost/thread/v2/thread.hpp +37 -10
  277. data/ext/boost/thread/xtime.hpp +2 -1
  278. data/ext/boost/token_functions.hpp +16 -16
  279. data/ext/boost/type_traits/add_lvalue_reference.hpp +26 -0
  280. data/ext/boost/type_traits/add_reference.hpp +1 -1
  281. data/ext/boost/type_traits/add_rvalue_reference.hpp +4 -4
  282. data/ext/boost/type_traits/aligned_storage.hpp +13 -0
  283. data/ext/boost/type_traits/common_type.hpp +11 -12
  284. data/ext/boost/type_traits/config.hpp +1 -1
  285. data/ext/boost/type_traits/detail/common_type_imp.hpp +1 -1
  286. data/ext/boost/type_traits/detail/has_binary_operator.hpp +1 -1
  287. data/ext/boost/type_traits/detail/is_function_ptr_tester.hpp +1 -1
  288. data/ext/boost/type_traits/has_left_shift.hpp +49 -0
  289. data/ext/boost/type_traits/has_right_shift.hpp +49 -0
  290. data/ext/boost/type_traits/has_trivial_move_assign.hpp +57 -0
  291. data/ext/boost/type_traits/has_trivial_move_constructor.hpp +57 -0
  292. data/ext/boost/type_traits/intrinsics.hpp +18 -2
  293. data/ext/boost/type_traits/is_abstract.hpp +1 -1
  294. data/ext/boost/type_traits/is_array.hpp +1 -1
  295. data/ext/boost/type_traits/is_const.hpp +1 -1
  296. data/ext/boost/type_traits/is_convertible.hpp +78 -17
  297. data/ext/boost/type_traits/is_function.hpp +6 -1
  298. data/ext/boost/type_traits/is_integral.hpp +6 -1
  299. data/ext/boost/type_traits/is_nothrow_move_assignable.hpp +84 -0
  300. data/ext/boost/type_traits/is_nothrow_move_constructible.hpp +84 -0
  301. data/ext/boost/type_traits/is_pod.hpp +3 -1
  302. data/ext/boost/type_traits/is_rvalue_reference.hpp +1 -1
  303. data/ext/boost/type_traits/is_volatile.hpp +1 -1
  304. data/ext/boost/type_traits/make_signed.hpp +153 -0
  305. data/ext/boost/type_traits/make_unsigned.hpp +16 -0
  306. data/ext/boost/type_traits/remove_const.hpp +1 -1
  307. data/ext/boost/type_traits/remove_cv.hpp +1 -1
  308. data/ext/boost/type_traits/remove_reference.hpp +1 -1
  309. data/ext/boost/type_traits/remove_volatile.hpp +1 -1
  310. data/ext/boost/unordered/detail/allocate.hpp +1120 -0
  311. data/ext/boost/unordered/detail/buckets.hpp +876 -0
  312. data/ext/boost/unordered/detail/equivalent.hpp +680 -0
  313. data/ext/boost/unordered/detail/extract_key.hpp +183 -0
  314. data/ext/boost/unordered/detail/fwd.hpp +23 -0
  315. data/ext/boost/unordered/detail/table.hpp +861 -0
  316. data/ext/boost/unordered/detail/unique.hpp +622 -0
  317. data/ext/boost/unordered/detail/util.hpp +260 -0
  318. data/ext/boost/unordered/unordered_map.hpp +1652 -0
  319. data/ext/boost/unordered/unordered_map_fwd.hpp +65 -0
  320. data/ext/boost/unordered/unordered_set.hpp +1549 -0
  321. data/ext/boost/unordered/unordered_set_fwd.hpp +63 -0
  322. data/ext/boost/unordered_map.hpp +18 -0
  323. data/ext/boost/unordered_set.hpp +18 -0
  324. data/ext/boost/utility/addressof.hpp +2 -2
  325. data/ext/boost/utility/result_of.hpp +8 -1
  326. data/ext/boost/version.hpp +2 -2
  327. data/ext/common/Account.h +1 -1
  328. data/ext/common/AccountsDatabase.h +1 -1
  329. data/ext/common/AgentsStarter.cpp +3 -1
  330. data/ext/common/AgentsStarter.h +2 -2
  331. data/ext/common/ApplicationPool2/AppTypes.cpp +24 -6
  332. data/ext/common/ApplicationPool2/AppTypes.h +17 -8
  333. data/ext/common/ApplicationPool2/Common.h +12 -12
  334. data/ext/common/ApplicationPool2/DirectSpawner.h +2 -2
  335. data/ext/common/ApplicationPool2/DummySpawner.h +3 -3
  336. data/ext/common/ApplicationPool2/Group.h +6 -6
  337. data/ext/common/ApplicationPool2/Implementation.cpp +19 -19
  338. data/ext/common/ApplicationPool2/PipeWatcher.h +5 -5
  339. data/ext/common/ApplicationPool2/Pool.h +21 -21
  340. data/ext/common/ApplicationPool2/Process.h +6 -6
  341. data/ext/common/ApplicationPool2/Session.h +1 -1
  342. data/ext/common/ApplicationPool2/SmartSpawner.h +24 -12
  343. data/ext/common/ApplicationPool2/Socket.h +2 -2
  344. data/ext/common/ApplicationPool2/Spawner.h +64 -14
  345. data/ext/common/ApplicationPool2/SpawnerFactory.h +7 -7
  346. data/ext/common/ApplicationPool2/SuperGroup.h +5 -5
  347. data/ext/common/BackgroundEventLoop.cpp +4 -4
  348. data/ext/common/BackgroundEventLoop.h +1 -1
  349. data/ext/common/Constants.h +13 -1
  350. data/ext/common/EventedBufferedInput.h +8 -8
  351. data/ext/common/Exceptions.cpp +71 -0
  352. data/ext/common/Exceptions.h +60 -7
  353. data/ext/common/FileDescriptor.h +4 -4
  354. data/ext/common/MessageClient.h +1 -1
  355. data/ext/common/MessageServer.h +5 -5
  356. data/ext/common/MultiLibeio.cpp +3 -3
  357. data/ext/common/MultiLibeio.h +2 -2
  358. data/ext/common/RandomGenerator.h +11 -11
  359. data/ext/common/ResourceLocator.h +8 -1
  360. data/ext/common/SafeLibev.h +12 -12
  361. data/ext/common/ServerInstanceDir.h +11 -3
  362. data/ext/common/UnionStation.h +10 -10
  363. data/ext/common/Utils.cpp +11 -13
  364. data/ext/common/Utils.h +9 -9
  365. data/ext/common/Utils/BlockingQueue.h +10 -10
  366. data/ext/common/Utils/BufferedIO.h +1 -1
  367. data/ext/common/Utils/CachedFileStat.hpp +2 -2
  368. data/ext/common/Utils/FileChangeChecker.h +1 -1
  369. data/ext/common/Utils/HashMap.h +13 -4
  370. data/ext/common/Utils/IOUtils.cpp +33 -10
  371. data/ext/common/Utils/IniFile.h +3 -3
  372. data/ext/common/Utils/Lock.h +2 -2
  373. data/ext/common/Utils/MessagePassing.h +10 -10
  374. data/ext/common/Utils/ProcessMetricsCollector.h +24 -6
  375. data/ext/common/Utils/ScopeGuard.h +5 -5
  376. data/ext/common/Utils/jsoncpp.cpp +2 -0
  377. data/ext/common/agents/HelperAgent/FileBackedPipe.h +26 -26
  378. data/ext/common/agents/HelperAgent/Main.cpp +18 -18
  379. data/ext/common/agents/HelperAgent/RequestHandler.cpp +4 -4
  380. data/ext/common/agents/HelperAgent/RequestHandler.h +30 -21
  381. data/ext/common/agents/LoggingAgent/AdminController.h +1 -1
  382. data/ext/common/agents/LoggingAgent/FilterSupport.h +13 -11
  383. data/ext/common/agents/LoggingAgent/LoggingServer.h +11 -11
  384. data/ext/common/agents/LoggingAgent/Main.cpp +9 -9
  385. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  386. data/ext/common/agents/SpawnPreparer.cpp +1 -0
  387. data/ext/common/agents/Watchdog/AgentWatcher.cpp +8 -7
  388. data/ext/common/agents/Watchdog/Main.cpp +81 -73
  389. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +1 -1
  390. data/ext/libev/Changes +57 -0
  391. data/ext/libev/LICENSE +2 -1
  392. data/ext/libev/Makefile.in +110 -50
  393. data/ext/libev/README +8 -8
  394. data/ext/libev/aclocal.m4 +1503 -861
  395. data/ext/libev/config.guess +290 -304
  396. data/ext/libev/config.sub +77 -198
  397. data/ext/libev/configure +1735 -890
  398. data/ext/libev/configure.ac +3 -2
  399. data/ext/libev/ev++.h +6 -6
  400. data/ext/libev/ev.c +541 -214
  401. data/ext/libev/ev.h +106 -100
  402. data/ext/libev/ev_epoll.c +1 -1
  403. data/ext/libev/ev_kqueue.c +20 -4
  404. data/ext/libev/ev_vars.h +15 -16
  405. data/ext/libev/ev_win32.c +12 -2
  406. data/ext/libev/ev_wrap.h +162 -160
  407. data/ext/libev/event.c +29 -6
  408. data/ext/libev/event.h +9 -2
  409. data/ext/libev/ltmain.sh +2632 -1384
  410. data/ext/nginx/ConfigurationCommands.c +1 -1
  411. data/ext/nginx/ConfigurationCommands.c.erb +3 -1
  412. data/ext/nginx/ContentHandler.c +25 -2
  413. data/ext/nginx/CreateLocationConfig.c +1 -0
  414. data/ext/nginx/CreateLocationConfig.c.erb +1 -1
  415. data/ext/nginx/MergeLocationConfig.c +1 -0
  416. data/ext/nginx/MergeLocationConfig.c.erb +1 -1
  417. data/ext/nginx/config +12 -0
  418. data/ext/oxt/dynamic_thread_group.hpp +7 -4
  419. data/ext/oxt/system_calls.cpp +5 -1
  420. data/ext/oxt/system_calls.hpp +3 -0
  421. data/helper-scripts/node-loader.js +117 -249
  422. data/lib/phusion_passenger.rb +27 -5
  423. data/lib/phusion_passenger/abstract_installer.rb +104 -9
  424. data/lib/phusion_passenger/admin_tools/memory_stats.rb +10 -9
  425. data/lib/phusion_passenger/apache2/config_options.rb +6 -3
  426. data/lib/phusion_passenger/common_library.rb +7 -1
  427. data/lib/phusion_passenger/constants.rb +6 -0
  428. data/lib/phusion_passenger/loader_shared_helpers.rb +7 -4
  429. data/lib/phusion_passenger/nginx/config_options.rb +2 -1
  430. data/lib/phusion_passenger/packaging.rb +3 -0
  431. data/lib/phusion_passenger/platform_info/apache.rb +43 -6
  432. data/lib/phusion_passenger/platform_info/apache_detector.rb +15 -5
  433. data/lib/phusion_passenger/platform_info/compiler.rb +167 -32
  434. data/lib/phusion_passenger/platform_info/cxx_portability.rb +133 -77
  435. data/lib/phusion_passenger/platform_info/depcheck.rb +17 -7
  436. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +3 -3
  437. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  438. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -6
  439. data/lib/phusion_passenger/platform_info/linux.rb +2 -1
  440. data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
  441. data/lib/phusion_passenger/platform_info/ruby.rb +18 -3
  442. data/lib/phusion_passenger/standalone/runtime_installer.rb +6 -2
  443. data/lib/phusion_passenger/standalone/start_command.rb +8 -2
  444. data/lib/phusion_passenger/utils/ansi_colors.rb +9 -0
  445. data/lib/phusion_passenger/utils/hosts_file_parser.rb +4 -2
  446. data/node_lib/phusion_passenger/httplib_emulation.js +141 -0
  447. data/node_lib/phusion_passenger/line_reader.js +154 -0
  448. data/node_lib/phusion_passenger/request_handler.js +65 -0
  449. data/node_lib/phusion_passenger/session_protocol_parser.js +113 -0
  450. data/resources/templates/apache2/deployment_example.txt.erb +2 -1
  451. data/resources/templates/apache2/installing_against_a_different_apache.txt.erb +14 -0
  452. data/resources/templates/apache2/multiple_apache_installations_detected.txt.erb +15 -0
  453. data/resources/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  454. data/resources/templates/general_error_with_html.html.template +1 -1
  455. data/resources/templates/installer_common/gem_install_permission_problems.txt.erb +17 -0
  456. data/resources/templates/installer_common/low_amount_of_memory_warning.txt.erb +6 -4
  457. data/resources/templates/installer_common/world_inaccessible_directories.txt.erb +16 -0
  458. data/resources/templates/nginx/deployment_example.txt.erb +2 -1
  459. data/resources/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  460. data/resources/templates/standalone/config.erb +1 -0
  461. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -3
  462. data/test/cxx/ApplicationPool2/PoolTest.cpp +4 -4
  463. data/test/cxx/ApplicationPool2/ProcessTest.cpp +5 -5
  464. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -5
  465. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +1 -1
  466. data/test/cxx/EventedBufferedInputTest.cpp +6 -6
  467. data/test/cxx/FileBackedPipeTest.cpp +1 -1
  468. data/test/cxx/MessagePassingTest.cpp +1 -1
  469. data/test/cxx/MessageServerTest.cpp +4 -4
  470. data/test/cxx/RequestHandlerTest.cpp +7 -7
  471. data/test/cxx/UnionStationTest.cpp +2 -2
  472. data/test/node/line_reader_spec.js +338 -0
  473. data/test/node/spec_helper.js +27 -0
  474. data/test/ruby/standalone/runtime_installer_spec.rb +2 -1
  475. metadata +131 -22
  476. metadata.gz.asc +7 -7
  477. data/ext/boost/functional/hash/detail/container_fwd_0x.hpp +0 -29
  478. data/ext/boost/lambda/core.hpp +0 -79
  479. data/ext/boost/lambda/detail/actions.hpp +0 -174
  480. data/ext/boost/lambda/detail/arity_code.hpp +0 -110
  481. data/ext/boost/lambda/detail/function_adaptors.hpp +0 -789
  482. data/ext/boost/lambda/detail/is_instance_of.hpp +0 -104
  483. data/ext/boost/lambda/detail/lambda_config.hpp +0 -48
  484. data/ext/boost/lambda/detail/lambda_functor_base.hpp +0 -615
  485. data/ext/boost/lambda/detail/lambda_functors.hpp +0 -324
  486. data/ext/boost/lambda/detail/lambda_fwd.hpp +0 -74
  487. data/ext/boost/lambda/detail/lambda_traits.hpp +0 -578
  488. data/ext/boost/lambda/detail/member_ptr.hpp +0 -737
  489. data/ext/boost/lambda/detail/operator_actions.hpp +0 -139
  490. data/ext/boost/lambda/detail/operator_lambda_func_base.hpp +0 -271
  491. data/ext/boost/lambda/detail/operator_return_type_traits.hpp +0 -917
  492. data/ext/boost/lambda/detail/operators.hpp +0 -370
  493. data/ext/boost/lambda/detail/ret.hpp +0 -325
  494. data/ext/boost/lambda/detail/return_type_traits.hpp +0 -282
  495. data/ext/boost/lambda/detail/select_functions.hpp +0 -74
  496. data/ext/boost/lambda/lambda.hpp +0 -34
@@ -0,0 +1,876 @@
1
+
2
+ // Copyright (C) 2003-2004 Jeremy B. Maitin-Shepard.
3
+ // Copyright (C) 2005-2011 Daniel James
4
+ // Distributed under the Boost Software License, Version 1.0. (See accompanying
5
+ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
+
7
+ #ifndef BOOST_UNORDERED_DETAIL_MANAGER_HPP_INCLUDED
8
+ #define BOOST_UNORDERED_DETAIL_MANAGER_HPP_INCLUDED
9
+
10
+ #if defined(_MSC_VER) && (_MSC_VER >= 1020)
11
+ # pragma once
12
+ #endif
13
+
14
+ #include <boost/unordered/detail/util.hpp>
15
+ #include <boost/unordered/detail/allocate.hpp>
16
+ #include <boost/type_traits/aligned_storage.hpp>
17
+ #include <boost/type_traits/alignment_of.hpp>
18
+ #include <boost/type_traits/is_nothrow_move_constructible.hpp>
19
+ #include <boost/type_traits/is_nothrow_move_assignable.hpp>
20
+ #include <boost/swap.hpp>
21
+ #include <boost/assert.hpp>
22
+ #include <boost/limits.hpp>
23
+ #include <boost/iterator.hpp>
24
+
25
+ namespace boost { namespace unordered { namespace detail {
26
+
27
+ template <typename Types> struct table;
28
+ template <typename NodePointer> struct bucket;
29
+ struct ptr_bucket;
30
+ template <typename Types> struct table_impl;
31
+ template <typename Types> struct grouped_table_impl;
32
+
33
+ }}}
34
+
35
+ namespace boost { namespace unordered { namespace iterator_detail {
36
+
37
+ ////////////////////////////////////////////////////////////////////////////
38
+ // Iterators
39
+ //
40
+ // all no throw
41
+
42
+ template <typename Node> struct iterator;
43
+ template <typename Node, typename ConstNodePointer> struct c_iterator;
44
+ template <typename Node, typename Policy> struct l_iterator;
45
+ template <typename Node, typename ConstNodePointer, typename Policy>
46
+ struct cl_iterator;
47
+
48
+ // Local Iterators
49
+ //
50
+ // all no throw
51
+
52
+ template <typename Node, typename Policy>
53
+ struct l_iterator
54
+ : public boost::iterator<
55
+ std::forward_iterator_tag,
56
+ typename Node::value_type,
57
+ std::ptrdiff_t,
58
+ typename Node::node_pointer,
59
+ typename Node::value_type&>
60
+ {
61
+ #if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
62
+ template <typename Node2, typename ConstNodePointer, typename Policy2>
63
+ friend struct boost::unordered::iterator_detail::cl_iterator;
64
+ private:
65
+ #endif
66
+ typedef typename Node::node_pointer node_pointer;
67
+ typedef boost::unordered::iterator_detail::iterator<Node> iterator;
68
+ node_pointer ptr_;
69
+ std::size_t bucket_;
70
+ std::size_t bucket_count_;
71
+
72
+ public:
73
+
74
+ typedef typename Node::value_type value_type;
75
+
76
+ l_iterator() : ptr_() {}
77
+
78
+ l_iterator(iterator x, std::size_t b, std::size_t c)
79
+ : ptr_(x.node_), bucket_(b), bucket_count_(c) {}
80
+
81
+ value_type& operator*() const {
82
+ return ptr_->value();
83
+ }
84
+
85
+ value_type* operator->() const {
86
+ return ptr_->value_ptr();
87
+ }
88
+
89
+ l_iterator& operator++() {
90
+ ptr_ = static_cast<node_pointer>(ptr_->next_);
91
+ if (ptr_ && Policy::to_bucket(bucket_count_, ptr_->hash_)
92
+ != bucket_)
93
+ ptr_ = node_pointer();
94
+ return *this;
95
+ }
96
+
97
+ l_iterator operator++(int) {
98
+ l_iterator tmp(*this);
99
+ ++(*this);
100
+ return tmp;
101
+ }
102
+
103
+ bool operator==(l_iterator x) const {
104
+ return ptr_ == x.ptr_;
105
+ }
106
+
107
+ bool operator!=(l_iterator x) const {
108
+ return ptr_ != x.ptr_;
109
+ }
110
+ };
111
+
112
+ template <typename Node, typename ConstNodePointer, typename Policy>
113
+ struct cl_iterator
114
+ : public boost::iterator<
115
+ std::forward_iterator_tag,
116
+ typename Node::value_type,
117
+ std::ptrdiff_t,
118
+ ConstNodePointer,
119
+ typename Node::value_type const&>
120
+ {
121
+ friend struct boost::unordered::iterator_detail::l_iterator
122
+ <Node, Policy>;
123
+ private:
124
+
125
+ typedef typename Node::node_pointer node_pointer;
126
+ typedef boost::unordered::iterator_detail::iterator<Node> iterator;
127
+ node_pointer ptr_;
128
+ std::size_t bucket_;
129
+ std::size_t bucket_count_;
130
+
131
+ public:
132
+
133
+ typedef typename Node::value_type value_type;
134
+
135
+ cl_iterator() : ptr_() {}
136
+
137
+ cl_iterator(iterator x, std::size_t b, std::size_t c) :
138
+ ptr_(x.node_), bucket_(b), bucket_count_(c) {}
139
+
140
+ cl_iterator(boost::unordered::iterator_detail::l_iterator<
141
+ Node, Policy> const& x) :
142
+ ptr_(x.ptr_), bucket_(x.bucket_), bucket_count_(x.bucket_count_)
143
+ {}
144
+
145
+ value_type const& operator*() const {
146
+ return ptr_->value();
147
+ }
148
+
149
+ value_type const* operator->() const {
150
+ return ptr_->value_ptr();
151
+ }
152
+
153
+ cl_iterator& operator++() {
154
+ ptr_ = static_cast<node_pointer>(ptr_->next_);
155
+ if (ptr_ && Policy::to_bucket(bucket_count_, ptr_->hash_)
156
+ != bucket_)
157
+ ptr_ = node_pointer();
158
+ return *this;
159
+ }
160
+
161
+ cl_iterator operator++(int) {
162
+ cl_iterator tmp(*this);
163
+ ++(*this);
164
+ return tmp;
165
+ }
166
+
167
+ friend bool operator==(cl_iterator const& x, cl_iterator const& y) {
168
+ return x.ptr_ == y.ptr_;
169
+ }
170
+
171
+ friend bool operator!=(cl_iterator const& x, cl_iterator const& y) {
172
+ return x.ptr_ != y.ptr_;
173
+ }
174
+ };
175
+
176
+ template <typename Node>
177
+ struct iterator
178
+ : public boost::iterator<
179
+ std::forward_iterator_tag,
180
+ typename Node::value_type,
181
+ std::ptrdiff_t,
182
+ typename Node::node_pointer,
183
+ typename Node::value_type&>
184
+ {
185
+ #if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
186
+ template <typename, typename>
187
+ friend struct boost::unordered::iterator_detail::c_iterator;
188
+ template <typename, typename>
189
+ friend struct boost::unordered::iterator_detail::l_iterator;
190
+ template <typename, typename, typename>
191
+ friend struct boost::unordered::iterator_detail::cl_iterator;
192
+ template <typename>
193
+ friend struct boost::unordered::detail::table;
194
+ template <typename>
195
+ friend struct boost::unordered::detail::table_impl;
196
+ template <typename>
197
+ friend struct boost::unordered::detail::grouped_table_impl;
198
+ private:
199
+ #endif
200
+ typedef typename Node::node_pointer node_pointer;
201
+ node_pointer node_;
202
+
203
+ public:
204
+
205
+ typedef typename Node::value_type value_type;
206
+
207
+ iterator() : node_() {}
208
+
209
+ explicit iterator(typename Node::link_pointer x) :
210
+ node_(static_cast<node_pointer>(x)) {}
211
+
212
+ value_type& operator*() const {
213
+ return node_->value();
214
+ }
215
+
216
+ value_type* operator->() const {
217
+ return &node_->value();
218
+ }
219
+
220
+ iterator& operator++() {
221
+ node_ = static_cast<node_pointer>(node_->next_);
222
+ return *this;
223
+ }
224
+
225
+ iterator operator++(int) {
226
+ iterator tmp(node_);
227
+ node_ = static_cast<node_pointer>(node_->next_);
228
+ return tmp;
229
+ }
230
+
231
+ bool operator==(iterator const& x) const {
232
+ return node_ == x.node_;
233
+ }
234
+
235
+ bool operator!=(iterator const& x) const {
236
+ return node_ != x.node_;
237
+ }
238
+ };
239
+
240
+ template <typename Node, typename ConstNodePointer>
241
+ struct c_iterator
242
+ : public boost::iterator<
243
+ std::forward_iterator_tag,
244
+ typename Node::value_type,
245
+ std::ptrdiff_t,
246
+ ConstNodePointer,
247
+ typename Node::value_type const&>
248
+ {
249
+ friend struct boost::unordered::iterator_detail::iterator<Node>;
250
+
251
+ #if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
252
+ template <typename>
253
+ friend struct boost::unordered::detail::table;
254
+ template <typename>
255
+ friend struct boost::unordered::detail::table_impl;
256
+ template <typename>
257
+ friend struct boost::unordered::detail::grouped_table_impl;
258
+
259
+ private:
260
+ #endif
261
+ typedef typename Node::node_pointer node_pointer;
262
+ typedef boost::unordered::iterator_detail::iterator<Node> iterator;
263
+ node_pointer node_;
264
+
265
+ public:
266
+
267
+ typedef typename Node::value_type value_type;
268
+
269
+ c_iterator() : node_() {}
270
+
271
+ explicit c_iterator(typename Node::link_pointer x) :
272
+ node_(static_cast<node_pointer>(x)) {}
273
+
274
+ c_iterator(iterator const& x) : node_(x.node_) {}
275
+
276
+ value_type const& operator*() const {
277
+ return node_->value();
278
+ }
279
+
280
+ value_type const* operator->() const {
281
+ return &node_->value();
282
+ }
283
+
284
+ c_iterator& operator++() {
285
+ node_ = static_cast<node_pointer>(node_->next_);
286
+ return *this;
287
+ }
288
+
289
+ c_iterator operator++(int) {
290
+ c_iterator tmp(node_);
291
+ node_ = static_cast<node_pointer>(node_->next_);
292
+ return tmp;
293
+ }
294
+
295
+ friend bool operator==(c_iterator const& x, c_iterator const& y) {
296
+ return x.node_ == y.node_;
297
+ }
298
+
299
+ friend bool operator!=(c_iterator const& x, c_iterator const& y) {
300
+ return x.node_ != y.node_;
301
+ }
302
+ };
303
+ }}}
304
+
305
+ namespace boost { namespace unordered { namespace detail {
306
+
307
+ ///////////////////////////////////////////////////////////////////
308
+ //
309
+ // Node construction
310
+
311
+ template <typename NodeAlloc>
312
+ struct node_constructor
313
+ {
314
+ private:
315
+
316
+ typedef NodeAlloc node_allocator;
317
+ typedef boost::unordered::detail::allocator_traits<NodeAlloc>
318
+ node_allocator_traits;
319
+ typedef typename node_allocator_traits::value_type node;
320
+ typedef typename node_allocator_traits::pointer node_pointer;
321
+ typedef typename node::value_type value_type;
322
+
323
+ protected:
324
+
325
+ node_allocator& alloc_;
326
+ node_pointer node_;
327
+ bool node_constructed_;
328
+ bool value_constructed_;
329
+
330
+ public:
331
+
332
+ node_constructor(node_allocator& n) :
333
+ alloc_(n),
334
+ node_(),
335
+ node_constructed_(false),
336
+ value_constructed_(false)
337
+ {
338
+ }
339
+
340
+ ~node_constructor();
341
+
342
+ void construct();
343
+
344
+ template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
345
+ void construct_with_value(BOOST_UNORDERED_EMPLACE_ARGS)
346
+ {
347
+ construct();
348
+ boost::unordered::detail::construct_value_impl(
349
+ alloc_, node_->value_ptr(), BOOST_UNORDERED_EMPLACE_FORWARD);
350
+ value_constructed_ = true;
351
+ }
352
+
353
+ template <typename A0>
354
+ void construct_with_value2(BOOST_FWD_REF(A0) a0)
355
+ {
356
+ construct();
357
+ boost::unordered::detail::construct_value_impl(
358
+ alloc_, node_->value_ptr(),
359
+ BOOST_UNORDERED_EMPLACE_ARGS1(boost::forward<A0>(a0)));
360
+ value_constructed_ = true;
361
+ }
362
+
363
+ value_type const& value() const {
364
+ BOOST_ASSERT(node_ && node_constructed_ && value_constructed_);
365
+ return node_->value();
366
+ }
367
+
368
+ // no throw
369
+ node_pointer release()
370
+ {
371
+ BOOST_ASSERT(node_ && node_constructed_);
372
+ node_pointer p = node_;
373
+ node_ = node_pointer();
374
+ return p;
375
+ }
376
+
377
+ private:
378
+ node_constructor(node_constructor const&);
379
+ node_constructor& operator=(node_constructor const&);
380
+ };
381
+
382
+ template <typename Alloc>
383
+ node_constructor<Alloc>::~node_constructor()
384
+ {
385
+ if (node_) {
386
+ if (value_constructed_) {
387
+ boost::unordered::detail::destroy_value_impl(alloc_,
388
+ node_->value_ptr());
389
+ }
390
+
391
+ if (node_constructed_) {
392
+ node_allocator_traits::destroy(alloc_,
393
+ boost::addressof(*node_));
394
+ }
395
+
396
+ node_allocator_traits::deallocate(alloc_, node_, 1);
397
+ }
398
+ }
399
+
400
+ template <typename Alloc>
401
+ void node_constructor<Alloc>::construct()
402
+ {
403
+ if(!node_) {
404
+ node_constructed_ = false;
405
+ value_constructed_ = false;
406
+
407
+ node_ = node_allocator_traits::allocate(alloc_, 1);
408
+
409
+ node_allocator_traits::construct(alloc_,
410
+ boost::addressof(*node_), node());
411
+ node_->init(node_);
412
+ node_constructed_ = true;
413
+ }
414
+ else {
415
+ BOOST_ASSERT(node_constructed_);
416
+
417
+ if (value_constructed_)
418
+ {
419
+ boost::unordered::detail::destroy_value_impl(alloc_,
420
+ node_->value_ptr());
421
+ value_constructed_ = false;
422
+ }
423
+ }
424
+ }
425
+
426
+ ///////////////////////////////////////////////////////////////////
427
+ //
428
+ // Node Holder
429
+ //
430
+ // Temporary store for nodes. Deletes any that aren't used.
431
+
432
+ template <typename NodeAlloc>
433
+ struct node_holder : private node_constructor<NodeAlloc>
434
+ {
435
+ private:
436
+ typedef node_constructor<NodeAlloc> base;
437
+
438
+ typedef NodeAlloc node_allocator;
439
+ typedef boost::unordered::detail::allocator_traits<NodeAlloc>
440
+ node_allocator_traits;
441
+ typedef typename node_allocator_traits::value_type node;
442
+ typedef typename node_allocator_traits::pointer node_pointer;
443
+ typedef typename node::value_type value_type;
444
+ typedef typename node::link_pointer link_pointer;
445
+ typedef boost::unordered::iterator_detail::iterator<node> iterator;
446
+
447
+ node_pointer nodes_;
448
+
449
+ public:
450
+
451
+ template <typename Table>
452
+ explicit node_holder(Table& b) :
453
+ base(b.node_alloc()),
454
+ nodes_()
455
+ {
456
+ if (b.size_) {
457
+ typename Table::link_pointer prev = b.get_previous_start();
458
+ nodes_ = static_cast<node_pointer>(prev->next_);
459
+ prev->next_ = link_pointer();
460
+ b.size_ = 0;
461
+ }
462
+ }
463
+
464
+ ~node_holder();
465
+
466
+ void node_for_assignment()
467
+ {
468
+ if (!this->node_ && nodes_) {
469
+ this->node_ = nodes_;
470
+ nodes_ = static_cast<node_pointer>(nodes_->next_);
471
+ this->node_->init(this->node_);
472
+ this->node_->next_ = link_pointer();
473
+
474
+ this->node_constructed_ = true;
475
+ this->value_constructed_ = true;
476
+ }
477
+ }
478
+
479
+ template <typename T>
480
+ inline void assign_impl(T const& v) {
481
+ if (this->node_ && this->value_constructed_) {
482
+ this->node_->value() = v;
483
+ }
484
+ else {
485
+ this->construct_with_value2(v);
486
+ }
487
+ }
488
+
489
+ template <typename T1, typename T2>
490
+ inline void assign_impl(std::pair<T1 const, T2> const& v) {
491
+ this->construct_with_value2(v);
492
+ }
493
+
494
+ template <typename T>
495
+ inline void move_assign_impl(T& v) {
496
+ if (this->node_ && this->value_constructed_) {
497
+ this->node_->value() = boost::move(v);
498
+ }
499
+ else {
500
+ this->construct_with_value2(boost::move(v));
501
+ }
502
+ }
503
+
504
+ template <typename T1, typename T2>
505
+ inline void move_assign_impl(std::pair<T1 const, T2>& v) {
506
+ this->construct_with_value2(boost::move(v));
507
+ }
508
+
509
+ node_pointer copy_of(value_type const& v)
510
+ {
511
+ node_for_assignment();
512
+ assign_impl(v);
513
+ return base::release();
514
+ }
515
+
516
+ node_pointer move_copy_of(value_type& v)
517
+ {
518
+ node_for_assignment();
519
+ move_assign_impl(v);
520
+ return base::release();
521
+ }
522
+
523
+ iterator begin() const
524
+ {
525
+ return iterator(nodes_);
526
+ }
527
+ };
528
+
529
+ template <typename Alloc>
530
+ node_holder<Alloc>::~node_holder()
531
+ {
532
+ while (nodes_) {
533
+ node_pointer p = nodes_;
534
+ nodes_ = static_cast<node_pointer>(p->next_);
535
+
536
+ boost::unordered::detail::destroy_value_impl(this->alloc_,
537
+ p->value_ptr());
538
+ node_allocator_traits::destroy(this->alloc_, boost::addressof(*p));
539
+ node_allocator_traits::deallocate(this->alloc_, p, 1);
540
+ }
541
+ }
542
+
543
+ ///////////////////////////////////////////////////////////////////
544
+ //
545
+ // Bucket
546
+
547
+ template <typename NodePointer>
548
+ struct bucket
549
+ {
550
+ typedef NodePointer link_pointer;
551
+ link_pointer next_;
552
+
553
+ bucket() : next_() {}
554
+
555
+ link_pointer first_from_start()
556
+ {
557
+ return next_;
558
+ }
559
+
560
+ enum { extra_node = true };
561
+ };
562
+
563
+ struct ptr_bucket
564
+ {
565
+ typedef ptr_bucket* link_pointer;
566
+ link_pointer next_;
567
+
568
+ ptr_bucket() : next_(0) {}
569
+
570
+ link_pointer first_from_start()
571
+ {
572
+ return this;
573
+ }
574
+
575
+ enum { extra_node = false };
576
+ };
577
+
578
+ ///////////////////////////////////////////////////////////////////
579
+ //
580
+ // Hash Policy
581
+
582
+ template <typename SizeT>
583
+ struct prime_policy
584
+ {
585
+ template <typename Hash, typename T>
586
+ static inline SizeT apply_hash(Hash const& hf, T const& x) {
587
+ return hf(x);
588
+ }
589
+
590
+ static inline SizeT to_bucket(SizeT bucket_count, SizeT hash) {
591
+ return hash % bucket_count;
592
+ }
593
+
594
+ static inline SizeT new_bucket_count(SizeT min) {
595
+ return boost::unordered::detail::next_prime(min);
596
+ }
597
+
598
+ static inline SizeT prev_bucket_count(SizeT max) {
599
+ return boost::unordered::detail::prev_prime(max);
600
+ }
601
+ };
602
+
603
+ template <typename SizeT>
604
+ struct mix64_policy
605
+ {
606
+ template <typename Hash, typename T>
607
+ static inline SizeT apply_hash(Hash const& hf, T const& x) {
608
+ SizeT key = hf(x);
609
+ key = (~key) + (key << 21); // key = (key << 21) - key - 1;
610
+ key = key ^ (key >> 24);
611
+ key = (key + (key << 3)) + (key << 8); // key * 265
612
+ key = key ^ (key >> 14);
613
+ key = (key + (key << 2)) + (key << 4); // key * 21
614
+ key = key ^ (key >> 28);
615
+ key = key + (key << 31);
616
+ return key;
617
+ }
618
+
619
+ static inline SizeT to_bucket(SizeT bucket_count, SizeT hash) {
620
+ return hash & (bucket_count - 1);
621
+ }
622
+
623
+ static inline SizeT new_bucket_count(SizeT min) {
624
+ if (min <= 4) return 4;
625
+ --min;
626
+ min |= min >> 1;
627
+ min |= min >> 2;
628
+ min |= min >> 4;
629
+ min |= min >> 8;
630
+ min |= min >> 16;
631
+ min |= min >> 32;
632
+ return min + 1;
633
+ }
634
+
635
+ static inline SizeT prev_bucket_count(SizeT max) {
636
+ max |= max >> 1;
637
+ max |= max >> 2;
638
+ max |= max >> 4;
639
+ max |= max >> 8;
640
+ max |= max >> 16;
641
+ max |= max >> 32;
642
+ return (max >> 1) + 1;
643
+ }
644
+ };
645
+
646
+ template <int digits, int radix>
647
+ struct pick_policy_impl {
648
+ typedef prime_policy<std::size_t> type;
649
+ };
650
+
651
+ template <>
652
+ struct pick_policy_impl<64, 2> {
653
+ typedef mix64_policy<std::size_t> type;
654
+ };
655
+
656
+ struct pick_policy :
657
+ pick_policy_impl<
658
+ std::numeric_limits<std::size_t>::digits,
659
+ std::numeric_limits<std::size_t>::radix> {};
660
+
661
+ ////////////////////////////////////////////////////////////////////////////
662
+ // Functions
663
+
664
+ // Assigning and swapping the equality and hash function objects
665
+ // needs strong exception safety. To implement that normally we'd
666
+ // require one of them to be known to not throw and the other to
667
+ // guarantee strong exception safety. Unfortunately they both only
668
+ // have basic exception safety. So to acheive strong exception
669
+ // safety we have storage space for two copies, and assign the new
670
+ // copies to the unused space. Then switch to using that to use
671
+ // them. This is implemented in 'set_hash_functions' which
672
+ // atomically assigns the new function objects in a strongly
673
+ // exception safe manner.
674
+
675
+ template <class H, class P, bool NoThrowMoveAssign>
676
+ class set_hash_functions;
677
+
678
+ template <class H, class P>
679
+ class functions
680
+ {
681
+ public:
682
+ static const bool nothrow_move_assignable =
683
+ boost::is_nothrow_move_assignable<H>::value &&
684
+ boost::is_nothrow_move_assignable<P>::value;
685
+ static const bool nothrow_move_constructible =
686
+ boost::is_nothrow_move_constructible<H>::value &&
687
+ boost::is_nothrow_move_constructible<P>::value;
688
+
689
+ private:
690
+ friend class boost::unordered::detail::set_hash_functions<H, P,
691
+ nothrow_move_assignable>;
692
+ functions& operator=(functions const&);
693
+
694
+ typedef compressed<H, P> function_pair;
695
+
696
+ typedef typename boost::aligned_storage<
697
+ sizeof(function_pair),
698
+ boost::alignment_of<function_pair>::value>::type aligned_function;
699
+
700
+ bool current_; // The currently active functions.
701
+ aligned_function funcs_[2];
702
+
703
+ function_pair const& current() const {
704
+ return *static_cast<function_pair const*>(
705
+ static_cast<void const*>(&funcs_[current_]));
706
+ }
707
+
708
+ function_pair& current() {
709
+ return *static_cast<function_pair*>(
710
+ static_cast<void*>(&funcs_[current_]));
711
+ }
712
+
713
+ void construct(bool which, H const& hf, P const& eq)
714
+ {
715
+ new((void*) &funcs_[which]) function_pair(hf, eq);
716
+ }
717
+
718
+ void construct(bool which, function_pair const& f)
719
+ {
720
+ new((void*) &funcs_[which]) function_pair(f);
721
+ }
722
+
723
+ void construct(bool which, function_pair& f,
724
+ boost::unordered::detail::move_tag m)
725
+ {
726
+ new((void*) &funcs_[which]) function_pair(f, m);
727
+ }
728
+
729
+ void destroy(bool which)
730
+ {
731
+ boost::unordered::detail::destroy((function_pair*)(&funcs_[which]));
732
+ }
733
+
734
+ public:
735
+
736
+ typedef boost::unordered::detail::set_hash_functions<H, P,
737
+ nothrow_move_assignable> set_hash_functions;
738
+
739
+ functions(H const& hf, P const& eq)
740
+ : current_(false)
741
+ {
742
+ construct(current_, hf, eq);
743
+ }
744
+
745
+ functions(functions const& bf)
746
+ : current_(false)
747
+ {
748
+ construct(current_, bf.current());
749
+ }
750
+
751
+ functions(functions& bf, boost::unordered::detail::move_tag m)
752
+ : current_(false)
753
+ {
754
+ if (nothrow_move_constructible) {
755
+ construct(current_, bf.current(), m);
756
+ }
757
+ else {
758
+ construct(current_, bf.current());
759
+ }
760
+ }
761
+
762
+ ~functions() {
763
+ this->destroy(current_);
764
+ }
765
+
766
+ H const& hash_function() const {
767
+ return current().first();
768
+ }
769
+
770
+ P const& key_eq() const {
771
+ return current().second();
772
+ }
773
+ };
774
+
775
+ template <class H, class P>
776
+ class set_hash_functions<H, P, false>
777
+ {
778
+ set_hash_functions(set_hash_functions const&);
779
+ set_hash_functions& operator=(set_hash_functions const&);
780
+
781
+ typedef functions<H, P> functions_type;
782
+
783
+ functions_type& functions_;
784
+ bool tmp_functions_;
785
+
786
+ public:
787
+
788
+ set_hash_functions(functions_type& f, H const& h, P const& p)
789
+ : functions_(f),
790
+ tmp_functions_(!f.current_)
791
+ {
792
+ f.construct(tmp_functions_, h, p);
793
+ }
794
+
795
+ set_hash_functions(functions_type& f, functions_type const& other)
796
+ : functions_(f),
797
+ tmp_functions_(!f.current_)
798
+ {
799
+ f.construct(tmp_functions_, other.current());
800
+ }
801
+
802
+ ~set_hash_functions()
803
+ {
804
+ functions_.destroy(tmp_functions_);
805
+ }
806
+
807
+ void commit()
808
+ {
809
+ functions_.current_ = tmp_functions_;
810
+ tmp_functions_ = !tmp_functions_;
811
+ }
812
+ };
813
+
814
+ template <class H, class P>
815
+ class set_hash_functions<H, P, true>
816
+ {
817
+ set_hash_functions(set_hash_functions const&);
818
+ set_hash_functions& operator=(set_hash_functions const&);
819
+
820
+ typedef functions<H, P> functions_type;
821
+
822
+ functions_type& functions_;
823
+ H hash_;
824
+ P pred_;
825
+
826
+ public:
827
+
828
+ set_hash_functions(functions_type& f, H const& h, P const& p) :
829
+ functions_(f),
830
+ hash_(h),
831
+ pred_(p) {}
832
+
833
+ set_hash_functions(functions_type& f, functions_type const& other) :
834
+ functions_(f),
835
+ hash_(other.hash_function()),
836
+ pred_(other.key_eq()) {}
837
+
838
+ void commit()
839
+ {
840
+ functions_.current().first() = boost::move(hash_);
841
+ functions_.current().second() = boost::move(pred_);
842
+ }
843
+ };
844
+
845
+ ////////////////////////////////////////////////////////////////////////////
846
+ // rvalue parameters when type can't be a BOOST_RV_REF(T) parameter
847
+ // e.g. for int
848
+
849
+ #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
850
+ # define BOOST_UNORDERED_RV_REF(T) BOOST_RV_REF(T)
851
+ #else
852
+ struct please_ignore_this_overload {
853
+ typedef please_ignore_this_overload type;
854
+ };
855
+
856
+ template <typename T>
857
+ struct rv_ref_impl {
858
+ typedef BOOST_RV_REF(T) type;
859
+ };
860
+
861
+ template <typename T>
862
+ struct rv_ref :
863
+ boost::detail::if_true<
864
+ boost::is_class<T>::value
865
+ >::BOOST_NESTED_TEMPLATE then <
866
+ boost::unordered::detail::rv_ref_impl<T>,
867
+ please_ignore_this_overload
868
+ >::type
869
+ {};
870
+
871
+ # define BOOST_UNORDERED_RV_REF(T) \
872
+ typename boost::unordered::detail::rv_ref<T>::type
873
+ #endif
874
+ }}}
875
+
876
+ #endif