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