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,1259 @@
1
+ #ifndef BOOST_ATOMIC_DETAIL_GCC_SPARC_HPP
2
+ #define BOOST_ATOMIC_DETAIL_GCC_SPARC_HPP
3
+
4
+ // Copyright (c) 2010 Helge Bahmann
5
+ // Copyright (c) 2013 Tim Blechmann
6
+ //
7
+ // Distributed under the Boost Software License, Version 1.0.
8
+ // See accompanying file LICENSE_1_0.txt or copy at
9
+ // http://www.boost.org/LICENSE_1_0.txt)
10
+
11
+ #include <cstddef>
12
+ #include <boost/cstdint.hpp>
13
+ #include <boost/atomic/detail/config.hpp>
14
+
15
+ #ifdef BOOST_ATOMIC_HAS_PRAGMA_ONCE
16
+ #pragma once
17
+ #endif
18
+
19
+ namespace boost {
20
+ namespace atomics {
21
+ namespace detail {
22
+
23
+ inline void
24
+ platform_fence_before(memory_order order)
25
+ {
26
+ switch(order) {
27
+ case memory_order_relaxed:
28
+ case memory_order_acquire:
29
+ case memory_order_consume:
30
+ break;
31
+ case memory_order_release:
32
+ case memory_order_acq_rel:
33
+ __asm__ __volatile__ ("membar #StoreStore | #LoadStore" ::: "memory");
34
+ /* release */
35
+ break;
36
+ case memory_order_seq_cst:
37
+ __asm__ __volatile__ ("membar #Sync" ::: "memory");
38
+ /* seq */
39
+ break;
40
+ }
41
+ }
42
+
43
+ inline void
44
+ platform_fence_after(memory_order order)
45
+ {
46
+ switch(order) {
47
+ case memory_order_relaxed:
48
+ case memory_order_release:
49
+ break;
50
+ case memory_order_acquire:
51
+ case memory_order_acq_rel:
52
+ __asm__ __volatile__ ("membar #LoadLoad | #LoadStore" ::: "memory");
53
+ /* acquire */
54
+ break;
55
+ case memory_order_consume:
56
+ /* consume */
57
+ break;
58
+ case memory_order_seq_cst:
59
+ __asm__ __volatile__ ("membar #Sync" ::: "memory");
60
+ /* seq */
61
+ break;
62
+ default:;
63
+ }
64
+ }
65
+
66
+ inline void
67
+ platform_fence_after_store(memory_order order)
68
+ {
69
+ switch(order) {
70
+ case memory_order_seq_cst:
71
+ __asm__ __volatile__ ("membar #Sync" ::: "memory");
72
+ default:;
73
+ }
74
+ }
75
+
76
+
77
+ inline void
78
+ platform_fence_after_load(memory_order order)
79
+ {
80
+ platform_fence_after(order);
81
+ }
82
+
83
+ }
84
+ }
85
+
86
+ class atomic_flag
87
+ {
88
+ private:
89
+ atomic_flag(const atomic_flag &) /* = delete */ ;
90
+ atomic_flag & operator=(const atomic_flag &) /* = delete */ ;
91
+ uint32_t v_;
92
+ public:
93
+ BOOST_CONSTEXPR atomic_flag(void) BOOST_NOEXCEPT : v_(0) {}
94
+
95
+ void
96
+ clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
97
+ {
98
+ atomics::detail::platform_fence_before(order);
99
+ const_cast<volatile uint32_t &>(v_) = 0;
100
+ atomics::detail::platform_fence_after_store(order);
101
+ }
102
+
103
+ bool
104
+ test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
105
+ {
106
+ atomics::detail::platform_fence_before(order);
107
+ uint32_t tmp = 1;
108
+ __asm__ (
109
+ "cas [%1], %2, %0"
110
+ : "+r" (tmp)
111
+ : "r" (&v_), "r" (0)
112
+ : "memory"
113
+ );
114
+ atomics::detail::platform_fence_after(order);
115
+ return tmp;
116
+ }
117
+ };
118
+
119
+ } /* namespace boost */
120
+
121
+ #define BOOST_ATOMIC_FLAG_LOCK_FREE 2
122
+
123
+ #include <boost/atomic/detail/base.hpp>
124
+
125
+ #if !defined(BOOST_ATOMIC_FORCE_FALLBACK)
126
+
127
+ #define BOOST_ATOMIC_CHAR_LOCK_FREE 2
128
+ #define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2
129
+ #define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2
130
+ #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
131
+ #define BOOST_ATOMIC_SHORT_LOCK_FREE 2
132
+ #define BOOST_ATOMIC_INT_LOCK_FREE 2
133
+ #define BOOST_ATOMIC_LONG_LOCK_FREE 2
134
+ #define BOOST_ATOMIC_LLONG_LOCK_FREE 0
135
+ #define BOOST_ATOMIC_POINTER_LOCK_FREE 2
136
+ #define BOOST_ATOMIC_BOOL_LOCK_FREE 2
137
+
138
+ namespace boost {
139
+
140
+ #define BOOST_ATOMIC_THREAD_FENCE 2
141
+ inline void
142
+ atomic_thread_fence(memory_order order)
143
+ {
144
+ switch(order) {
145
+ case memory_order_relaxed:
146
+ break;
147
+ case memory_order_release:
148
+ __asm__ __volatile__ ("membar #StoreStore | #LoadStore" ::: "memory");
149
+ break;
150
+ case memory_order_acquire:
151
+ __asm__ __volatile__ ("membar #LoadLoad | #LoadStore" ::: "memory");
152
+ break;
153
+ case memory_order_acq_rel:
154
+ __asm__ __volatile__ ("membar #LoadLoad | #LoadStore | #StoreStore" ::: "memory");
155
+ break;
156
+ case memory_order_consume:
157
+ break;
158
+ case memory_order_seq_cst:
159
+ __asm__ __volatile__ ("membar #Sync" ::: "memory");
160
+ break;
161
+ default:;
162
+ }
163
+ }
164
+
165
+ #define BOOST_ATOMIC_SIGNAL_FENCE 2
166
+ inline void
167
+ atomic_signal_fence(memory_order)
168
+ {
169
+ __asm__ __volatile__ ("" ::: "memory");
170
+ }
171
+
172
+ namespace atomics {
173
+ namespace detail {
174
+
175
+ /* integral types */
176
+
177
+ template<typename T>
178
+ class base_atomic<T, int, 1, true>
179
+ {
180
+ typedef base_atomic this_type;
181
+ typedef T value_type;
182
+ typedef T difference_type;
183
+ typedef int32_t storage_type;
184
+ public:
185
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
186
+ base_atomic(void) {}
187
+
188
+ void
189
+ store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
190
+ {
191
+ platform_fence_before(order);
192
+ const_cast<volatile storage_type &>(v_) = v;
193
+ platform_fence_after_store(order);
194
+ }
195
+
196
+ value_type
197
+ load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
198
+ {
199
+ value_type v = const_cast<const volatile storage_type &>(v_);
200
+ platform_fence_after_load(order);
201
+ return v;
202
+ }
203
+
204
+ value_type
205
+ fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
206
+ {
207
+ value_type tmp = load(memory_order_relaxed);
208
+ do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
209
+ return tmp;
210
+ }
211
+
212
+ value_type
213
+ fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
214
+ {
215
+ value_type tmp = load(memory_order_relaxed);
216
+ do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
217
+ return tmp;
218
+ }
219
+
220
+ value_type
221
+ exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
222
+ {
223
+ value_type tmp = load(memory_order_relaxed);
224
+ do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
225
+ return tmp;
226
+ }
227
+
228
+ bool
229
+ compare_exchange_strong(
230
+ value_type & expected,
231
+ value_type desired,
232
+ memory_order success_order,
233
+ memory_order failure_order) volatile BOOST_NOEXCEPT
234
+ {
235
+ platform_fence_before(success_order);
236
+ storage_type desired_s = desired;
237
+ __asm__ (
238
+ "cas [%1], %2, %0"
239
+ : "+r" (desired_s)
240
+ : "r" (&v_), "r" ((storage_type)expected)
241
+ : "memory"
242
+ );
243
+ desired = desired_s;
244
+ bool success = (desired == expected);
245
+ if (success)
246
+ platform_fence_after(success_order);
247
+ else
248
+ platform_fence_after(failure_order);
249
+ expected = desired;
250
+ return success;
251
+ }
252
+
253
+ bool
254
+ compare_exchange_weak(
255
+ value_type & expected,
256
+ value_type desired,
257
+ memory_order success_order,
258
+ memory_order failure_order) volatile BOOST_NOEXCEPT
259
+ {
260
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
261
+ }
262
+
263
+ value_type
264
+ fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
265
+ {
266
+ value_type tmp = load(memory_order_relaxed);
267
+ do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
268
+ return tmp;
269
+ }
270
+
271
+ value_type
272
+ fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
273
+ {
274
+ value_type tmp = load(memory_order_relaxed);
275
+ do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
276
+ return tmp;
277
+ }
278
+
279
+ value_type
280
+ fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
281
+ {
282
+ value_type tmp = load(memory_order_relaxed);
283
+ do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
284
+ return tmp;
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>
301
+ class base_atomic<T, int, 1, false>
302
+ {
303
+ typedef base_atomic this_type;
304
+ typedef T value_type;
305
+ typedef T difference_type;
306
+ typedef uint32_t storage_type;
307
+ public:
308
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
309
+ base_atomic(void) {}
310
+
311
+ void
312
+ store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
313
+ {
314
+ platform_fence_before(order);
315
+ const_cast<volatile storage_type &>(v_) = v;
316
+ platform_fence_after_store(order);
317
+ }
318
+
319
+ value_type
320
+ load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
321
+ {
322
+ value_type v = const_cast<const volatile storage_type &>(v_);
323
+ platform_fence_after_load(order);
324
+ return v;
325
+ }
326
+
327
+ value_type
328
+ fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
329
+ {
330
+ value_type tmp = load(memory_order_relaxed);
331
+ do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
332
+ return tmp;
333
+ }
334
+
335
+ value_type
336
+ fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
337
+ {
338
+ value_type tmp = load(memory_order_relaxed);
339
+ do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
340
+ return tmp;
341
+ }
342
+
343
+ value_type
344
+ exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
345
+ {
346
+ value_type tmp = load(memory_order_relaxed);
347
+ do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
348
+ return tmp;
349
+ }
350
+
351
+ bool
352
+ compare_exchange_strong(
353
+ value_type & expected,
354
+ value_type desired,
355
+ memory_order success_order,
356
+ memory_order failure_order) volatile BOOST_NOEXCEPT
357
+ {
358
+ platform_fence_before(success_order);
359
+ storage_type desired_s = desired;
360
+ __asm__ (
361
+ "cas [%1], %2, %0"
362
+ : "+r" (desired_s)
363
+ : "r" (&v_), "r" ((storage_type)expected)
364
+ : "memory"
365
+ );
366
+ desired = desired_s;
367
+ bool success = (desired == expected);
368
+ if (success)
369
+ platform_fence_after(success_order);
370
+ else
371
+ platform_fence_after(failure_order);
372
+ expected = desired;
373
+ return success;
374
+ }
375
+
376
+ bool
377
+ compare_exchange_weak(
378
+ value_type & expected,
379
+ value_type desired,
380
+ memory_order success_order,
381
+ memory_order failure_order) volatile BOOST_NOEXCEPT
382
+ {
383
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
384
+ }
385
+
386
+ value_type
387
+ fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
388
+ {
389
+ value_type tmp = load(memory_order_relaxed);
390
+ do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
391
+ return tmp;
392
+ }
393
+
394
+ value_type
395
+ fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
396
+ {
397
+ value_type tmp = load(memory_order_relaxed);
398
+ do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
399
+ return tmp;
400
+ }
401
+
402
+ value_type
403
+ fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
404
+ {
405
+ value_type tmp = load(memory_order_relaxed);
406
+ do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
407
+ return tmp;
408
+ }
409
+
410
+ bool
411
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
412
+ {
413
+ return true;
414
+ }
415
+
416
+ BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
417
+ private:
418
+ base_atomic(const base_atomic &) /* = delete */ ;
419
+ void operator=(const base_atomic &) /* = delete */ ;
420
+ storage_type v_;
421
+ };
422
+
423
+ template<typename T>
424
+ class base_atomic<T, int, 2, true>
425
+ {
426
+ typedef base_atomic this_type;
427
+ typedef T value_type;
428
+ typedef T difference_type;
429
+ typedef int32_t storage_type;
430
+ public:
431
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
432
+ base_atomic(void) {}
433
+
434
+ void
435
+ store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
436
+ {
437
+ platform_fence_before(order);
438
+ const_cast<volatile storage_type &>(v_) = v;
439
+ platform_fence_after_store(order);
440
+ }
441
+
442
+ value_type
443
+ load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
444
+ {
445
+ value_type v = const_cast<const volatile storage_type &>(v_);
446
+ platform_fence_after_load(order);
447
+ return v;
448
+ }
449
+
450
+ value_type
451
+ fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
452
+ {
453
+ value_type tmp = load(memory_order_relaxed);
454
+ do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
455
+ return tmp;
456
+ }
457
+
458
+ value_type
459
+ fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
460
+ {
461
+ value_type tmp = load(memory_order_relaxed);
462
+ do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
463
+ return tmp;
464
+ }
465
+
466
+ value_type
467
+ exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
468
+ {
469
+ value_type tmp = load(memory_order_relaxed);
470
+ do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
471
+ return tmp;
472
+ }
473
+
474
+ bool
475
+ compare_exchange_strong(
476
+ value_type & expected,
477
+ value_type desired,
478
+ memory_order success_order,
479
+ memory_order failure_order) volatile BOOST_NOEXCEPT
480
+ {
481
+ platform_fence_before(success_order);
482
+ storage_type desired_s = desired;
483
+ __asm__ (
484
+ "cas [%1], %2, %0"
485
+ : "+r" (desired_s)
486
+ : "r" (&v_), "r" ((storage_type)expected)
487
+ : "memory"
488
+ );
489
+ desired = desired_s;
490
+ bool success = (desired == expected);
491
+ if (success)
492
+ platform_fence_after(success_order);
493
+ else
494
+ platform_fence_after(failure_order);
495
+ expected = desired;
496
+ return success;
497
+ }
498
+
499
+ bool
500
+ compare_exchange_weak(
501
+ value_type & expected,
502
+ value_type desired,
503
+ memory_order success_order,
504
+ memory_order failure_order) volatile BOOST_NOEXCEPT
505
+ {
506
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
507
+ }
508
+
509
+ value_type
510
+ fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
511
+ {
512
+ value_type tmp = load(memory_order_relaxed);
513
+ do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
514
+ return tmp;
515
+ }
516
+
517
+ value_type
518
+ fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
519
+ {
520
+ value_type tmp = load(memory_order_relaxed);
521
+ do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
522
+ return tmp;
523
+ }
524
+
525
+ value_type
526
+ fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
527
+ {
528
+ value_type tmp = load(memory_order_relaxed);
529
+ do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
530
+ return tmp;
531
+ }
532
+
533
+ bool
534
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
535
+ {
536
+ return true;
537
+ }
538
+
539
+ BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
540
+ private:
541
+ base_atomic(const base_atomic &) /* = delete */ ;
542
+ void operator=(const base_atomic &) /* = delete */ ;
543
+ storage_type v_;
544
+ };
545
+
546
+ template<typename T>
547
+ class base_atomic<T, int, 2, false>
548
+ {
549
+ typedef base_atomic this_type;
550
+ typedef T value_type;
551
+ typedef T difference_type;
552
+ typedef uint32_t storage_type;
553
+ public:
554
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
555
+ base_atomic(void) {}
556
+
557
+ void
558
+ store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
559
+ {
560
+ platform_fence_before(order);
561
+ const_cast<volatile storage_type &>(v_) = v;
562
+ platform_fence_after_store(order);
563
+ }
564
+
565
+ value_type
566
+ load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
567
+ {
568
+ value_type v = const_cast<const volatile storage_type &>(v_);
569
+ platform_fence_after_load(order);
570
+ return v;
571
+ }
572
+
573
+ value_type
574
+ fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
575
+ {
576
+ value_type tmp = load(memory_order_relaxed);
577
+ do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
578
+ return tmp;
579
+ }
580
+
581
+ value_type
582
+ fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
583
+ {
584
+ value_type tmp = load(memory_order_relaxed);
585
+ do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
586
+ return tmp;
587
+ }
588
+
589
+ value_type
590
+ exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
591
+ {
592
+ value_type tmp = load(memory_order_relaxed);
593
+ do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
594
+ return tmp;
595
+ }
596
+
597
+ bool
598
+ compare_exchange_strong(
599
+ value_type & expected,
600
+ value_type desired,
601
+ memory_order success_order,
602
+ memory_order failure_order) volatile BOOST_NOEXCEPT
603
+ {
604
+ platform_fence_before(success_order);
605
+ storage_type desired_s = desired;
606
+ __asm__ (
607
+ "cas [%1], %2, %0"
608
+ : "+r" (desired_s)
609
+ : "r" (&v_), "r" ((storage_type)expected)
610
+ : "memory"
611
+ );
612
+ desired = desired_s;
613
+ bool success = (desired == expected);
614
+ if (success)
615
+ platform_fence_after(success_order);
616
+ else
617
+ platform_fence_after(failure_order);
618
+ expected = desired;
619
+ return success;
620
+ }
621
+
622
+ bool
623
+ compare_exchange_weak(
624
+ value_type & expected,
625
+ value_type desired,
626
+ memory_order success_order,
627
+ memory_order failure_order) volatile BOOST_NOEXCEPT
628
+ {
629
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
630
+ }
631
+
632
+ value_type
633
+ fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
634
+ {
635
+ value_type tmp = load(memory_order_relaxed);
636
+ do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
637
+ return tmp;
638
+ }
639
+
640
+ value_type
641
+ fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
642
+ {
643
+ value_type tmp = load(memory_order_relaxed);
644
+ do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
645
+ return tmp;
646
+ }
647
+
648
+ value_type
649
+ fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
650
+ {
651
+ value_type tmp = load(memory_order_relaxed);
652
+ do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
653
+ return tmp;
654
+ }
655
+
656
+ bool
657
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
658
+ {
659
+ return true;
660
+ }
661
+
662
+ BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
663
+ private:
664
+ base_atomic(const base_atomic &) /* = delete */ ;
665
+ void operator=(const base_atomic &) /* = delete */ ;
666
+ storage_type v_;
667
+ };
668
+
669
+ template<typename T, bool Sign>
670
+ class base_atomic<T, int, 4, Sign>
671
+ {
672
+ typedef base_atomic this_type;
673
+ typedef T value_type;
674
+ typedef T difference_type;
675
+ public:
676
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
677
+ base_atomic(void) {}
678
+
679
+ void
680
+ store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
681
+ {
682
+ platform_fence_before(order);
683
+ const_cast<volatile value_type &>(v_) = v;
684
+ platform_fence_after_store(order);
685
+ }
686
+
687
+ value_type
688
+ load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
689
+ {
690
+ value_type v = const_cast<const volatile value_type &>(v_);
691
+ platform_fence_after_load(order);
692
+ return v;
693
+ }
694
+
695
+ value_type
696
+ fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
697
+ {
698
+ value_type tmp = load(memory_order_relaxed);
699
+ do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
700
+ return tmp;
701
+ }
702
+
703
+ value_type
704
+ fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
705
+ {
706
+ value_type tmp = load(memory_order_relaxed);
707
+ do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
708
+ return tmp;
709
+ }
710
+
711
+ value_type
712
+ exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
713
+ {
714
+ value_type tmp = load(memory_order_relaxed);
715
+ do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
716
+ return tmp;
717
+ }
718
+
719
+ bool
720
+ compare_exchange_strong(
721
+ value_type & expected,
722
+ value_type desired,
723
+ memory_order success_order,
724
+ memory_order failure_order) volatile BOOST_NOEXCEPT
725
+ {
726
+ platform_fence_before(success_order);
727
+ __asm__ (
728
+ "cas [%1], %2, %0"
729
+ : "+r" (desired)
730
+ : "r" (&v_), "r" (expected)
731
+ : "memory"
732
+ );
733
+ bool success = (desired == expected);
734
+ if (success)
735
+ platform_fence_after(success_order);
736
+ else
737
+ platform_fence_after(failure_order);
738
+ expected = desired;
739
+ return success;
740
+ }
741
+
742
+ bool
743
+ compare_exchange_weak(
744
+ value_type & expected,
745
+ value_type desired,
746
+ memory_order success_order,
747
+ memory_order failure_order) volatile BOOST_NOEXCEPT
748
+ {
749
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
750
+ }
751
+
752
+ value_type
753
+ fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
754
+ {
755
+ value_type tmp = load(memory_order_relaxed);
756
+ do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
757
+ return tmp;
758
+ }
759
+
760
+ value_type
761
+ fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
762
+ {
763
+ value_type tmp = load(memory_order_relaxed);
764
+ do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
765
+ return tmp;
766
+ }
767
+
768
+ value_type
769
+ fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
770
+ {
771
+ value_type tmp = load(memory_order_relaxed);
772
+ do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
773
+ return tmp;
774
+ }
775
+
776
+ bool
777
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
778
+ {
779
+ return true;
780
+ }
781
+
782
+ BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
783
+ private:
784
+ base_atomic(const base_atomic &) /* = delete */ ;
785
+ void operator=(const base_atomic &) /* = delete */ ;
786
+ value_type v_;
787
+ };
788
+
789
+ /* pointer types */
790
+
791
+ template<bool Sign>
792
+ class base_atomic<void *, void *, 4, Sign>
793
+ {
794
+ typedef base_atomic this_type;
795
+ typedef ptrdiff_t difference_type;
796
+ typedef void * value_type;
797
+ public:
798
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
799
+ base_atomic(void) {}
800
+
801
+ void
802
+ store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
803
+ {
804
+ platform_fence_before(order);
805
+ const_cast<volatile value_type &>(v_) = v;
806
+ platform_fence_after_store(order);
807
+ }
808
+
809
+ value_type load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
810
+ {
811
+ value_type v = const_cast<const volatile value_type &>(v_);
812
+ platform_fence_after_load(order);
813
+ return v;
814
+ }
815
+
816
+ value_type
817
+ exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
818
+ {
819
+ value_type tmp = load(memory_order_relaxed);
820
+ do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
821
+ return tmp;
822
+ }
823
+
824
+ bool
825
+ compare_exchange_strong(
826
+ value_type & expected,
827
+ value_type desired,
828
+ memory_order success_order,
829
+ memory_order failure_order) volatile BOOST_NOEXCEPT
830
+ {
831
+ platform_fence_before(success_order);
832
+ __asm__ (
833
+ "cas [%1], %2, %0"
834
+ : "+r" (desired)
835
+ : "r" (&v_), "r" (expected)
836
+ : "memory"
837
+ );
838
+ bool success = (desired == expected);
839
+ if (success)
840
+ platform_fence_after(success_order);
841
+ else
842
+ platform_fence_after(failure_order);
843
+ expected = desired;
844
+ return success;
845
+ }
846
+
847
+
848
+ bool compare_exchange_weak(value_type & expected, value_type desired,
849
+ memory_order success_order,
850
+ memory_order failure_order) volatile BOOST_NOEXCEPT
851
+ {
852
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
853
+ }
854
+
855
+ bool
856
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
857
+ {
858
+ return true;
859
+ }
860
+
861
+ value_type
862
+ fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
863
+ {
864
+ value_type tmp = load(memory_order_relaxed);
865
+ do {} while(!compare_exchange_weak(tmp, (char*)tmp + v, order, memory_order_relaxed));
866
+ return tmp;
867
+ }
868
+
869
+ value_type
870
+ fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
871
+ {
872
+ value_type tmp = load(memory_order_relaxed);
873
+ do {} while(!compare_exchange_weak(tmp, (char*)tmp - v, order, memory_order_relaxed));
874
+ return tmp;
875
+ }
876
+
877
+ BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
878
+
879
+ private:
880
+ base_atomic(const base_atomic &) /* = delete */ ;
881
+ void operator=(const base_atomic &) /* = delete */ ;
882
+ value_type v_;
883
+ };
884
+
885
+ template<typename T, bool Sign>
886
+ class base_atomic<T *, void *, 4, Sign>
887
+ {
888
+ typedef base_atomic this_type;
889
+ typedef T * value_type;
890
+ typedef ptrdiff_t difference_type;
891
+ public:
892
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
893
+ base_atomic(void) {}
894
+
895
+ void
896
+ store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
897
+ {
898
+ platform_fence_before(order);
899
+ const_cast<volatile value_type &>(v_) = v;
900
+ platform_fence_after_store(order);
901
+ }
902
+
903
+ value_type
904
+ load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
905
+ {
906
+ value_type v = const_cast<const volatile value_type &>(v_);
907
+ platform_fence_after_load(order);
908
+ return v;
909
+ }
910
+
911
+ value_type
912
+ exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
913
+ {
914
+ value_type tmp = load(memory_order_relaxed);
915
+ do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
916
+ return tmp;
917
+ }
918
+
919
+ bool
920
+ compare_exchange_strong(
921
+ value_type & expected,
922
+ value_type desired,
923
+ memory_order success_order,
924
+ memory_order failure_order) volatile BOOST_NOEXCEPT
925
+ {
926
+ platform_fence_before(success_order);
927
+ __asm__ (
928
+ "cas [%1], %2, %0"
929
+ : "+r" (desired)
930
+ : "r" (&v_), "r" (expected)
931
+ : "memory"
932
+ );
933
+ bool success = (desired == expected);
934
+ if (success)
935
+ platform_fence_after(success_order);
936
+ else
937
+ platform_fence_after(failure_order);
938
+ expected = desired;
939
+ return success;
940
+ }
941
+
942
+ bool
943
+ compare_exchange_weak(
944
+ value_type & expected,
945
+ value_type desired,
946
+ memory_order success_order,
947
+ memory_order failure_order) volatile BOOST_NOEXCEPT
948
+ {
949
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
950
+ }
951
+
952
+ value_type
953
+ fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
954
+ {
955
+ value_type tmp = load(memory_order_relaxed);
956
+ do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
957
+ return tmp;
958
+ }
959
+
960
+ value_type
961
+ fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
962
+ {
963
+ value_type tmp = load(memory_order_relaxed);
964
+ do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
965
+ return tmp;
966
+ }
967
+
968
+ bool
969
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
970
+ {
971
+ return true;
972
+ }
973
+
974
+ BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
975
+ private:
976
+ base_atomic(const base_atomic &) /* = delete */ ;
977
+ void operator=(const base_atomic &) /* = delete */ ;
978
+ value_type v_;
979
+ };
980
+
981
+ /* generic types */
982
+
983
+ template<typename T, bool Sign>
984
+ class base_atomic<T, void, 1, Sign>
985
+ {
986
+ typedef base_atomic this_type;
987
+ typedef T value_type;
988
+ typedef uint32_t storage_type;
989
+ public:
990
+ BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
991
+ {
992
+ memcpy(&v_, &v, sizeof(value_type));
993
+ }
994
+ base_atomic(void) {}
995
+
996
+ void
997
+ store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
998
+ {
999
+ storage_type tmp = 0;
1000
+ memcpy(&tmp, &v, sizeof(value_type));
1001
+ platform_fence_before(order);
1002
+ const_cast<volatile storage_type &>(v_) = tmp;
1003
+ platform_fence_after_store(order);
1004
+ }
1005
+
1006
+ value_type
1007
+ load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
1008
+ {
1009
+ storage_type tmp = const_cast<volatile storage_type &>(v_);
1010
+ platform_fence_after_load(order);
1011
+ value_type v;
1012
+ memcpy(&v, &tmp, sizeof(value_type));
1013
+ return v;
1014
+ }
1015
+
1016
+ value_type
1017
+ exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1018
+ {
1019
+ value_type tmp = load(memory_order_relaxed);
1020
+ do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
1021
+ return tmp;
1022
+ }
1023
+
1024
+ bool
1025
+ compare_exchange_strong(
1026
+ value_type & expected,
1027
+ value_type const& desired,
1028
+ memory_order success_order,
1029
+ memory_order failure_order) volatile BOOST_NOEXCEPT
1030
+ {
1031
+ storage_type expected_s = 0, desired_s = 0;
1032
+ memcpy(&expected_s, &expected, sizeof(value_type));
1033
+ memcpy(&desired_s, &desired, sizeof(value_type));
1034
+ platform_fence_before(success_order);
1035
+ __asm__ (
1036
+ "cas [%1], %2, %0"
1037
+ : "+r" (desired_s)
1038
+ : "r" (&v_), "r" (expected_s)
1039
+ : "memory"
1040
+ );
1041
+ bool success = (desired_s == expected_s);
1042
+ if (success)
1043
+ platform_fence_after(success_order);
1044
+ else
1045
+ platform_fence_after(failure_order);
1046
+ memcpy(&expected, &desired_s, sizeof(value_type));
1047
+ return success;
1048
+ }
1049
+
1050
+ bool
1051
+ compare_exchange_weak(
1052
+ value_type & expected,
1053
+ value_type const& desired,
1054
+ memory_order success_order,
1055
+ memory_order failure_order) volatile BOOST_NOEXCEPT
1056
+ {
1057
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
1058
+ }
1059
+
1060
+ bool
1061
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
1062
+ {
1063
+ return true;
1064
+ }
1065
+
1066
+ BOOST_ATOMIC_DECLARE_BASE_OPERATORS
1067
+ private:
1068
+ base_atomic(const base_atomic &) /* = delete */ ;
1069
+ void operator=(const base_atomic &) /* = delete */ ;
1070
+ storage_type v_;
1071
+ };
1072
+
1073
+ template<typename T, bool Sign>
1074
+ class base_atomic<T, void, 2, Sign>
1075
+ {
1076
+ typedef base_atomic this_type;
1077
+ typedef T value_type;
1078
+ typedef uint32_t storage_type;
1079
+ public:
1080
+ BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
1081
+ {
1082
+ memcpy(&v_, &v, sizeof(value_type));
1083
+ }
1084
+ base_atomic(void) {}
1085
+
1086
+ void
1087
+ store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1088
+ {
1089
+ storage_type tmp = 0;
1090
+ memcpy(&tmp, &v, sizeof(value_type));
1091
+ platform_fence_before(order);
1092
+ const_cast<volatile storage_type &>(v_) = tmp;
1093
+ platform_fence_after_store(order);
1094
+ }
1095
+
1096
+ value_type
1097
+ load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
1098
+ {
1099
+ storage_type tmp = const_cast<volatile storage_type &>(v_);
1100
+ platform_fence_after_load(order);
1101
+ value_type v;
1102
+ memcpy(&v, &tmp, sizeof(value_type));
1103
+ return v;
1104
+ }
1105
+
1106
+ value_type
1107
+ exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1108
+ {
1109
+ value_type tmp = load(memory_order_relaxed);
1110
+ do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
1111
+ return tmp;
1112
+ }
1113
+
1114
+ bool
1115
+ compare_exchange_strong(
1116
+ value_type & expected,
1117
+ value_type const& desired,
1118
+ memory_order success_order,
1119
+ memory_order failure_order) volatile BOOST_NOEXCEPT
1120
+ {
1121
+ storage_type expected_s = 0, desired_s = 0;
1122
+ memcpy(&expected_s, &expected, sizeof(value_type));
1123
+ memcpy(&desired_s, &desired, sizeof(value_type));
1124
+ platform_fence_before(success_order);
1125
+ __asm__ (
1126
+ "cas [%1], %2, %0"
1127
+ : "+r" (desired_s)
1128
+ : "r" (&v_), "r" (expected_s)
1129
+ : "memory"
1130
+ );
1131
+ bool success = (desired_s == expected_s);
1132
+ if (success)
1133
+ platform_fence_after(success_order);
1134
+ else
1135
+ platform_fence_after(failure_order);
1136
+ memcpy(&expected, &desired_s, sizeof(value_type));
1137
+ return success;
1138
+ }
1139
+
1140
+ bool
1141
+ compare_exchange_weak(
1142
+ value_type & expected,
1143
+ value_type const& desired,
1144
+ memory_order success_order,
1145
+ memory_order failure_order) volatile BOOST_NOEXCEPT
1146
+ {
1147
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
1148
+ }
1149
+
1150
+ bool
1151
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
1152
+ {
1153
+ return true;
1154
+ }
1155
+
1156
+ BOOST_ATOMIC_DECLARE_BASE_OPERATORS
1157
+ private:
1158
+ base_atomic(const base_atomic &) /* = delete */ ;
1159
+ void operator=(const base_atomic &) /* = delete */ ;
1160
+ storage_type v_;
1161
+ };
1162
+
1163
+ template<typename T, bool Sign>
1164
+ class base_atomic<T, void, 4, Sign>
1165
+ {
1166
+ typedef base_atomic this_type;
1167
+ typedef T value_type;
1168
+ typedef uint32_t storage_type;
1169
+ public:
1170
+ BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
1171
+ {
1172
+ memcpy(&v_, &v, sizeof(value_type));
1173
+ }
1174
+ base_atomic(void) {}
1175
+
1176
+ void
1177
+ store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1178
+ {
1179
+ storage_type tmp = 0;
1180
+ memcpy(&tmp, &v, sizeof(value_type));
1181
+ platform_fence_before(order);
1182
+ const_cast<volatile storage_type &>(v_) = tmp;
1183
+ platform_fence_after_store(order);
1184
+ }
1185
+
1186
+ value_type
1187
+ load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
1188
+ {
1189
+ storage_type tmp = const_cast<volatile storage_type &>(v_);
1190
+ platform_fence_after_load(order);
1191
+ value_type v;
1192
+ memcpy(&v, &tmp, sizeof(value_type));
1193
+ return v;
1194
+ }
1195
+
1196
+ value_type
1197
+ exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1198
+ {
1199
+ value_type tmp = load(memory_order_relaxed);
1200
+ do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
1201
+ return tmp;
1202
+ }
1203
+
1204
+ bool
1205
+ compare_exchange_strong(
1206
+ value_type & expected,
1207
+ value_type const& desired,
1208
+ memory_order success_order,
1209
+ memory_order failure_order) volatile BOOST_NOEXCEPT
1210
+ {
1211
+ storage_type expected_s = 0, desired_s = 0;
1212
+ memcpy(&expected_s, &expected, sizeof(value_type));
1213
+ memcpy(&desired_s, &desired, sizeof(value_type));
1214
+ platform_fence_before(success_order);
1215
+ __asm__ (
1216
+ "cas [%1], %2, %0"
1217
+ : "+r" (desired_s)
1218
+ : "r" (&v_), "r" (expected_s)
1219
+ : "memory"
1220
+ );
1221
+ bool success = (desired_s == expected_s);
1222
+ if (success)
1223
+ platform_fence_after(success_order);
1224
+ else
1225
+ platform_fence_after(failure_order);
1226
+ memcpy(&expected, &desired_s, sizeof(value_type));
1227
+ return success;
1228
+ }
1229
+
1230
+ bool
1231
+ compare_exchange_weak(
1232
+ value_type & expected,
1233
+ value_type const& desired,
1234
+ memory_order success_order,
1235
+ memory_order failure_order) volatile BOOST_NOEXCEPT
1236
+ {
1237
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
1238
+ }
1239
+
1240
+ bool
1241
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
1242
+ {
1243
+ return true;
1244
+ }
1245
+
1246
+ BOOST_ATOMIC_DECLARE_BASE_OPERATORS
1247
+ private:
1248
+ base_atomic(const base_atomic &) /* = delete */ ;
1249
+ void operator=(const base_atomic &) /* = delete */ ;
1250
+ storage_type v_;
1251
+ };
1252
+
1253
+ #endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */
1254
+
1255
+ }
1256
+ }
1257
+ }
1258
+
1259
+ #endif