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,55 @@
1
+ #ifndef BOOST_POINTER_TO_OTHER_HPP_INCLUDED
2
+ #define BOOST_POINTER_TO_OTHER_HPP_INCLUDED
3
+
4
+ //
5
+ // pointer_to_other.hpp
6
+ //
7
+ // (C) Copyright Ion Gaztanaga 2005.
8
+ // Copyright (c) 2005 Peter Dimov.
9
+ //
10
+ // Distributed under the Boost Software License, Version 1.0.
11
+ //
12
+ // (See accompanying file LICENSE_1_0.txt or copy at
13
+ // http://www.boost.org/LICENSE_1_0.txt)
14
+ //
15
+ // See http://www.boost.org/libs/smart_ptr/pointer_to_other.html
16
+ //
17
+
18
+ namespace boost
19
+ {
20
+
21
+ // Defines the same pointer type (raw or smart) to another pointee type
22
+
23
+ template<class T, class U>
24
+ struct pointer_to_other;
25
+
26
+ template<class T, class U,
27
+ template<class> class Sp>
28
+ struct pointer_to_other< Sp<T>, U >
29
+ {
30
+ typedef Sp<U> type;
31
+ };
32
+
33
+ template<class T, class T2, class U,
34
+ template<class, class> class Sp>
35
+ struct pointer_to_other< Sp<T, T2>, U >
36
+ {
37
+ typedef Sp<U, T2> type;
38
+ };
39
+
40
+ template<class T, class T2, class T3, class U,
41
+ template<class, class, class> class Sp>
42
+ struct pointer_to_other< Sp<T, T2, T3>, U >
43
+ {
44
+ typedef Sp<U, T2, T3> type;
45
+ };
46
+
47
+ template<class T, class U>
48
+ struct pointer_to_other< T*, U >
49
+ {
50
+ typedef U* type;
51
+ };
52
+
53
+ } // namespace boost
54
+
55
+ #endif // #ifndef BOOST_POINTER_TO_OTHER_HPP_INCLUDED
@@ -330,8 +330,8 @@ namespace boost {
330
330
  struct BidirectionalRangeConcept : ForwardRangeConcept<T>
331
331
  {
332
332
  #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
333
- BOOST_RANGE_CONCEPT_ASSERT((BidirectionalIteratorConcept<BOOST_DEDUCED_TYPENAME BidirectionalRangeConcept::iterator>));
334
- BOOST_RANGE_CONCEPT_ASSERT((BidirectionalIteratorConcept<BOOST_DEDUCED_TYPENAME BidirectionalRangeConcept::const_iterator>));
333
+ BOOST_RANGE_CONCEPT_ASSERT((range_detail::BidirectionalIteratorConcept<BOOST_DEDUCED_TYPENAME BidirectionalRangeConcept::iterator>));
334
+ BOOST_RANGE_CONCEPT_ASSERT((range_detail::BidirectionalIteratorConcept<BOOST_DEDUCED_TYPENAME BidirectionalRangeConcept::const_iterator>));
335
335
  #endif
336
336
  };
337
337
 
@@ -348,8 +348,8 @@ namespace boost {
348
348
  struct RandomAccessRangeConcept : BidirectionalRangeConcept<T>
349
349
  {
350
350
  #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
351
- BOOST_RANGE_CONCEPT_ASSERT((RandomAccessIteratorConcept<BOOST_DEDUCED_TYPENAME RandomAccessRangeConcept::iterator>));
352
- BOOST_RANGE_CONCEPT_ASSERT((RandomAccessIteratorConcept<BOOST_DEDUCED_TYPENAME RandomAccessRangeConcept::const_iterator>));
351
+ BOOST_RANGE_CONCEPT_ASSERT((range_detail::RandomAccessIteratorConcept<BOOST_DEDUCED_TYPENAME RandomAccessRangeConcept::iterator>));
352
+ BOOST_RANGE_CONCEPT_ASSERT((range_detail::RandomAccessIteratorConcept<BOOST_DEDUCED_TYPENAME RandomAccessRangeConcept::const_iterator>));
353
353
  #endif
354
354
  };
355
355
 
@@ -16,7 +16,7 @@
16
16
 
17
17
  #include <boost/config.hpp>
18
18
 
19
- #ifdef BOOST_NO_PARTIAL_TEMPLATE_SPECIALIZATION
19
+ #ifdef BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS
20
20
 
21
21
  #define BOOST_RANGE_EXTRACT_OPTIONAL_TYPE( a_typedef ) \
22
22
  template< typename C > \
@@ -28,7 +28,7 @@ namespace boost
28
28
  return boost::begin( r ) == boost::end( r );
29
29
  }
30
30
 
31
- } // namepace 'boost'
31
+ } // namespace 'boost'
32
32
 
