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