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,680 @@
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_EQUIVALENT_HPP_INCLUDED
8
+ #define BOOST_UNORDERED_DETAIL_EQUIVALENT_HPP_INCLUDED
9
+
10
+ #if defined(_MSC_VER) && (_MSC_VER >= 1020)
11
+ # pragma once
12
+ #endif
13
+
14
+ #include <boost/unordered/detail/table.hpp>
15
+ #include <boost/unordered/detail/extract_key.hpp>
16
+
17
+ namespace boost { namespace unordered { namespace detail {
18
+
19
+ template <typename A, typename T> struct grouped_node;
20
+ template <typename T> struct grouped_ptr_node;
21
+ template <typename Types> struct grouped_table_impl;
22
+
23
+ template <typename A, typename T>
24
+ struct grouped_node :
25
+ boost::unordered::detail::value_base<T>
26
+ {
27
+ typedef typename ::boost::unordered::detail::rebind_wrap<
28
+ A, grouped_node<A, T> >::type allocator;
29
+ typedef typename ::boost::unordered::detail::
30
+ allocator_traits<allocator>::pointer node_pointer;
31
+ typedef node_pointer link_pointer;
32
+
33
+ link_pointer next_;
34
+ node_pointer group_prev_;
35
+ std::size_t hash_;
36
+
37
+ grouped_node() :
38
+ next_(),
39
+ group_prev_(),
40
+ hash_(0)
41
+ {}
42
+
43
+ void init(node_pointer self)
44
+ {
45
+ group_prev_ = self;
46
+ }
47
+
48
+ private:
49
+ grouped_node& operator=(grouped_node const&);
50
+ };
51
+
52
+ template <typename T>
53
+ struct grouped_ptr_node :
54
+ boost::unordered::detail::value_base<T>,
55
+ boost::unordered::detail::ptr_bucket
56
+ {
57
+ typedef boost::unordered::detail::ptr_bucket bucket_base;
58
+ typedef grouped_ptr_node<T>* node_pointer;
59
+ typedef ptr_bucket* link_pointer;
60
+
61
+ node_pointer group_prev_;
62
+ std::size_t hash_;
63
+
64
+ grouped_ptr_node() :
65
+ bucket_base(),
66
+ group_prev_(0),
67
+ hash_(0)
68
+ {}
69
+
70
+ void init(node_pointer self)
71
+ {
72
+ group_prev_ = self;
73
+ }
74
+
75
+ private:
76
+ grouped_ptr_node& operator=(grouped_ptr_node const&);
77
+ };
78
+
79
+ // If the allocator uses raw pointers use grouped_ptr_node
80
+ // Otherwise use grouped_node.
81
+
82
+ template <typename A, typename T, typename NodePtr, typename BucketPtr>
83
+ struct pick_grouped_node2
84
+ {
85
+ typedef boost::unordered::detail::grouped_node<A, T> node;
86
+
87
+ typedef typename boost::unordered::detail::allocator_traits<
88
+ typename boost::unordered::detail::rebind_wrap<A, node>::type
89
+ >::pointer node_pointer;
90
+
91
+ typedef boost::unordered::detail::bucket<node_pointer> bucket;
92
+ typedef node_pointer link_pointer;
93
+ };
94
+
95
+ template <typename A, typename T>
96
+ struct pick_grouped_node2<A, T,
97
+ boost::unordered::detail::grouped_ptr_node<T>*,
98
+ boost::unordered::detail::ptr_bucket*>
99
+ {
100
+ typedef boost::unordered::detail::grouped_ptr_node<T> node;
101
+ typedef boost::unordered::detail::ptr_bucket bucket;
102
+ typedef bucket* link_pointer;
103
+ };
104
+
105
+ template <typename A, typename T>
106
+ struct pick_grouped_node
107
+ {
108
+ typedef boost::unordered::detail::allocator_traits<
109
+ typename boost::unordered::detail::rebind_wrap<A,
110
+ boost::unordered::detail::grouped_ptr_node<T> >::type
111
+ > tentative_node_traits;
112
+
113
+ typedef boost::unordered::detail::allocator_traits<
114
+ typename boost::unordered::detail::rebind_wrap<A,
115
+ boost::unordered::detail::ptr_bucket >::type
116
+ > tentative_bucket_traits;
117
+
118
+ typedef pick_grouped_node2<A, T,
119
+ typename tentative_node_traits::pointer,
120
+ typename tentative_bucket_traits::pointer> pick;
121
+
122
+ typedef typename pick::node node;
123
+ typedef typename pick::bucket bucket;
124
+ typedef typename pick::link_pointer link_pointer;
125
+ };
126
+
127
+ template <typename A, typename T, typename H, typename P>
128
+ struct multiset
129
+ {
130
+ typedef boost::unordered::detail::multiset<A, T, H, P> types;
131
+
132
+ typedef A allocator;
133
+ typedef T value_type;
134
+ typedef H hasher;
135
+ typedef P key_equal;
136
+ typedef T key_type;
137
+
138
+ typedef boost::unordered::detail::allocator_traits<allocator> traits;
139
+ typedef boost::unordered::detail::pick_grouped_node<allocator,
140
+ value_type> pick;
141
+ typedef typename pick::node node;
142
+ typedef typename pick::bucket bucket;
143
+ typedef typename pick::link_pointer link_pointer;
144
+
145
+ typedef boost::unordered::detail::grouped_table_impl<types> table;
146
+ typedef boost::unordered::detail::set_extractor<value_type> extractor;
147
+
148
+ typedef boost::unordered::detail::pick_policy::type policy;
149
+ };
150
+
151
+ template <typename A, typename K, typename M, typename H, typename P>
152
+ struct multimap
153
+ {
154
+ typedef boost::unordered::detail::multimap<A, K, M, H, P> types;
155
+
156
+ typedef A allocator;
157
+ typedef std::pair<K const, M> value_type;
158
+ typedef H hasher;
159
+ typedef P key_equal;
160
+ typedef K key_type;
161
+
162
+ typedef boost::unordered::detail::allocator_traits<allocator> traits;
163
+ typedef boost::unordered::detail::pick_grouped_node<allocator,
164
+ value_type> pick;
165
+ typedef typename pick::node node;
166
+ typedef typename pick::bucket bucket;
167
+ typedef typename pick::link_pointer link_pointer;
168
+
169
+ typedef boost::unordered::detail::grouped_table_impl<types> table;
170
+ typedef boost::unordered::detail::map_extractor<key_type, value_type>
171
+ extractor;
172
+
173
+ typedef boost::unordered::detail::pick_policy::type policy;
174
+ };
175
+
176
+ template <typename Types>
177
+ struct grouped_table_impl : boost::unordered::detail::table<Types>
178
+ {
179
+ typedef boost::unordered::detail::table<Types> table;
180
+ typedef typename table::value_type value_type;
181
+ typedef typename table::bucket bucket;
182
+ typedef typename table::policy policy;
183
+ typedef typename table::node_pointer node_pointer;
184
+ typedef typename table::node_allocator node_allocator;
185
+ typedef typename table::node_allocator_traits node_allocator_traits;
186
+ typedef typename table::bucket_pointer bucket_pointer;
187
+ typedef typename table::link_pointer link_pointer;
188
+ typedef typename table::hasher hasher;
189
+ typedef typename table::key_equal key_equal;
190
+ typedef typename table::key_type key_type;
191
+ typedef typename table::node_constructor node_constructor;
192
+ typedef typename table::extractor extractor;
193
+ typedef typename table::iterator iterator;
194
+ typedef typename table::c_iterator c_iterator;
195
+
196
+ // Constructors
197
+
198
+ grouped_table_impl(std::size_t n,
199
+ hasher const& hf,
200
+ key_equal const& eq,
201
+ node_allocator const& a)
202
+ : table(n, hf, eq, a)
203
+ {}
204
+
205
+ grouped_table_impl(grouped_table_impl const& x)
206
+ : table(x, node_allocator_traits::
207
+ select_on_container_copy_construction(x.node_alloc()))
208
+ {
209
+ this->init(x);
210
+ }
211
+
212
+ grouped_table_impl(grouped_table_impl const& x,
213
+ node_allocator const& a)
214
+ : table(x, a)
215
+ {
216
+ this->init(x);
217
+ }
218
+
219
+ grouped_table_impl(grouped_table_impl& x,
220
+ boost::unordered::detail::move_tag m)
221
+ : table(x, m)
222
+ {}
223
+
224
+ grouped_table_impl(grouped_table_impl& x,
225
+ node_allocator const& a,
226
+ boost::unordered::detail::move_tag m)
227
+ : table(x, a, m)
228
+ {
229
+ this->move_init(x);
230
+ }
231
+
232
+ // Accessors
233
+
234
+ template <class Key, class Pred>
235
+ iterator find_node_impl(
236
+ std::size_t key_hash,
237
+ Key const& k,
238
+ Pred const& eq) const
239
+ {
240
+ std::size_t bucket_index = this->hash_to_bucket(key_hash);
241
+ iterator n = this->begin(bucket_index);
242
+
243
+ for (;;)
244
+ {
245
+ if (!n.node_) return n;
246
+
247
+ std::size_t node_hash = n.node_->hash_;
248
+ if (key_hash == node_hash)
249
+ {
250
+ if (eq(k, this->get_key(*n)))
251
+ return n;
252
+ }
253
+ else
254
+ {
255
+ if (this->hash_to_bucket(node_hash) != bucket_index)
256
+ return iterator();
257
+ }
258
+
259
+ n = iterator(n.node_->group_prev_->next_);
260
+ }
261
+ }
262
+
263
+ std::size_t count(key_type const& k) const
264
+ {
265
+ iterator n = this->find_node(k);
266
+ if (!n.node_) return 0;
267
+
268
+ std::size_t x = 0;
269
+ node_pointer it = n.node_;
270
+ do {
271
+ it = it->group_prev_;
272
+ ++x;
273
+ } while(it != n.node_);
274
+
275
+ return x;
276
+ }
277
+
278
+ std::pair<iterator, iterator>
279
+ equal_range(key_type const& k) const
280
+ {
281
+ iterator n = this->find_node(k);
282
+ return std::make_pair(
283
+ n, n.node_ ? iterator(n.node_->group_prev_->next_) : n);
284
+ }
285
+
286
+ // Equality
287
+
288
+ bool equals(grouped_table_impl const& other) const
289
+ {
290
+ if(this->size_ != other.size_) return false;
291
+
292
+ for(iterator n1 = this->begin(); n1.node_;)
293
+ {
294
+ iterator n2 = other.find_matching_node(n1);
295
+ if (!n2.node_) return false;
296
+ iterator end1(n1.node_->group_prev_->next_);
297
+ iterator end2(n2.node_->group_prev_->next_);
298
+ if (!group_equals(n1, end1, n2, end2)) return false;
299
+ n1 = end1;
300
+ }
301
+
302
+ return true;
303
+ }
304
+
305
+ static bool group_equals(iterator n1, iterator end1,
306
+ iterator n2, iterator end2)
307
+ {
308
+ for(;;)
309
+ {
310
+ if (*n1 != *n2) break;
311
+
312
+ ++n1;
313
+ ++n2;
314
+
315
+ if (n1 == end1) return n2 == end2;
316
+ if (n2 == end2) return false;
317
+ }
318
+
319
+ for(iterator n1a = n1, n2a = n2;;)
320
+ {
321
+ ++n1a;
322
+ ++n2a;
323
+
324
+ if (n1a == end1)
325
+ {
326
+ if (n2a == end2) break;
327
+ else return false;
328
+ }
329
+
330
+ if (n2a == end2) return false;
331
+ }
332
+
333
+ iterator start = n1;
334
+ for(;n1 != end1; ++n1)
335
+ {
336
+ value_type const& v = *n1;
337
+ if (find(start, n1, v)) continue;
338
+ std::size_t matches = count_equal(n2, end2, v);
339
+ if (!matches) return false;
340
+ iterator next = n1;
341
+ ++next;
342
+ if (matches != 1 + count_equal(next, end1, v)) return false;
343
+ }
344
+
345
+ return true;
346
+ }
347
+
348
+ static bool find(iterator n, iterator end, value_type const& v)
349
+ {
350
+ for(;n != end; ++n)
351
+ if (*n == v)
352
+ return true;
353
+ return false;
354
+ }
355
+
356
+ static std::size_t count_equal(iterator n, iterator end,
357
+ value_type const& v)
358
+ {
359
+ std::size_t count = 0;
360
+ for(;n != end; ++n)
361
+ if (*n == v) ++count;
362
+ return count;
363
+ }
364
+
365
+ // Emplace/Insert
366
+
367
+ static inline void add_after_node(
368
+ node_pointer n,
369
+ node_pointer pos)
370
+ {
371
+ n->next_ = pos->group_prev_->next_;
372
+ n->group_prev_ = pos->group_prev_;
373
+ pos->group_prev_->next_ = n;
374
+ pos->group_prev_ = n;
375
+ }
376
+
377
+ inline iterator add_node(
378
+ node_constructor& a,
379
+ std::size_t key_hash,
380
+ iterator pos)
381
+ {
382
+ node_pointer n = a.release();
383
+ n->hash_ = key_hash;
384
+ if (pos.node_) {
385
+ this->add_after_node(n, pos.node_);
386
+ if (n->next_) {
387
+ std::size_t next_bucket = this->hash_to_bucket(
388
+ static_cast<node_pointer>(n->next_)->hash_);
389
+ if (next_bucket != this->hash_to_bucket(key_hash)) {
390
+ this->get_bucket(next_bucket)->next_ = n;
391
+ }
392
+ }
393
+ }
394
+ else {
395
+ bucket_pointer b = this->get_bucket(
396
+ this->hash_to_bucket(key_hash));
397
+
398
+ if (!b->next_)
399
+ {
400
+ link_pointer start_node = this->get_previous_start();
401
+
402
+ if (start_node->next_) {
403
+ this->get_bucket(this->hash_to_bucket(
404
+ static_cast<node_pointer>(start_node->next_)->hash_
405
+ ))->next_ = n;
406
+ }
407
+
408
+ b->next_ = start_node;
409
+ n->next_ = start_node->next_;
410
+ start_node->next_ = n;
411
+ }
412
+ else
413
+ {
414
+ n->next_ = b->next_->next_;
415
+ b->next_->next_ = n;
416
+ }
417
+ }
418
+ ++this->size_;
419
+ return iterator(n);
420
+ }
421
+
422
+ iterator emplace_impl(node_constructor& a)
423
+ {
424
+ key_type const& k = this->get_key(a.value());
425
+ std::size_t key_hash = this->hash(k);
426
+ iterator position = this->find_node(key_hash, k);
427
+
428
+ // reserve has basic exception safety if the hash function
429
+ // throws, strong otherwise.
430
+ this->reserve_for_insert(this->size_ + 1);
431
+ return this->add_node(a, key_hash, position);
432
+ }
433
+
434
+ void emplace_impl_no_rehash(node_constructor& a)
435
+ {
436
+ key_type const& k = this->get_key(a.value());
437
+ std::size_t key_hash = this->hash(k);
438
+ this->add_node(a, key_hash, this->find_node(key_hash, k));
439
+ }
440
+
441
+ #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
442
+ # if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
443
+ iterator emplace(boost::unordered::detail::emplace_args1<
444
+ boost::unordered::detail::please_ignore_this_overload> const&)
445
+ {
446
+ BOOST_ASSERT(false);
447
+ return iterator();
448
+ }
449
+ # else
450
+ iterator emplace(
451
+ boost::unordered::detail::please_ignore_this_overload const&)
452
+ {
453
+ BOOST_ASSERT(false);
454
+ return iterator();
455
+ }
456
+ # endif
457
+ #endif
458
+
459
+ template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
460
+ iterator emplace(BOOST_UNORDERED_EMPLACE_ARGS)
461
+ {
462
+ node_constructor a(this->node_alloc());
463
+ a.construct_with_value(BOOST_UNORDERED_EMPLACE_FORWARD);
464
+
465
+ return iterator(emplace_impl(a));
466
+ }
467
+
468
+ ////////////////////////////////////////////////////////////////////////
469
+ // Insert range methods
470
+
471
+ // if hash function throws, or inserting > 1 element, basic exception
472
+ // safety. Strong otherwise
473
+ template <class I>
474
+ typename boost::unordered::detail::enable_if_forward<I, void>::type
475
+ insert_range(I i, I j)
476
+ {
477
+ if(i == j) return;
478
+
479
+ std::size_t distance = boost::unordered::detail::distance(i, j);
480
+ if(distance == 1) {
481
+ node_constructor a(this->node_alloc());
482
+ a.construct_with_value2(*i);
483
+ emplace_impl(a);
484
+ }
485
+ else {
486
+ // Only require basic exception safety here
487
+ this->reserve_for_insert(this->size_ + distance);
488
+
489
+ node_constructor a(this->node_alloc());
490
+ for (; i != j; ++i) {
491
+ a.construct_with_value2(*i);
492
+ emplace_impl_no_rehash(a);
493
+ }
494
+ }
495
+ }
496
+
497
+ template <class I>
498
+ typename boost::unordered::detail::disable_if_forward<I, void>::type
499
+ insert_range(I i, I j)
500
+ {
501
+ node_constructor a(this->node_alloc());
502
+ for (; i != j; ++i) {
503
+ a.construct_with_value2(*i);
504
+ emplace_impl(a);
505
+ }
506
+ }
507
+
508
+ ////////////////////////////////////////////////////////////////////////
509
+ // Erase
510
+ //
511
+ // no throw
512
+
513
+ std::size_t erase_key(key_type const& k)
514
+ {
515
+ if(!this->size_) return 0;
516
+
517
+ std::size_t key_hash = this->hash(k);
518
+ std::size_t bucket_index = this->hash_to_bucket(key_hash);
519
+ link_pointer prev = this->get_previous_start(bucket_index);
520
+ if (!prev) return 0;
521
+
522
+ for (;;)
523
+ {
524
+ if (!prev->next_) return 0;
525
+ std::size_t node_hash =
526
+ static_cast<node_pointer>(prev->next_)->hash_;
527
+ if (this->hash_to_bucket(node_hash) != bucket_index)
528
+ return 0;
529
+ if (node_hash == key_hash &&
530
+ this->key_eq()(k, this->get_key(
531
+ static_cast<node_pointer>(prev->next_)->value())))
532
+ break;
533
+ prev = static_cast<node_pointer>(prev->next_)->group_prev_;
534
+ }
535
+
536
+ node_pointer first_node = static_cast<node_pointer>(prev->next_);
537
+ link_pointer end = first_node->group_prev_->next_;
538
+
539
+ std::size_t count = this->delete_nodes(prev, end);
540
+ this->fix_bucket(bucket_index, prev);
541
+ return count;
542
+ }
543
+
544
+ iterator erase(c_iterator r)
545
+ {
546
+ BOOST_ASSERT(r.node_);
547
+ iterator next(r.node_);
548
+ ++next;
549
+ erase_nodes(r.node_, next.node_);
550
+ return next;
551
+ }
552
+
553
+ iterator erase_range(c_iterator r1, c_iterator r2)
554
+ {
555
+ if (r1 == r2) return iterator(r2.node_);
556
+ erase_nodes(r1.node_, r2.node_);
557
+ return iterator(r2.node_);
558
+ }
559
+
560
+ link_pointer erase_nodes(node_pointer begin, node_pointer end)
561
+ {
562
+ std::size_t bucket_index = this->hash_to_bucket(begin->hash_);
563
+
564
+ // Split the groups containing 'begin' and 'end'.
565
+ // And get the pointer to the node before begin while
566
+ // we're at it.
567
+ link_pointer prev = split_groups(begin, end);
568
+
569
+ // If we don't have a 'prev' it means that begin is at the
570
+ // beginning of a block, so search through the blocks in the
571
+ // same bucket.
572
+ if (!prev) {
573
+ prev = this->get_previous_start(bucket_index);
574
+ while (prev->next_ != begin)
575
+ prev = static_cast<node_pointer>(prev->next_)->group_prev_;
576
+ }
577
+
578
+ // Delete the nodes.
579
+ do {
580
+ link_pointer group_end =
581
+ static_cast<node_pointer>(prev->next_)->group_prev_->next_;
582
+ this->delete_nodes(prev, group_end);
583
+ bucket_index = this->fix_bucket(bucket_index, prev);
584
+ } while(prev->next_ != end);
585
+
586
+ return prev;
587
+ }
588
+
589
+ static link_pointer split_groups(node_pointer begin, node_pointer end)
590
+ {
591
+ node_pointer prev = begin->group_prev_;
592
+ if (prev->next_ != begin) prev = node_pointer();
593
+
594
+ if (end) {
595
+ node_pointer first = end;
596
+ while (first != begin && first->group_prev_->next_ == first) {
597
+ first = first->group_prev_;
598
+ }
599
+
600
+ boost::swap(first->group_prev_, end->group_prev_);
601
+ if (first == begin) return prev;
602
+ }
603
+
604
+ if (prev) {
605
+ node_pointer first = prev;
606
+ while (first->group_prev_->next_ == first) {
607
+ first = first->group_prev_;
608
+ }
609
+ boost::swap(first->group_prev_, begin->group_prev_);
610
+ }
611
+
612
+ return prev;
613
+ }
614
+
615
+ ////////////////////////////////////////////////////////////////////////
616
+ // fill_buckets
617
+
618
+ template <class NodeCreator>
619
+ static void fill_buckets(iterator n, table& dst,
620
+ NodeCreator& creator)
621
+ {
622
+ link_pointer prev = dst.get_previous_start();
623
+
624
+ while (n.node_) {
625
+ std::size_t key_hash = n.node_->hash_;
626
+ iterator group_end(n.node_->group_prev_->next_);
627
+
628
+ node_pointer first_node = creator.create(*n);
629
+ node_pointer end = first_node;
630
+ first_node->hash_ = key_hash;
631
+ prev->next_ = first_node;
632
+ ++dst.size_;
633
+
634
+ for (++n; n != group_end; ++n)
635
+ {
636
+ end = creator.create(*n);
637
+ end->hash_ = key_hash;
638
+ add_after_node(end, first_node);
639
+ ++dst.size_;
640
+ }
641
+
642
+ prev = place_in_bucket(dst, prev, end);
643
+ }
644
+ }
645
+
646
+ // strong otherwise exception safety
647
+ void rehash_impl(std::size_t num_buckets)
648
+ {
649
+ BOOST_ASSERT(this->buckets_);
650
+
651
+ this->create_buckets(num_buckets);
652
+ link_pointer prev = this->get_previous_start();
653
+ while (prev->next_)
654
+ prev = place_in_bucket(*this, prev,
655
+ static_cast<node_pointer>(prev->next_)->group_prev_);
656
+ }
657
+
658
+ // Iterate through the nodes placing them in the correct buckets.
659
+ // pre: prev->next_ is not null.
660
+ static link_pointer place_in_bucket(table& dst,
661
+ link_pointer prev, node_pointer end)
662
+ {
663
+ bucket_pointer b = dst.get_bucket(dst.hash_to_bucket(end->hash_));
664
+
665
+ if (!b->next_) {
666
+ b->next_ = prev;
667
+ return end;
668
+ }
669
+ else {
670
+ link_pointer next = end->next_;
671
+ end->next_ = b->next_->next_;
672
+ b->next_->next_ = prev->next_;
673
+ prev->next_ = next;
674
+ return prev;
675
+ }
676
+ }
677
+ };
678
+ }}}
679
+
680
+ #endif