33
33
 
34
34
  #endif
@@ -21,7 +21,9 @@
21
21
  #include <boost/assert.hpp>
22
22
  #include <boost/iterator/iterator_traits.hpp>
23
23
  #include <boost/iterator/iterator_facade.hpp>
24
+ #include <boost/mpl/or.hpp>
24
25
  #include <boost/type_traits/is_abstract.hpp>
26
+ #include <boost/type_traits/is_array.hpp>
25
27
  #include <boost/type_traits/is_pointer.hpp>
26
28
  #include <boost/range/functions.hpp>
27
29
  #include <boost/range/iterator.hpp>
@@ -167,7 +169,8 @@ namespace boost
167
169
 
168
170
  private: // for return value of operator()()
169
171
  typedef BOOST_DEDUCED_TYPENAME
170
- boost::mpl::if_< boost::is_abstract<value_type>,
172
+ boost::mpl::if_< boost::mpl::or_< boost::is_abstract< value_type >,
173
+ boost::is_array< value_type > >,
171
174
  reference, value_type >::type abstract_value_type;
172
175
 
173
176
  public:
@@ -48,7 +48,7 @@ namespace boost
48
48
 
49
49
  //! iterator_range output operator
50
50
  /*!
51
- Output the range to an ostream. Elements are outputed
51
+ Output the range to an ostream. Elements are outputted
52
52
  in a sequence without separators.
53
53
  */
54
54
  template< typename IteratorT, typename Elem, typename Traits >
@@ -67,7 +67,7 @@ namespace boost
67
67
 
68
68
  //! iterator_range output operator
69
69
  /*!
70
- Output the range to an ostream. Elements are outputed
70
+ Output the range to an ostream. Elements are outputted
71
71
  in a sequence without separators.
72
72
  */
73
73
  template< typename IteratorT >
@@ -49,6 +49,12 @@
49
49
  #define BOOST_RATIO_INTMAX_C(a) a##LL
50
50
  #endif
51
51
 
52
+ #ifdef UINTMAX_C
53
+ #define BOOST_RATIO_UINTMAX_C(a) UINTMAX_C(a)
54
+ #else
55
+ #define BOOST_RATIO_UINTMAX_C(a) a##ULL
56
+ #endif
57
+
52
58
  #define BOOST_RATIO_INTMAX_T_MAX (0x7FFFFFFFFFFFFFFELL)
53
59
 
54
60
 
@@ -133,7 +133,7 @@ namespace ratio_detail
133
133
  class br_mul
