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,947 @@
1
+ #ifndef BOOST_ATOMIC_DETAIL_CAS32WEAK_HPP
2
+ #define BOOST_ATOMIC_DETAIL_CAS32WEAK_HPP
3
+
4
+ // Distributed under the Boost Software License, Version 1.0.
5
+ // See accompanying file LICENSE_1_0.txt or copy at
6
+ // http://www.boost.org/LICENSE_1_0.txt)
7
+ //
8
+ // Copyright (c) 2011 Helge Bahmann
9
+ // Copyright (c) 2013 Tim Blechmann
10
+
11
+
12
+ #include <cstddef>
13
+ #include <boost/cstdint.hpp>
14
+ #include <boost/memory_order.hpp>
15
+ #include <boost/atomic/detail/config.hpp>
16
+ #include <boost/atomic/detail/base.hpp>
17
+
18
+ #ifdef BOOST_ATOMIC_HAS_PRAGMA_ONCE
19
+ #pragma once
20
+ #endif
21
+
22
+ namespace boost {
23
+ namespace atomics {
24
+ namespace detail {
25
+
26
+ /* integral types */
27
+
28
+ template<typename T, bool Sign>
29
+ class base_atomic<T, int, 1, Sign>
30
+ {
31
+ typedef base_atomic this_type;
32
+ typedef T value_type;
33
+ typedef T difference_type;
34
+ typedef uint32_t storage_type;
35
+ public:
36
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
37
+ base_atomic(void) {}
38
+
39
+ void
40
+ store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
41
+ {
42
+ platform_fence_before_store(order);
43
+ const_cast<volatile storage_type &>(v_) = v;
44
+ platform_fence_after_store(order);
45
+ }
46
+
47
+ value_type
48
+ load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
49
+ {
50
+ value_type v = const_cast<const volatile storage_type &>(v_);
51
+ platform_fence_after_load(order);
52
+ return v;
53
+ }
54
+
55
+ value_type
56
+ exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
57
+ {
58
+ value_type original = load(memory_order_relaxed);
59
+ do {
60
+ } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
61
+ return original;
62
+ }
63
+
64
+ bool
65
+ compare_exchange_weak(
66
+ value_type & expected,
67
+ value_type desired,
68
+ memory_order success_order,
69
+ memory_order failure_order) volatile BOOST_NOEXCEPT
70
+ {
71
+ platform_fence_before(success_order);
72
+
73
+ storage_type expected_s = (storage_type) expected;
74
+ storage_type desired_s = (storage_type) desired;
75
+
76
+ bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
77
+
78
+ if (success) {
79
+ platform_fence_after(success_order);
80
+ } else {
81
+ platform_fence_after(failure_order);
82
+ expected = (value_type) expected_s;
83
+ }
84
+
85
+ return success;
86
+ }
87
+
88
+ bool
89
+ compare_exchange_strong(
90
+ value_type & expected,
91
+ value_type desired,
92
+ memory_order success_order,
93
+ memory_order failure_order) volatile BOOST_NOEXCEPT
94
+ {
95
+ for(;;) {
96
+ value_type tmp = expected;
97
+ if (compare_exchange_weak(tmp, desired, success_order, failure_order))
98
+ return true;
99
+ if (tmp != expected) {
100
+ expected = tmp;
101
+ return false;
102
+ }
103
+ }
104
+ }
105
+
106
+ value_type
107
+ fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
108
+ {
109
+ value_type original = load(memory_order_relaxed);
110
+ do {
111
+ } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
112
+ return original;
113
+ }
114
+
115
+ value_type
116
+ fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
117
+ {
118
+ value_type original = load(memory_order_relaxed);
119
+ do {
120
+ } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
121
+ return original;
122
+ }
123
+
124
+ value_type
125
+ fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
126
+ {
127
+ value_type original = load(memory_order_relaxed);
128
+ do {
129
+ } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
130
+ return original;
131
+ }
132
+
133
+ value_type
134
+ fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
135
+ {
136
+ value_type original = load(memory_order_relaxed);
137
+ do {
138
+ } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
139
+ return original;
140
+ }
141
+
142
+ value_type
143
+ fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
144
+ {
145
+ value_type original = load(memory_order_relaxed);
146
+ do {
147
+ } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
148
+ return original;
149
+ }
150
+
151
+ bool
152
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
153
+ {
154
+ return true;
155
+ }
156
+
157
+ BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
158
+ private:
159
+ base_atomic(const base_atomic &) /* = delete */ ;
160
+ void operator=(const base_atomic &) /* = delete */ ;
161
+ storage_type v_;
162
+ };
163
+
164
+ template<typename T, bool Sign>
165
+ class base_atomic<T, int, 2, Sign>
166
+ {
167
+ typedef base_atomic this_type;
168
+ typedef T value_type;
169
+ typedef T difference_type;
170
+ typedef uint32_t storage_type;
171
+ public:
172
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
173
+ base_atomic(void) {}
174
+
175
+ void
176
+ store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
177
+ {
178
+ platform_fence_before_store(order);
179
+ const_cast<volatile storage_type &>(v_) = v;
180
+ platform_fence_after_store(order);
181
+ }
182
+
183
+ value_type
184
+ load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
185
+ {
186
+ value_type v = const_cast<const volatile storage_type &>(v_);
187
+ platform_fence_after_load(order);
188
+ return v;
189
+ }
190
+
191
+ value_type
192
+ exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
193
+ {
194
+ value_type original = load(memory_order_relaxed);
195
+ do {
196
+ } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
197
+ return original;
198
+ }
199
+
200
+ bool
201
+ compare_exchange_weak(
202
+ value_type & expected,
203
+ value_type desired,
204
+ memory_order success_order,
205
+ memory_order failure_order) volatile BOOST_NOEXCEPT
206
+ {
207
+ platform_fence_before(success_order);
208
+
209
+ storage_type expected_s = (storage_type) expected;
210
+ storage_type desired_s = (storage_type) desired;
211
+
212
+ bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
213
+
214
+ if (success) {
215
+ platform_fence_after(success_order);
216
+ } else {
217
+ platform_fence_after(failure_order);
218
+ expected = (value_type) expected_s;
219
+ }
220
+
221
+ return success;
222
+ }
223
+
224
+ bool
225
+ compare_exchange_strong(
226
+ value_type & expected,
227
+ value_type desired,
228
+ memory_order success_order,
229
+ memory_order failure_order) volatile BOOST_NOEXCEPT
230
+ {
231
+ for(;;) {
232
+ value_type tmp = expected;
233
+ if (compare_exchange_weak(tmp, desired, success_order, failure_order))
234
+ return true;
235
+ if (tmp != expected) {
236
+ expected = tmp;
237
+ return false;
238
+ }
239
+ }
240
+ }
241
+
242
+ value_type
243
+ fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
244
+ {
245
+ value_type original = load(memory_order_relaxed);
246
+ do {
247
+ } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
248
+ return original;
249
+ }
250
+
251
+ value_type
252
+ fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
253
+ {
254
+ value_type original = load(memory_order_relaxed);
255
+ do {
256
+ } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
257
+ return original;
258
+ }
259
+
260
+ value_type
261
+ fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
262
+ {
263
+ value_type original = load(memory_order_relaxed);
264
+ do {
265
+ } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
266
+ return original;
267
+ }
268
+
269
+ value_type
270
+ fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
271
+ {
272
+ value_type original = load(memory_order_relaxed);
273
+ do {
274
+ } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
275
+ return original;
276
+ }
277
+
278
+ value_type
279
+ fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
280
+ {
281
+ value_type original = load(memory_order_relaxed);
282
+ do {
283
+ } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
284
+ return original;
285
+ }
286
+
287
+ bool
288
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
289
+ {
290
+ return true;
291
+ }
292
+
293
+ BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
294
+ private:
295
+ base_atomic(const base_atomic &) /* = delete */ ;
296
+ void operator=(const base_atomic &) /* = delete */ ;
297
+ storage_type v_;
298
+ };
299
+
300
+ template<typename T, bool Sign>
301
+ class base_atomic<T, int, 4, Sign>
302
+ {
303
+ typedef base_atomic this_type;
304
+ typedef T value_type;
305
+ typedef T difference_type;
306
+ public:
307
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
308
+ base_atomic(void) {}
309
+
310
+ void
311
+ store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
312
+ {
313
+ platform_fence_before_store(order);
314
+ const_cast<volatile value_type &>(v_) = v;
315
+ platform_fence_after_store(order);
316
+ }
317
+
318
+ value_type
319
+ load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
320
+ {
321
+ value_type v = const_cast<const volatile value_type &>(v_);
322
+ platform_fence_after_load(order);
323
+ return v;
324
+ }
325
+
326
+ value_type
327
+ exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
328
+ {
329
+ value_type original = load(memory_order_relaxed);
330
+ do {
331
+ } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
332
+ return original;
333
+ }
334
+
335
+ bool
336
+ compare_exchange_weak(
337
+ value_type & expected,
338
+ value_type desired,
339
+ memory_order success_order,
340
+ memory_order failure_order) volatile BOOST_NOEXCEPT
341
+ {
342
+ platform_fence_before(success_order);
343
+
344
+ bool success = platform_cmpxchg32(expected, desired, &v_);
345
+
346
+ if (success) {
347
+ platform_fence_after(success_order);
348
+ } else {
349
+ platform_fence_after(failure_order);
350
+ }
351
+
352
+ return success;
353
+ }
354
+
355
+ bool
356
+ compare_exchange_strong(
357
+ value_type & expected,
358
+ value_type desired,
359
+ memory_order success_order,
360
+ memory_order failure_order) volatile BOOST_NOEXCEPT
361
+ {
362
+ for(;;) {
363
+ value_type tmp = expected;
364
+ if (compare_exchange_weak(tmp, desired, success_order, failure_order))
365
+ return true;
366
+ if (tmp != expected) {
367
+ expected = tmp;
368
+ return false;
369
+ }
370
+ }
371
+ }
372
+
373
+ value_type
374
+ fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
375
+ {
376
+ value_type original = load(memory_order_relaxed);
377
+ do {
378
+ } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
379
+ return original;
380
+ }
381
+
382
+ value_type
383
+ fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
384
+ {
385
+ value_type original = load(memory_order_relaxed);
386
+ do {
387
+ } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
388
+ return original;
389
+ }
390
+
391
+ value_type
392
+ fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
393
+ {
394
+ value_type original = load(memory_order_relaxed);
395
+ do {
396
+ } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
397
+ return original;
398
+ }
399
+
400
+ value_type
401
+ fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
402
+ {
403
+ value_type original = load(memory_order_relaxed);
404
+ do {
405
+ } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
406
+ return original;
407
+ }
408
+
409
+ value_type
410
+ fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
411
+ {
412
+ value_type original = load(memory_order_relaxed);
413
+ do {
414
+ } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
415
+ return original;
416
+ }
417
+
418
+ bool
419
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
420
+ {
421
+ return true;
422
+ }
423
+
424
+ BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
425
+ private:
426
+ base_atomic(const base_atomic &) /* = delete */ ;
427
+ void operator=(const base_atomic &) /* = delete */ ;
428
+ value_type v_;
429
+ };
430
+
431
+ /* pointer types */
432
+
433
+ template<bool Sign>
434
+ class base_atomic<void *, void *, 4, Sign>
435
+ {
436
+ typedef base_atomic this_type;
437
+ typedef void * value_type;
438
+ typedef ptrdiff_t difference_type;
439
+ public:
440
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
441
+ base_atomic(void) {}
442
+
443
+ void
444
+ store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
445
+ {
446
+ platform_fence_before_store(order);
447
+ const_cast<volatile value_type &>(v_) = v;
448
+ platform_fence_after_store(order);
449
+ }
450
+
451
+ value_type
452
+ load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
453
+ {
454
+ value_type v = const_cast<const volatile value_type &>(v_);
455
+ platform_fence_after_load(order);
456
+ return v;
457
+ }
458
+
459
+ value_type
460
+ exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
461
+ {
462
+ value_type original = load(memory_order_relaxed);
463
+ do {
464
+ } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
465
+ return original;
466
+ }
467
+
468
+ bool
469
+ compare_exchange_weak(
470
+ value_type & expected,
471
+ value_type desired,
472
+ memory_order success_order,
473
+ memory_order failure_order) volatile BOOST_NOEXCEPT
474
+ {
475
+ platform_fence_before(success_order);
476
+
477
+ bool success = platform_cmpxchg32(expected, desired, &v_);
478
+
479
+ if (success) {
480
+ platform_fence_after(success_order);
481
+ } else {
482
+ platform_fence_after(failure_order);
483
+ }
484
+
485
+ return success;
486
+ }
487
+
488
+ bool
489
+ compare_exchange_strong(
490
+ value_type & expected,
491
+ value_type desired,
492
+ memory_order success_order,
493
+ memory_order failure_order) volatile BOOST_NOEXCEPT
494
+ {
495
+ for(;;) {
496
+ value_type tmp = expected;
497
+ if (compare_exchange_weak(tmp, desired, success_order, failure_order))
498
+ return true;
499
+ if (tmp != expected) {
500
+ expected = tmp;
501
+ return false;
502
+ }
503
+ }
504
+ }
505
+
506
+ bool
507
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
508
+ {
509
+ return true;
510
+ }
511
+
512
+ value_type
513
+ fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
514
+ {
515
+ value_type original = load(memory_order_relaxed);
516
+ do {
517
+ } while (!compare_exchange_weak(original, (char*)original + v, order, memory_order_relaxed));
518
+ return original;
519
+ }
520
+
521
+ value_type
522
+ fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
523
+ {
524
+ value_type original = load(memory_order_relaxed);
525
+ do {
526
+ } while (!compare_exchange_weak(original, (char*)original - v, order, memory_order_relaxed));
527
+ return original;
528
+ }
529
+
530
+ BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
531
+ private:
532
+ base_atomic(const base_atomic &) /* = delete */ ;
533
+ void operator=(const base_atomic &) /* = delete */ ;
534
+ value_type v_;
535
+ };
536
+
537
+ template<typename T, bool Sign>
538
+ class base_atomic<T *, void *, 4, Sign>
539
+ {
540
+ typedef base_atomic this_type;
541
+ typedef T * value_type;
542
+ typedef ptrdiff_t difference_type;
543
+ public:
544
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
545
+ base_atomic(void) {}
546
+
547
+ void
548
+ store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
549
+ {
550
+ platform_fence_before_store(order);
551
+ const_cast<volatile value_type &>(v_) = v;
552
+ platform_fence_after_store(order);
553
+ }
554
+
555
+ value_type
556
+ load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
557
+ {
558
+ value_type v = const_cast<const volatile value_type &>(v_);
559
+ platform_fence_after_load(order);
560
+ return v;
561
+ }
562
+
563
+ value_type
564
+ exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
565
+ {
566
+ value_type original = load(memory_order_relaxed);
567
+ do {
568
+ } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
569
+ return original;
570
+ }
571
+
572
+ bool
573
+ compare_exchange_weak(
574
+ value_type & expected,
575
+ value_type desired,
576
+ memory_order success_order,
577
+ memory_order failure_order) volatile BOOST_NOEXCEPT
578
+ {
579
+ platform_fence_before(success_order);
580
+
581
+ bool success = platform_cmpxchg32(expected, desired, &v_);
582
+
583
+ if (success) {
584
+ platform_fence_after(success_order);
585
+ } else {
586
+ platform_fence_after(failure_order);
587
+ }
588
+
589
+ return success;
590
+ }
591
+
592
+ bool
593
+ compare_exchange_strong(
594
+ value_type & expected,
595
+ value_type desired,
596
+ memory_order success_order,
597
+ memory_order failure_order) volatile BOOST_NOEXCEPT
598
+ {
599
+ for(;;) {
600
+ value_type tmp = expected;
601
+ if (compare_exchange_weak(tmp, desired, success_order, failure_order))
602
+ return true;
603
+ if (tmp != expected) {
604
+ expected = tmp;
605
+ return false;
606
+ }
607
+ }
608
+ }
609
+
610
+ value_type
611
+ fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
612
+ {
613
+ value_type original = load(memory_order_relaxed);
614
+ do {
615
+ } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
616
+ return original;
617
+ }
618
+
619
+ value_type
620
+ fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
621
+ {
622
+ value_type original = load(memory_order_relaxed);
623
+ do {
624
+ } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
625
+ return original;
626
+ }
627
+
628
+ bool
629
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
630
+ {
631
+ return true;
632
+ }
633
+
634
+ BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
635
+ private:
636
+ base_atomic(const base_atomic &) /* = delete */ ;
637
+ void operator=(const base_atomic &) /* = delete */ ;
638
+ value_type v_;
639
+ };
640
+
641
+ /* generic types */
642
+
643
+ template<typename T, bool Sign>
644
+ class base_atomic<T, void, 1, Sign>
645
+ {
646
+ typedef base_atomic this_type;
647
+ typedef T value_type;
648
+ typedef uint32_t storage_type;
649
+ public:
650
+ explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
651
+ {
652
+ memcpy(&v_, &v, sizeof(value_type));
653
+ }
654
+
655
+ base_atomic(void) {}
656
+
657
+ void
658
+ store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
659
+ {
660
+ storage_type tmp = 0;
661
+ memcpy(&tmp, &v, sizeof(value_type));
662
+ platform_fence_before_store(order);
663
+ const_cast<volatile storage_type &>(v_) = tmp;
664
+ platform_fence_after_store(order);
665
+ }
666
+
667
+ value_type
668
+ load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
669
+ {
670
+ storage_type tmp = const_cast<const volatile storage_type &>(v_);
671
+ platform_fence_after_load(order);
672
+
673
+ value_type v;
674
+ memcpy(&v, &tmp, sizeof(value_type));
675
+ return v;
676
+ }
677
+
678
+ value_type
679
+ exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
680
+ {
681
+ value_type original = load(memory_order_relaxed);
682
+ do {
683
+ } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
684
+ return original;
685
+ }
686
+
687
+ bool
688
+ compare_exchange_weak(
689
+ value_type & expected,
690
+ value_type const& desired,
691
+ memory_order success_order,
692
+ memory_order failure_order) volatile BOOST_NOEXCEPT
693
+ {
694
+ storage_type expected_s = 0, desired_s = 0;
695
+ memcpy(&expected_s, &expected, sizeof(value_type));
696
+ memcpy(&desired_s, &desired, sizeof(value_type));
697
+
698
+ platform_fence_before(success_order);
699
+
700
+ bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
701
+
702
+ if (success) {
703
+ platform_fence_after(success_order);
704
+ } else {
705
+ platform_fence_after(failure_order);
706
+ memcpy(&expected, &expected_s, sizeof(value_type));
707
+ }
708
+
709
+ return success;
710
+ }
711
+
712
+ bool
713
+ compare_exchange_strong(
714
+ value_type & expected,
715
+ value_type const& desired,
716
+ memory_order success_order,
717
+ memory_order failure_order) volatile BOOST_NOEXCEPT
718
+ {
719
+ for(;;) {
720
+ value_type tmp = expected;
721
+ if (compare_exchange_weak(tmp, desired, success_order, failure_order))
722
+ return true;
723
+ if (tmp != expected) {
724
+ expected = tmp;
725
+ return false;
726
+ }
727
+ }
728
+ }
729
+
730
+ bool
731
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
732
+ {
733
+ return true;
734
+ }
735
+
736
+ BOOST_ATOMIC_DECLARE_BASE_OPERATORS
737
+ private:
738
+ base_atomic(const base_atomic &) /* = delete */ ;
739
+ void operator=(const base_atomic &) /* = delete */ ;
740
+ storage_type v_;
741
+ };
742
+
743
+ template<typename T, bool Sign>
744
+ class base_atomic<T, void, 2, Sign>
745
+ {
746
+ typedef base_atomic this_type;
747
+ typedef T value_type;
748
+ typedef uint32_t storage_type;
749
+ public:
750
+ explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
751
+ {
752
+ memcpy(&v_, &v, sizeof(value_type));
753
+ }
754
+
755
+ base_atomic(void) {}
756
+
757
+ void
758
+ store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
759
+ {
760
+ storage_type tmp = 0;
761
+ memcpy(&tmp, &v, sizeof(value_type));
762
+ platform_fence_before_store(order);
763
+ const_cast<volatile storage_type &>(v_) = tmp;
764
+ platform_fence_after_store(order);
765
+ }
766
+
767
+ value_type
768
+ load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
769
+ {
770
+ storage_type tmp = const_cast<const volatile storage_type &>(v_);
771
+ platform_fence_after_load(order);
772
+
773
+ value_type v;
774
+ memcpy(&v, &tmp, sizeof(value_type));
775
+ return v;
776
+ }
777
+
778
+ value_type
779
+ exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
780
+ {
781
+ value_type original = load(memory_order_relaxed);
782
+ do {
783
+ } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
784
+ return original;
785
+ }
786
+
787
+ bool
788
+ compare_exchange_weak(
789
+ value_type & expected,
790
+ value_type const& desired,
791
+ memory_order success_order,
792
+ memory_order failure_order) volatile BOOST_NOEXCEPT
793
+ {
794
+ storage_type expected_s = 0, desired_s = 0;
795
+ memcpy(&expected_s, &expected, sizeof(value_type));
796
+ memcpy(&desired_s, &desired, sizeof(value_type));
797
+
798
+ platform_fence_before(success_order);
799
+
800
+ bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
801
+
802
+ if (success) {
803
+ platform_fence_after(success_order);
804
+ } else {
805
+ platform_fence_after(failure_order);
806
+ memcpy(&expected, &expected_s, sizeof(value_type));
807
+ }
808
+
809
+ return success;
810
+ }
811
+
812
+ bool
813
+ compare_exchange_strong(
814
+ value_type & expected,
815
+ value_type const& desired,
816
+ memory_order success_order,
817
+ memory_order failure_order) volatile BOOST_NOEXCEPT
818
+ {
819
+ for(;;) {
820
+ value_type tmp = expected;
821
+ if (compare_exchange_weak(tmp, desired, success_order, failure_order))
822
+ return true;
823
+ if (tmp != expected) {
824
+ expected = tmp;
825
+ return false;
826
+ }
827
+ }
828
+ }
829
+
830
+ bool
831
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
832
+ {
833
+ return true;
834
+ }
835
+
836
+ BOOST_ATOMIC_DECLARE_BASE_OPERATORS
837
+ private:
838
+ base_atomic(const base_atomic &) /* = delete */ ;
839
+ void operator=(const base_atomic &) /* = delete */ ;
840
+ storage_type v_;
841
+ };
842
+
843
+ template<typename T, bool Sign>
844
+ class base_atomic<T, void, 4, Sign>
845
+ {
846
+ typedef base_atomic this_type;
847
+ typedef T value_type;
848
+ typedef uint32_t storage_type;
849
+ public:
850
+ explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
851
+ {
852
+ memcpy(&v_, &v, sizeof(value_type));
853
+ }
854
+
855
+ base_atomic(void) {}
856
+
857
+ void
858
+ store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
859
+ {
860
+ storage_type tmp = 0;
861
+ memcpy(&tmp, &v, sizeof(value_type));
862
+ platform_fence_before_store(order);
863
+ const_cast<volatile storage_type &>(v_) = tmp;
864
+ platform_fence_after_store(order);
865
+ }
866
+
867
+ value_type
868
+ load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
869
+ {
870
+ storage_type tmp = const_cast<const volatile storage_type &>(v_);
871
+ platform_fence_after_load(order);
872
+
873
+ value_type v;
874
+ memcpy(&v, &tmp, sizeof(value_type));
875
+ return v;
876
+ }
877
+
878
+ value_type
879
+ exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
880
+ {
881
+ value_type original = load(memory_order_relaxed);
882
+ do {
883
+ } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
884
+ return original;
885
+ }
886
+
887
+ bool
888
+ compare_exchange_weak(
889
+ value_type & expected,
890
+ value_type const& desired,
891
+ memory_order success_order,
892
+ memory_order failure_order) volatile BOOST_NOEXCEPT
893
+ {
894
+ storage_type expected_s = 0, desired_s = 0;
895
+ memcpy(&expected_s, &expected, sizeof(value_type));
896
+ memcpy(&desired_s, &desired, sizeof(value_type));
897
+
898
+ platform_fence_before(success_order);
899
+
900
+ bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
901
+
902
+ if (success) {
903
+ platform_fence_after(success_order);
904
+ } else {
905
+ platform_fence_after(failure_order);
906
+ memcpy(&expected, &expected_s, sizeof(value_type));
907
+ }
908
+
909
+ return success;
910
+ }
911
+
912
+ bool
913
+ compare_exchange_strong(
914
+ value_type & expected,
915
+ value_type const& desired,
916
+ memory_order success_order,
917
+ memory_order failure_order) volatile BOOST_NOEXCEPT
918
+ {
919
+ for(;;) {
920
+ value_type tmp = expected;
921
+ if (compare_exchange_weak(tmp, desired, success_order, failure_order))
922
+ return true;
923
+ if (tmp != expected) {
924
+ expected = tmp;
925
+ return false;
926
+ }
927
+ }
928
+ }
929
+
930
+ bool
931
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
932
+ {
933
+ return true;
934
+ }
935
+
936
+ BOOST_ATOMIC_DECLARE_BASE_OPERATORS
937
+ private:
938
+ base_atomic(const base_atomic &) /* = delete */ ;
939
+ void operator=(const base_atomic &) /* = delete */ ;
940
+ storage_type v_;
941
+ };
942
+
943
+ }
944
+ }
945
+ }
946
+
947
+ #endif