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,124 @@
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_ARRAY_DELETER_HPP
10
+ #define BOOST_SMART_PTR_DETAIL_ARRAY_DELETER_HPP
11
+
12
+ #include <boost/smart_ptr/detail/array_utility.hpp>
13
+ #include <boost/smart_ptr/detail/sp_forward.hpp>
14
+
15
+ namespace boost {
16
+ namespace detail {
17
+ template<typename T>
18
+ class array_deleter;
19
+ template<typename T>
20
+ class array_deleter<T[]> {
21
+ public:
22
+ array_deleter(std::size_t size_)
23
+ : size(size_),
24
+ object(0) {
25
+ }
26
+ ~array_deleter() {
27
+ if (object) {
28
+ array_destroy(object, size);
29
+ }
30
+ }
31
+ void init(T* memory) {
32
+ array_init(memory, size);
33
+ object = memory;
34
+ }
35
+ #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
36
+ void init(T* memory, T&& value) {
37
+ array_init_value(memory, size, sp_forward<T>(value));
38
+ object = memory;
39
+ }
40
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
41
+ template<typename... Args>
42
+ void init(T* memory, Args&&... args) {
43
+ array_init_args(memory, size, sp_forward<Args>(args)...);
44
+ object = memory;
45
+ }
46
+ #endif
47
+ #endif
48
+ void init_list(T* memory, const T* list) {
49
+ array_init_list(memory, size, list);
50
+ object = memory;
51
+ }
52
+ template<std::size_t M>
53
+ void init_list(T* memory, const T* list) {
54
+ array_init_list<T, M>(memory, size, list);
55
+ object = memory;
56
+ }
57
+ void noinit(T* memory) {
58
+ array_noinit(memory, size);
59
+ object = memory;
60
+ }
61
+ void operator()(const void*) {
62
+ if (object) {
63
+ array_destroy(object, size);
64
+ object = 0;
65
+ }
66
+ }
67
+ private:
68
+ std::size_t size;
69
+ T* object;
70
+ };
71
+ template<typename T, std::size_t N>
72
+ class array_deleter<T[N]> {
73
+ public:
74
+ array_deleter()
75
+ : object(0) {
76
+ }
77
+ ~array_deleter() {
78
+ if (object) {
79
+ array_destroy(object, N);
80
+ }
81
+ }
82
+ void init(T* memory) {
83
+ array_init(memory, N);
84
+ object = memory;
85
+ }
86
+ #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
87
+ void init(T* memory, T&& value) {
88
+ array_init_value(memory, N, sp_forward<T>(value));
89
+ object = memory;
90
+ }
91
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
92
+ template<typename... Args>
93
+ void init(T* memory, Args&&... args) {
94
+ array_init_args(memory, N, sp_forward<Args>(args)...);
95
+ object = memory;
96
+ }
97
+ #endif
98
+ #endif
99
+ void init_list(T* memory, const T* list) {
100
+ array_init_list(memory, N, list);
101
+ object = memory;
102
+ }
103
+ template<std::size_t M>
104
+ void init_list(T* memory, const T* list) {
105
+ array_init_list<T, M>(memory, N, list);
106
+ object = memory;
107
+ }
108
+ void noinit(T* memory) {
109
+ array_noinit(memory, N);
110
+ object = memory;
111
+ }
112
+ void operator()(const void*) {
113
+ if (object) {
114
+ array_destroy(object, N);
115
+ object = 0;
116
+ }
117
+ }
118
+ private:
119
+ T* object;
120
+ };
121
+ }
122
+ }
123
+
124
+ #endif
@@ -0,0 +1,53 @@
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_ARRAY_TRAITS_HPP
10
+ #define BOOST_SMART_PTR_DETAIL_ARRAY_TRAITS_HPP
11
+
12
+ #include <boost/type_traits/remove_cv.hpp>
13
+
14
+ namespace boost {
15
+ namespace detail {
16
+ template<typename T>
17
+ struct array_base {
18
+ typedef typename boost::remove_cv<T>::type type;
19
+ };
20
+ template<typename T>
21
+ struct array_base<T[]> {
22
+ typedef typename array_base<T>::type type;
23
+ };
24
+ template<typename T, std::size_t N>
25
+ struct array_base<T[N]> {
26
+ typedef typename array_base<T>::type type;
27
+ };
28
+ template<typename T>
29
+ struct array_total {
30
+ enum {
31
+ size = 1
32
+ };
33
+ };
34
+ template<typename T, std::size_t N>
35
+ struct array_total<T[N]> {
36
+ enum {
37
+ size = N * array_total<T>::size
38
+ };
39
+ };
40
+ template<typename T>
41
+ struct array_inner;
42
+ template<typename T>
43
+ struct array_inner<T[]> {
44
+ typedef T type;
45
+ };
46
+ template<typename T, std::size_t N>
47
+ struct array_inner<T[N]> {
48
+ typedef T type;
49
+ };
50
+ }
51
+ }
52
+
53
+ #endif
@@ -0,0 +1,178 @@
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_ARRAY_UTILITY_HPP
10
+ #define BOOST_SMART_PTR_DETAIL_ARRAY_UTILITY_HPP
11
+
12
+ #include <boost/config.hpp>
13
+ #include <boost/type_traits/has_trivial_constructor.hpp>
14
+ #include <boost/type_traits/has_trivial_destructor.hpp>
15
+
16
+ namespace boost {
17
+ namespace detail {
18
+ template<typename T>
19
+ inline void array_destroy(T*, std::size_t, boost::true_type) {
20
+ }
21
+ template<typename T>
22
+ inline void array_destroy(T* memory, std::size_t size, boost::false_type) {
23
+ for (std::size_t i = size; i > 0; ) {
24
+ memory[--i].~T();
25
+ }
26
+ }
27
+ template<typename T>
28
+ inline void array_destroy(T* memory, std::size_t size) {
29
+ boost::has_trivial_destructor<T> type;
30
+ array_destroy(memory, size, type);
31
+ }
32
+ template<typename T>
33
+ inline void array_init(T* memory, std::size_t size, boost::true_type) {
34
+ for (std::size_t i = 0; i < size; i++) {
35
+ memory[i] = T();
36
+ }
37
+ }
38
+ template<typename T>
39
+ inline void array_init(T* memory, std::size_t size, boost::false_type) {
40
+ #if !defined(BOOST_NO_EXCEPTIONS)
41
+ std::size_t i = 0;
42
+ try {
43
+ for (; i < size; i++) {
44
+ void* p1 = memory + i;
45
+ ::new(p1) T();
46
+ }
47
+ } catch (...) {
48
+ array_destroy(memory, i);
49
+ throw;
50
+ }
51
+ #else
52
+ for (std::size_t i = 0; i < size; i++) {
53
+ void* p1 = memory + i;
54
+ ::new(p1) T();
55
+ }
56
+ #endif
57
+ }
58
+ template<typename T>
59
+ inline void array_init(T* memory, std::size_t size) {
60
+ boost::has_trivial_default_constructor<T> type;
61
+ array_init(memory, size, type);
62
+ }
63
+ #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
64
+ template<typename T>
65
+ inline void array_init_value(T* memory, std::size_t size, T&& value) {
66
+ #if !defined(BOOST_NO_EXCEPTIONS)
67
+ std::size_t i = 0;
68
+ try {
69
+ for (; i < size; i++) {
70
+ void* p1 = memory + i;
71
+ ::new(p1) T(value);
72
+ }
73
+ } catch (...) {
74
+ array_destroy(memory, i);
75
+ throw;
76
+ }
77
+ #else
78
+ for (std::size_t i = 0; i < size; i++) {
79
+ void* p1 = memory + i;
80
+ ::new(p1) T(value);
81
+ }
82
+ #endif
83
+ }
84
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
85
+ template<typename T, typename... Args>
86
+ inline void array_init_args(T* memory, std::size_t size, Args&&... args) {
87
+ #if !defined(BOOST_NO_EXCEPTIONS)
88
+ std::size_t i = 0;
89
+ try {
90
+ for (; i < size; i++) {
91
+ void* p1 = memory + i;
92
+ ::new(p1) T(args...);
93
+ }
94
+ } catch (...) {
95
+ array_destroy(memory, i);
96
+ throw;
97
+ }
98
+ #else
99
+ for (std::size_t i = 0; i < size; i++) {
100
+ void* p1 = memory + i;
101
+ ::new(p1) T(args...);
102
+ }
103
+ #endif
104
+ }
105
+ #endif
106
+ #endif
107
+ template<typename T>
108
+ inline void array_init_list(T* memory, std::size_t size, const T* list) {
109
+ #if !defined(BOOST_NO_EXCEPTIONS)
110
+ std::size_t i = 0;
111
+ try {
112
+ for (; i < size; i++) {
113
+ void* p1 = memory + i;
114
+ ::new(p1) T(list[i]);
115
+ }
116
+ } catch (...) {
117
+ array_destroy(memory, i);
118
+ throw;
119
+ }
120
+ #else
121
+ for (std::size_t i = 0; i < size; i++) {
122
+ void* p1 = memory + i;
123
+ ::new(p1) T(list[i]);
124
+ }
125
+ #endif
126
+ }
127
+ template<typename T, std::size_t N>
128
+ inline void array_init_list(T* memory, std::size_t size, const T* list) {
129
+ #if !defined(BOOST_NO_EXCEPTIONS)
130
+ std::size_t i = 0;
131
+ try {
132
+ for (; i < size; i++) {
133
+ void* p1 = memory + i;
134
+ ::new(p1) T(list[i % N]);
135
+ }
136
+ } catch (...) {
137
+ array_destroy(memory, i);
138
+ throw;
139
+ }
140
+ #else
141
+ for (std::size_t i = 0; i < size; i++) {
142
+ void* p1 = memory + i;
143
+ ::new(p1) T(list[i % N]);
144
+ }
145
+ #endif
146
+ }
147
+ template<typename T>
148
+ inline void array_noinit(T*, std::size_t, boost::true_type) {
149
+ }
150
+ template<typename T>
151
+ inline void array_noinit(T* memory, std::size_t size, boost::false_type) {
152
+ #if !defined(BOOST_NO_EXCEPTIONS)
153
+ std::size_t i = 0;
154
+ try {
155
+ for (; i < size; i++) {
156
+ void* p1 = memory + i;
157
+ ::new(p1) T;
158
+ }
159
+ } catch (...) {
160
+ array_destroy(memory, i);
161
+ throw;
162
+ }
163
+ #else
164
+ for (std::size_t i = 0; i < size; i++) {
165
+ void* p1 = memory + i;
166
+ ::new(p1) T;
167
+ }
168
+ #endif
169
+ }
170
+ template<typename T>
171
+ inline void array_noinit(T* memory, std::size_t size) {
172
+ boost::has_trivial_default_constructor<T> type;
173
+ array_noinit(memory, size, type);
174
+ }
175
+ }
176
+ }
177
+
178
+ #endif
@@ -0,0 +1,157 @@
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_MAKE_ARRAY_HELPER_HPP
10
+ #define BOOST_SMART_PTR_DETAIL_MAKE_ARRAY_HELPER_HPP
11
+
12
+ #include <boost/type_traits/alignment_of.hpp>
13
+
14
+ namespace boost {
15
+ namespace detail {
16
+ template<typename T, typename Y = char>
17
+ class make_array_helper;
18
+ template<typename T, typename Y>
19
+ class make_array_helper<T[], Y> {
20
+ template<typename T2, typename Y2>
21
+ friend class make_array_helper;
22
+ public:
23
+ typedef Y value_type;
24
+ typedef Y* pointer;
25
+ typedef const Y* const_pointer;
26
+ typedef Y& reference;
27
+ typedef const Y& const_reference;
28
+ typedef std::size_t size_type;
29
+ typedef ptrdiff_t difference_type;
30
+ template<typename U>
31
+ struct rebind {
32
+ typedef make_array_helper<T[], U> other;
33
+ };
34
+ make_array_helper(std::size_t size_, T** data_)
35
+ : size(sizeof(T) * size_),
36
+ data(data_) {
37
+ }
38
+ template<class U>
39
+ make_array_helper(const make_array_helper<T[], U>& other)
40
+ : size(other.size),
41
+ data(other.data) {
42
+ }
43
+ pointer address(reference value) const {
44
+ return &value;
45
+ }
46
+ const_pointer address(const_reference value) const {
47
+ return &value;
48
+ }
49
+ size_type max_size() const {
50
+ return static_cast<std::size_t>(-1) / sizeof(Y);
51
+ }
52
+ pointer allocate(size_type count, const void* = 0) {
53
+ std::size_t a1 = boost::alignment_of<T>::value;
54
+ std::size_t n1 = count * sizeof(Y) + a1 - 1;
55
+ void* p1 = ::operator new(n1 + size);
56
+ char* p2 = static_cast<char*>(p1) + n1;
57
+ while (std::size_t(p2) % a1 != 0) {
58
+ p2--;
59
+ }
60
+ *data = reinterpret_cast<T*>(p2);
61
+ return reinterpret_cast<Y*>(p1);
62
+ }
63
+ void deallocate(pointer memory, size_type) {
64
+ void* p1 = memory;
65
+ ::operator delete(p1);
66
+ }
67
+ void construct(pointer memory, const Y& value) {
68
+ void* p1 = memory;
69
+ ::new(p1) Y(value);
70
+ }
71
+ void destroy(pointer memory) {
72
+ memory->~Y();
73
+ }
74
+ template<typename U>
75
+ bool operator==(const make_array_helper<T[], U>&) const {
76
+ return true;
77
+ }
78
+ template<typename U>
79
+ bool operator!=(const make_array_helper<T[], U>& other) const {
80
+ return !(*this == other);
81
+ }
82
+ private:
83
+ std::size_t size;
84
+ T** data;
85
+ };
86
+ template<typename T, std::size_t N, typename Y>
87
+ class make_array_helper<T[N], Y> {
88
+ template<typename T2, typename Y2>
89
+ friend class make_array_helper;
90
+ public:
91
+ typedef Y value_type;
92
+ typedef Y* pointer;
93
+ typedef const Y* const_pointer;
94
+ typedef Y& reference;
95
+ typedef const Y& const_reference;
96
+ typedef std::size_t size_type;
97
+ typedef ptrdiff_t difference_type;
98
+ template<typename U>
99
+ struct rebind {
100
+ typedef make_array_helper<T[N], U> other;
101
+ };
102
+ make_array_helper(T** data_)
103
+ : data(data_) {
104
+ }
105
+ template<class U>
106
+ make_array_helper(const make_array_helper<T[N], U>& other)
107
+ : data(other.data) {
108
+ }
109
+ pointer address(reference value) const {
110
+ return &value;
111
+ }
112
+ const_pointer address(const_reference value) const {
113
+ return &value;
114
+ }
115
+ size_type max_size() const {
116
+ return static_cast<std::size_t>(-1) / sizeof(Y);
117
+ }
118
+ pointer allocate(size_type count, const void* = 0) {
119
+ std::size_t a1 = boost::alignment_of<T>::value;
120
+ std::size_t n1 = count * sizeof(Y) + a1 - 1;
121
+ void* p1 = ::operator new(n1 + N1);
122
+ char* p2 = static_cast<char*>(p1) + n1;
123
+ while (std::size_t(p2) % a1 != 0) {
124
+ p2--;
125
+ }
126
+ *data = reinterpret_cast<T*>(p2);
127
+ return reinterpret_cast<Y*>(p1);
128
+ }
129
+ void deallocate(pointer memory, size_type) {
130
+ void* p1 = memory;
131
+ ::operator delete(p1);
132
+ }
133
+ void construct(pointer memory, const Y& value) {
134
+ void* p1 = memory;
135
+ ::new(p1) Y(value);
136
+ }
137
+ void destroy(pointer memory) {
138
+ memory->~Y();
139
+ }
140
+ template<typename U>
141
+ bool operator==(const make_array_helper<T[N], U>&) const {
142
+ return true;
143
+ }
144
+ template<typename U>
145
+ bool operator!=(const make_array_helper<T[N], U>& other) const {
146
+ return !(*this == other);
147
+ }
148
+ private:
149
+ enum {
150
+ N1 = N * sizeof(T)
151
+ };
152
+ T** data;
153
+ };
154
+ }
155
+ }
156
+
157
+ #endif