134
134
  {
135
135
  static const boost::intmax_t nan =
136
- (BOOST_RATIO_INTMAX_C(1) << (sizeof(boost::intmax_t) * CHAR_BIT - 1));
136
+ boost::intmax_t(BOOST_RATIO_UINTMAX_C(1) << (sizeof(boost::intmax_t) * CHAR_BIT - 1));
137
137
  static const boost::intmax_t min = boost::integer_traits<boost::intmax_t>::const_min;
138
138
  static const boost::intmax_t max = boost::integer_traits<boost::intmax_t>::const_max;
139
139
 
@@ -172,7 +172,7 @@ namespace ratio_detail
172
172
  template <boost::intmax_t X, boost::intmax_t Y>
173
173
  class br_div
174
174
  {
175
- static const boost::intmax_t nan = (1LL << (sizeof(boost::intmax_t) * CHAR_BIT - 1));
175
+ static const boost::intmax_t nan = boost::intmax_t(BOOST_RATIO_UINTMAX_C(1) << (sizeof(boost::intmax_t) * CHAR_BIT - 1));
176
176
  static const boost::intmax_t min = boost::integer_traits<boost::intmax_t>::const_min;
177
177
  static const boost::intmax_t max = boost::integer_traits<boost::intmax_t>::const_max;
178
178
 
@@ -0,0 +1,250 @@
1
+ /*
2
+ * Copyright (c) 2012 Glen Joseph Fernandes
3
+ * glenfe at live dot com
4
+ *
5
+ * Distributed under the Boost Software License,
6
+ * Version 1.0. (See accompanying file LICENSE_1_0.txt
7
+ * or copy at http://boost.org/LICENSE_1_0.txt)
8
+ */
9
+ #ifndef BOOST_SMART_PTR_ALLOCATE_SHARED_ARRAY_HPP
10
+ #define BOOST_SMART_PTR_ALLOCATE_SHARED_ARRAY_HPP
11
+
12
+ #include <boost/smart_ptr/shared_ptr.hpp>
13
+ #include <boost/smart_ptr/detail/allocate_array_helper.hpp>
14
+ #include <boost/smart_ptr/detail/array_deleter.hpp>
15
+ #include <boost/smart_ptr/detail/array_traits.hpp>
16
+ #include <boost/smart_ptr/detail/sp_if_array.hpp>
17
+ #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
18
+ #include <initializer_list>
19
+ #endif
20
+
21
+ namespace boost {
22
+ template<typename T, typename A>
23
+ inline typename boost::detail::sp_if_array<T>::type
24
+ allocate_shared(const A& allocator, std::size_t size) {
25
+ typedef typename boost::detail::array_inner<T>::type T1;
26
+ typedef typename boost::detail::array_base<T1>::type T2;
27
+ T1* p1 = 0;
28
+ T2* p2 = 0;
29
+ std::size_t n1 = size * boost::detail::array_total<T1>::size;
30
+ boost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
31
+ boost::detail::array_deleter<T2[]> d1(n1);
32
+ boost::shared_ptr<T> s1(p1, d1, a1);
33
+ typedef boost::detail::array_deleter<T2[]>* D2;
34
+ p1 = reinterpret_cast<T1*>(p2);
35
+ D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
36
+ d2->init(p2);
37
+ return boost::shared_ptr<T>(s1, p1);
38
+ }
39
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
40
+ template<typename T, typename A, typename... Args>
41
+ inline typename boost::detail::sp_if_array<T>::type
42
+ allocate_shared(const A& allocator, std::size_t size, Args&&... args) {
43
+ typedef typename boost::detail::array_inner<T>::type T1;
44
+ typedef typename boost::detail::array_base<T1>::type T2;
45
+ T1* p1 = 0;
46
+ T2* p2 = 0;
47
+ std::size_t n1 = size * boost::detail::array_total<T1>::size;
48
+ boost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
49
+ boost::detail::array_deleter<T2[]> d1(n1);
50
+ boost::shared_ptr<T> s1(p1, d1, a1);
51
+ typedef boost::detail::array_deleter<T2[]>* D2;
52
+ p1 = reinterpret_cast<T1*>(p2);
53
+ D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
54
+ d2->init(p2, boost::detail::sp_forward<Args>(args)...);
55
+ return boost::shared_ptr<T>(s1, p1);
56
+ }
57
+ template<typename T, typename A, typename... Args>
58
+ inline typename boost::detail::sp_if_size_array<T>::type
59
+ allocate_shared(const A& allocator, Args&&... args) {
60
+ typedef typename boost::detail::array_inner<T>::type T1;
61
+ typedef typename boost::detail::array_base<T1>::type T2;
62
+ enum {
63
+ N = boost::detail::array_total<T>::size
64
+ };
65
+ T1* p1 = 0;
66
+ T2* p2 = 0;
67
+ boost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
68
+ boost::detail::array_deleter<T2[N]> d1;
69
+ boost::shared_ptr<T> s1(p1, d1, a1);
70
+ typedef boost::detail::array_deleter<T2[N]>* D2;
71
+ p1 = reinterpret_cast<T1*>(p2);
72
+ D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
73
+ d2->init(p2, boost::detail::sp_forward<Args>(args)...);
74
+ return boost::shared_ptr<T>(s1, p1);
75
+ }
76
+ #endif
77
+ #if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
78
+ template<typename T, typename A>
79
+ inline typename boost::detail::sp_if_size_array<T>::type
80
+ allocate_shared(const A& allocator, const T& list) {
81
+ typedef typename boost::detail::array_inner<T>::type T1;
82
+ typedef typename boost::detail::array_base<T1>::type T2;
83
+ typedef const T2 T3;
84
+ enum {
85
+ N = boost::detail::array_total<T>::size
86
+ };
87
+ T1* p1 = 0;
88
+ T2* p2 = 0;
89
+ T3* p3 = 0;
90
+ boost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
91
+ boost::detail::array_deleter<T2[N]> d1;
92
+ boost::shared_ptr<T> s1(p1, d1, a1);
93
+ typedef boost::detail::array_deleter<T2[N]>* D2;
94
+ p3 = reinterpret_cast<T3*>(list);
95
+ p1 = reinterpret_cast<T1*>(p2);
96
+ D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
97
+ d2->init_list(p2, p3);
98
+ return boost::shared_ptr<T>(s1, p1);
99
+ }
100
+ template<typename T, typename A>
101
+ inline typename boost::detail::sp_if_array<T>::type
102
+ allocate_shared(const A& allocator, std::size_t size,
103
+ const typename boost::detail::array_inner<T>::type& list) {
104
+ typedef typename boost::detail::array_inner<T>::type T1;
105
+ typedef typename boost::detail::array_base<T1>::type T2;
106
+ typedef const T2 T3;
107
+ enum {
108
+ M = boost::detail::array_total<T1>::size
109
+ };
110
+ T1* p1 = 0;
111
+ T2* p2 = 0;
112
+ T3* p3 = 0;
113
+ std::size_t n1 = M * size;
114
+ boost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
115
+ boost::detail::array_deleter<T2[]> d1(n1);
116
+ boost::shared_ptr<T> s1(p1, d1, a1);
117
+ typedef boost::detail::array_deleter<T2[]>* D2;
118
+ p3 = reinterpret_cast<T3*>(list);
119
+ p1 = reinterpret_cast<T1*>(p2);
120
+ D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
121
+ d2->template init_list<M>(p2, p3);
122
+ return boost::shared_ptr<T>(s1, p1);
123
+ }
124
+ template<typename T, typename A>
125
+ inline typename boost::detail::sp_if_size_array<T>::type
126
+ allocate_shared(const A& allocator,
127
+ const typename boost::detail::array_inner<T>::type& list) {
128
+ typedef typename boost::detail::array_inner<T>::type T1;
129
+ typedef typename boost::detail::array_base<T1>::type T2;
130
+ typedef const T2 T3;
131
+ enum {
132
+ M = boost::detail::array_total<T1>::size,
133
+ N = boost::detail::array_total<T>::size
134
+ };
135
+ T1* p1 = 0;
136
+ T2* p2 = 0;
137
+ T3* p3 = 0;
138
+ boost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
139
+ boost::detail::array_deleter<T2[N]> d1;
140
+ boost::shared_ptr<T> s1(p1, d1, a1);
141
+ typedef boost::detail::array_deleter<T2[N]>* D2;
142
+ p3 = reinterpret_cast<T3*>(list);
143
+ p1 = reinterpret_cast<T1*>(p2);
144
+ D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
145
+ d2->template init_list<M>(p2, p3);
146
+ return boost::shared_ptr<T>(s1, p1);
147
+ }
148
+ #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
149
+ template<typename T, typename A>
150
+ inline typename boost::detail::sp_if_array<T>::type
151
+ allocate_shared(const A& allocator,
152
+ std::initializer_list<typename boost::detail::array_inner<T>::type> list) {
153
+ typedef typename boost::detail::array_inner<T>::type T1;
154
+ typedef typename boost::detail::array_base<T1>::type T2;
155
+ typedef const T2 T3;
156
+ T1* p1 = 0;
157
+ T2* p2 = 0;
158
+ T3* p3 = 0;
159
+ std::size_t n1 = list.size() * boost::detail::array_total<T1>::size;
160
+ boost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
161
+ boost::detail::array_deleter<T2[]> d1(n1);
162
+ boost::shared_ptr<T> s1(p1, d1, a1);
163
+ typedef boost::detail::array_deleter<T2[]>* D2;
164
+ p3 = reinterpret_cast<T3*>(list.begin());
165
+ p1 = reinterpret_cast<T1*>(p2);
166
+ D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
167
+ d2->init_list(p2, p3);
168
+ return boost::shared_ptr<T>(s1, p1);
169
+ }
170
+ #endif
171
+ #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
172
+ template<typename T, typename A>
173
+ inline typename boost::detail::sp_if_array<T>::type
174
+ allocate_shared(const A& allocator, std::size_t size,
175
+ typename boost::detail::array_base<T>::type&& value) {
176
+ typedef typename boost::detail::array_inner<T>::type T1;
177
+ typedef typename boost::detail::array_base<T1>::type T2;
178
+ T1* p1 = 0;
179
+ T2* p2 = 0;
180
+ std::size_t n1 = size * boost::detail::array_total<T1>::size;
181
+ boost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
182
+ boost::detail::array_deleter<T2[]> d1(n1);
183
+ boost::shared_ptr<T> s1(p1, d1, a1);
184
+ typedef boost::detail::array_deleter<T2[]>* D2;
185
+ p1 = reinterpret_cast<T1*>(p2);
186
+ D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
187
+ d2->init(p2, boost::detail::sp_forward<T2>(value));
188
+ return boost::shared_ptr<T>(s1, p1);
189
+ }
190
+ template<typename T, typename A>
191
+ inline typename boost::detail::sp_if_size_array<T>::type
192
+ allocate_shared(const A& allocator,
193
+ typename boost::detail::array_base<T>::type&& value) {
194
+ typedef typename boost::detail::array_inner<T>::type T1;
195
+ typedef typename boost::detail::array_base<T1>::type T2;
196
+ enum {
197
+ N = boost::detail::array_total<T>::size
198
+ };
199
+ T1* p1 = 0;
200
+ T2* p2 = 0;
201
+ boost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
202
+ boost::detail::array_deleter<T2[N]> d1;
203
+ boost::shared_ptr<T> s1(p1, d1, a1);
204
+ typedef boost::detail::array_deleter<T2[N]>* D2;
205
+ p1 = reinterpret_cast<T1*>(p2);
206
+ D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
207
+ d2->init(p2, boost::detail::sp_forward<T2>(value));
208
+ return boost::shared_ptr<T>(s1, p1);
209
+ }
210
+ #endif
211
+ #endif
212
+ template<typename T, typename A>
213
+ inline typename boost::detail::sp_if_array<T>::type
214
+ allocate_shared_noinit(const A& allocator, std::size_t size) {
215
+ typedef typename boost::detail::array_inner<T>::type T1;
216
+ typedef typename boost::detail::array_base<T1>::type T2;
217
+ T1* p1 = 0;
218
+ T2* p2 = 0;
219
+ std::size_t n1 = size * boost::detail::array_total<T1>::size;
220
+ boost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
221
+ boost::detail::array_deleter<T2[]> d1(n1);
222
+ boost::shared_ptr<T> s1(p1, d1, a1);
223
+ typedef boost::detail::array_deleter<T2[]>* D2;
224
+ p1 = reinterpret_cast<T1*>(p2);
225
+ D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
226
+ d2->noinit(p2);
227
+ return boost::shared_ptr<T>(s1, p1);
228
+ }
229
+ template<typename T, typename A>
230
+ inline typename boost::detail::sp_if_size_array<T>::type
231
+ allocate_shared_noinit(const A& allocator) {
232
+ typedef typename boost::detail::array_inner<T>::type T1;
233
+ typedef typename boost::detail::array_base<T1>::type T2;
234
+ enum {
235
+ N = boost::detail::array_total<T>::size
236
+ };
237
+ T1* p1 = 0;
238
+ T2* p2 = 0;
239
+ boost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
240
+ boost::detail::array_deleter<T2[N]> d1;
241
+ boost::shared_ptr<T> s1(p1, d1, a1);
242
+ typedef boost::detail::array_deleter<T2[N]>* D2;
243
+ p1 = reinterpret_cast<T1*>(p2);
244
+ D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
245
+ d2->noinit(p2);
246
+ return boost::shared_ptr<T>(s1, p1);
247
+ }
248
+ }
249
+
250
+ #endif
@@ -0,0 +1,169 @@
1
+ /*
2
+ * Copyright (c) 2012 Glen Joseph Fernandes
3
+ * glenfe at live dot com
4
+ *
5
+ * Distributed under the Boost Software License,
6
+ * Version 1.0. (See accompanying file LICENSE_1_0.txt
7
+ * or copy at http://boost.org/LICENSE_1_0.txt)
8
+ */
9
+ #ifndef BOOST_SMART_PTR_DETAIL_ALLOCATE_ARRAY_HELPER_HPP
10
+ #define BOOST_SMART_PTR_DETAIL_ALLOCATE_ARRAY_HELPER_HPP
11
+
12
+ #include <boost/type_traits/alignment_of.hpp>
13
+
14
+ namespace boost {
15
+ namespace detail {
16
+ template<typename A, typename T, typename Y = char>
17
+ class allocate_array_helper;
18
+ template<typename A, typename T, typename Y>
19
+ class allocate_array_helper<A, T[], Y> {
20
+ template<typename A9, typename T9, typename Y9>
21
+ friend class allocate_array_helper;
22
+ typedef typename A::template rebind<Y> ::other A2;
23
+ typedef typename A::template rebind<char>::other A3;
24
+ public:
25
+ typedef typename A2::value_type value_type;
26
+ typedef typename A2::pointer pointer;
27
+ typedef typename A2::const_pointer const_pointer;
28
+ typedef typename A2::reference reference;
29
+ typedef typename A2::const_reference const_reference;
30
+ typedef typename A2::size_type size_type;
31
+ typedef typename A2::difference_type difference_type;
32
+ template<typename U>
33
+ struct rebind {
34
+ typedef allocate_array_helper<A, T[], U> other;
35
+ };
36
+ allocate_array_helper(const A& allocator_, std::size_t size_, T** data_)
37
+ : allocator(allocator_),
38
+ size(sizeof(T) * size_),
39
+ data(data_) {
40
+ }
41
+ template<class U>
42
+ allocate_array_helper(const allocate_array_helper<A, T[], U>& other)
43
+ : allocator(other.allocator),
44
+ size(other.size),
45
+ data(other.data) {
46
+ }
47
+ pointer address(reference value) const {
48
+ return allocator.address(value);
49
+ }
50
+ const_pointer address(const_reference value) const {
51
+ return allocator.address(value);
52
+ }
53
+ size_type max_size() const {
54
+ return allocator.max_size();
55
+ }
56
+ pointer allocate(size_type count, const void* value = 0) {
57
+ std::size_t a1 = boost::alignment_of<T>::value;
58
+ std::size_t n1 = count * sizeof(Y) + a1 - 1;
59
+ char* p1 = A3(allocator).allocate(n1 + size, value);
60
+ char* p2 = p1 + n1;
61
+ while (std::size_t(p2) % a1 != 0) {
62
+ p2--;
63
+ }
64
+ *data = reinterpret_cast<T*>(p2);
65
+ return reinterpret_cast<Y*>(p1);
66
+ }
67
+ void deallocate(pointer memory, size_type count) {
68
+ std::size_t a1 = boost::alignment_of<T>::value;
69
+ std::size_t n1 = count * sizeof(Y) + a1 - 1;
70
+ char* p1 = reinterpret_cast<char*>(memory);
71
+ A3(allocator).deallocate(p1, n1 + size);
72
+ }
73
+ void construct(pointer memory, const Y& value) {
74
+ allocator.construct(memory, value);
75
+ }
76
+ void destroy(pointer memory) {
77
+ allocator.destroy(memory);
78
+ }
79
+ template<typename U>
80
+ bool operator==(const allocate_array_helper<A, T[], U>& other) const {
81
+ return allocator == other.allocator;
82
+ }
83
+ template<typename U>
84
+ bool operator!=(const allocate_array_helper<A, T[], U>& other) const {
85
+ return !(*this == other);
86
+ }
87
+ private:
88
+ A2 allocator;
89
+ std::size_t size;
90
+ T** data;
91
+ };
92
+ template<typename A, typename T, std::size_t N, typename Y>
93
+ class allocate_array_helper<A, T[N], Y> {
94
+ template<typename A9, typename T9, typename Y9>
95
+ friend class allocate_array_helper;
96
+ typedef typename A::template rebind<Y> ::other A2;
97
+ typedef typename A::template rebind<char>::other A3;
98
+ public:
99
+ typedef typename A2::value_type value_type;
100
+ typedef typename A2::pointer pointer;
101
+ typedef typename A2::const_pointer const_pointer;
102
+ typedef typename A2::reference reference;
103
+ typedef typename A2::const_reference const_reference;
104
+ typedef typename A2::size_type size_type;
105
+ typedef typename A2::difference_type difference_type;
106
+ template<typename U>
107
+ struct rebind {
108
+ typedef allocate_array_helper<A, T[N], U> other;
109
+ };
110
+ allocate_array_helper(const A& allocator_, T** data_)
111
+ : allocator(allocator_),
112
+ data(data_) {
113
+ }
114
+ template<class U>
115
+ allocate_array_helper(const allocate_array_helper<A, T[N], U>& other)
116
+ : allocator(other.allocator),
117
+ data(other.data) {
118
+ }
119
+ pointer address(reference value) const {
120
+ return allocator.address(value);
121
+ }
122
+ const_pointer address(const_reference value) const {
123
+ return allocator.address(value);
124
+ }
125
+ size_type max_size() const {
126
+ return allocator.max_size();
127
+ }
128
+ pointer allocate(size_type count, const void* value = 0) {
129
+ std::size_t a1 = boost::alignment_of<T>::value;
130
+ std::size_t n1 = count * sizeof(Y) + a1 - 1;
131
+ char* p1 = A3(allocator).allocate(n1 + N1, value);
132
+ char* p2 = p1 + n1;
133
+ while (std::size_t(p2) % a1 != 0) {
134
+ p2--;
135
+ }
136
+ *data = reinterpret_cast<T*>(p2);
137
+ return reinterpret_cast<Y*>(p1);
138
+ }
139
+ void deallocate(pointer memory, size_type count) {
140
+ std::size_t a1 = boost::alignment_of<T>::value;
141
+ std::size_t n1 = count * sizeof(Y) + a1 - 1;
142
+ char* p1 = reinterpret_cast<char*>(memory);
143
+ A3(allocator).deallocate(p1, n1 + N1);
144
+ }
145
+ void construct(pointer memory, const Y& value) {
146
+ allocator.construct(memory, value);
147
+ }
148
+ void destroy(pointer memory) {
149
+ allocator.destroy(memory);
150
+ }
151
+ template<typename U>
152
+ bool operator==(const allocate_array_helper<A, T[N], U>& other) const {
153
+ return allocator == other.allocator;
154
+ }
155
+ template<typename U>
156
+ bool operator!=(const allocate_array_helper<A, T[N], U>& other) const {
157
+ return !(*this == other);
158
+ }
159
+ private:
160
+ enum {
161
+ N1 = N * sizeof(T)
162
+ };
163
+ A2 allocator;
164
+ T** data;
165
+ };
166
+ }
167
+ }
168
+
169
+ #endif