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,585 @@
1
+ #ifndef BOOST_ATOMIC_DETAIL_BASE_HPP
2
+ #define BOOST_ATOMIC_DETAIL_BASE_HPP
3
+
4
+ // Copyright (c) 2009 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
+ // Base class definition and fallback implementation.
12
+ // To be overridden (through partial specialization) by
13
+ // platform implementations.
14
+
15
+ #include <string.h>
16
+
17
+ #include <cstddef>
18
+ #include <boost/cstdint.hpp>
19
+ #include <boost/atomic/detail/config.hpp>
20
+ #include <boost/atomic/detail/lockpool.hpp>
21
+
22
+ #ifdef BOOST_ATOMIC_HAS_PRAGMA_ONCE
23
+ #pragma once
24
+ #endif
25
+
26
+ #define BOOST_ATOMIC_DECLARE_BASE_OPERATORS \
27
+ bool \
28
+ compare_exchange_strong( \
29
+ value_type & expected, \
30
+ value_type desired, \
31
+ memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT \
32
+ { \
33
+ return compare_exchange_strong(expected, desired, order, calculate_failure_order(order)); \
34
+ } \
35
+ \
36
+ bool \
37
+ compare_exchange_weak( \
38
+ value_type & expected, \
39
+ value_type desired, \
40
+ memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT \
41
+ { \
42
+ return compare_exchange_weak(expected, desired, order, calculate_failure_order(order)); \
43
+ } \
44
+
45
+ #define BOOST_ATOMIC_DECLARE_ADDITIVE_OPERATORS \
46
+ value_type \
47
+ operator++(int) volatile BOOST_NOEXCEPT \
48
+ { \
49
+ return fetch_add(1); \
50
+ } \
51
+ \
52
+ value_type \
53
+ operator++(void) volatile BOOST_NOEXCEPT \
54
+ { \
55
+ return fetch_add(1) + 1; \
56
+ } \
57
+ \
58
+ value_type \
59
+ operator--(int) volatile BOOST_NOEXCEPT \
60
+ { \
61
+ return fetch_sub(1); \
62
+ } \
63
+ \
64
+ value_type \
65
+ operator--(void) volatile BOOST_NOEXCEPT \
66
+ { \
67
+ return fetch_sub(1) - 1; \
68
+ } \
69
+ \
70
+ value_type \
71
+ operator+=(difference_type v) volatile BOOST_NOEXCEPT \
72
+ { \
73
+ return fetch_add(v) + v; \
74
+ } \
75
+ \
76
+ value_type \
77
+ operator-=(difference_type v) volatile BOOST_NOEXCEPT \
78
+ { \
79
+ return fetch_sub(v) - v; \
80
+ } \
81
+
82
+ #define BOOST_ATOMIC_DECLARE_VOID_POINTER_ADDITIVE_OPERATORS \
83
+ value_type \
84
+ operator++(int) volatile BOOST_NOEXCEPT \
85
+ { \
86
+ return fetch_add(1); \
87
+ } \
88
+ \
89
+ value_type \
90
+ operator++(void) volatile BOOST_NOEXCEPT \
91
+ { \
92
+ return (char*)fetch_add(1) + 1; \
93
+ } \
94
+ \
95
+ value_type \
96
+ operator--(int) volatile BOOST_NOEXCEPT \
97
+ { \
98
+ return fetch_sub(1); \
99
+ } \
100
+ \
101
+ value_type \
102
+ operator--(void) volatile BOOST_NOEXCEPT \
103
+ { \
104
+ return (char*)fetch_sub(1) - 1; \
105
+ } \
106
+ \
107
+ value_type \
108
+ operator+=(difference_type v) volatile BOOST_NOEXCEPT \
109
+ { \
110
+ return (char*)fetch_add(v) + v; \
111
+ } \
112
+ \
113
+ value_type \
114
+ operator-=(difference_type v) volatile BOOST_NOEXCEPT \
115
+ { \
116
+ return (char*)fetch_sub(v) - v; \
117
+ } \
118
+
119
+ #define BOOST_ATOMIC_DECLARE_BIT_OPERATORS \
120
+ value_type \
121
+ operator&=(difference_type v) volatile BOOST_NOEXCEPT \
122
+ { \
123
+ return fetch_and(v) & v; \
124
+ } \
125
+ \
126
+ value_type \
127
+ operator|=(difference_type v) volatile BOOST_NOEXCEPT \
128
+ { \
129
+ return fetch_or(v) | v; \
130
+ } \
131
+ \
132
+ value_type \
133
+ operator^=(difference_type v) volatile BOOST_NOEXCEPT\
134
+ { \
135
+ return fetch_xor(v) ^ v; \
136
+ } \
137
+
138
+ #define BOOST_ATOMIC_DECLARE_POINTER_OPERATORS \
139
+ BOOST_ATOMIC_DECLARE_BASE_OPERATORS \
140
+ BOOST_ATOMIC_DECLARE_ADDITIVE_OPERATORS \
141
+
142
+ #define BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS \
143
+ BOOST_ATOMIC_DECLARE_BASE_OPERATORS \
144
+ BOOST_ATOMIC_DECLARE_VOID_POINTER_ADDITIVE_OPERATORS \
145
+
146
+ #define BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS \
147
+ BOOST_ATOMIC_DECLARE_BASE_OPERATORS \
148
+ BOOST_ATOMIC_DECLARE_ADDITIVE_OPERATORS \
149
+ BOOST_ATOMIC_DECLARE_BIT_OPERATORS \
150
+
151
+ namespace boost {
152
+ namespace atomics {
153
+ namespace detail {
154
+
155
+ inline memory_order
156
+ calculate_failure_order(memory_order order)
157
+ {
158
+ switch(order) {
159
+ case memory_order_acq_rel:
160
+ return memory_order_acquire;
161
+ case memory_order_release:
162
+ return memory_order_relaxed;
163
+ default:
164
+ return order;
165
+ }
166
+ }
167
+
168
+ template<typename T, typename C, unsigned int Size, bool Sign>
169
+ class base_atomic
170
+ {
171
+ private:
172
+ typedef base_atomic this_type;
173
+ typedef T value_type;
174
+ typedef lockpool::scoped_lock guard_type;
175
+ typedef char storage_type[sizeof(value_type)];
176
+
177
+ public:
178
+ base_atomic(void) {}
179
+
180
+ BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(v)
181
+ {}
182
+
183
+ void
184
+ store(value_type const& v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
185
+ {
186
+ char * storage = storage_ptr();
187
+ guard_type guard(storage);
188
+
189
+ memcpy(storage, &v, sizeof(value_type));
190
+ }
191
+
192
+ value_type
193
+ load(memory_order /*order*/ = memory_order_seq_cst) volatile const BOOST_NOEXCEPT
194
+ {
195
+ char * storage = storage_ptr();
196
+ guard_type guard(storage);
197
+
198
+ value_type v;
199
+ memcpy(&v, storage, sizeof(value_type));
200
+ return v;
201
+ }
202
+
203
+ bool
204
+ compare_exchange_strong(
205
+ value_type & expected,
206
+ value_type const& desired,
207
+ memory_order /*success_order*/,
208
+ memory_order /*failure_order*/) volatile BOOST_NOEXCEPT
209
+ {
210
+ char * storage = storage_ptr();
211
+ guard_type guard(storage);
212
+
213
+ if (memcmp(storage, &expected, sizeof(value_type)) == 0) {
214
+ memcpy(storage, &desired, sizeof(value_type));
215
+ return true;
216
+ } else {
217
+ memcpy(&expected, storage, sizeof(value_type));
218
+ return false;
219
+ }
220
+ }
221
+
222
+ bool
223
+ compare_exchange_weak(
224
+ value_type & expected,
225
+ value_type const& desired,
226
+ memory_order success_order,
227
+ memory_order failure_order) volatile BOOST_NOEXCEPT
228
+ {
229
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
230
+ }
231
+
232
+ value_type
233
+ exchange(value_type const& v, memory_order /*order*/=memory_order_seq_cst) volatile BOOST_NOEXCEPT
234
+ {
235
+ char * storage = storage_ptr();
236
+ guard_type guard(storage);
237
+
238
+ value_type tmp;
239
+ memcpy(&tmp, storage, sizeof(value_type));
240
+
241
+ memcpy(storage, &v, sizeof(value_type));
242
+ return tmp;
243
+ }
244
+
245
+ bool
246
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
247
+ {
248
+ return false;
249
+ }
250
+
251
+ BOOST_ATOMIC_DECLARE_BASE_OPERATORS
252
+ private:
253
+ char * storage_ptr() volatile const BOOST_NOEXCEPT
254
+ {
255
+ return const_cast<char *>(&reinterpret_cast<char const volatile &>(v_));
256
+ }
257
+
258
+ base_atomic(const base_atomic &) /* = delete */ ;
259
+ void operator=(const base_atomic &) /* = delete */ ;
260
+
261
+ T v_;
262
+ };
263
+
264
+ template<typename T, unsigned int Size, bool Sign>
265
+ class base_atomic<T, int, Size, Sign>
266
+ {
267
+ private:
268
+ typedef base_atomic this_type;
269
+ typedef T value_type;
270
+ typedef T difference_type;
271
+ typedef lockpool::scoped_lock guard_type;
272
+ public:
273
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
274
+ base_atomic(void) {}
275
+
276
+ void
277
+ store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
278
+ {
279
+ guard_type guard(const_cast<value_type *>(&v_));
280
+
281
+ v_ = v;
282
+ }
283
+
284
+ value_type
285
+ load(memory_order /*order*/ = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
286
+ {
287
+ guard_type guard(const_cast<value_type *>(&v_));
288
+
289
+ value_type v = const_cast<const volatile value_type &>(v_);
290
+ return v;
291
+ }
292
+
293
+ value_type
294
+ exchange(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
295
+ {
296
+ guard_type guard(const_cast<value_type *>(&v_));
297
+
298
+ value_type old = v_;
299
+ v_ = v;
300
+ return old;
301
+ }
302
+
303
+ bool
304
+ compare_exchange_strong(value_type & expected, value_type desired,
305
+ memory_order /*success_order*/,
306
+ memory_order /*failure_order*/) volatile BOOST_NOEXCEPT
307
+ {
308
+ guard_type guard(const_cast<value_type *>(&v_));
309
+
310
+ if (v_ == expected) {
311
+ v_ = desired;
312
+ return true;
313
+ } else {
314
+ expected = v_;
315
+ return false;
316
+ }
317
+ }
318
+
319
+ bool
320
+ compare_exchange_weak(value_type & expected, value_type desired,
321
+ memory_order success_order,
322
+ memory_order failure_order) volatile BOOST_NOEXCEPT
323
+ {
324
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
325
+ }
326
+
327
+ value_type
328
+ fetch_add(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
329
+ {
330
+ guard_type guard(const_cast<value_type *>(&v_));
331
+
332
+ value_type old = v_;
333
+ v_ += v;
334
+ return old;
335
+ }
336
+
337
+ value_type
338
+ fetch_sub(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
339
+ {
340
+ guard_type guard(const_cast<value_type *>(&v_));
341
+
342
+ value_type old = v_;
343
+ v_ -= v;
344
+ return old;
345
+ }
346
+
347
+ value_type
348
+ fetch_and(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
349
+ {
350
+ guard_type guard(const_cast<value_type *>(&v_));
351
+
352
+ value_type old = v_;
353
+ v_ &= v;
354
+ return old;
355
+ }
356
+
357
+ value_type
358
+ fetch_or(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
359
+ {
360
+ guard_type guard(const_cast<value_type *>(&v_));
361
+
362
+ value_type old = v_;
363
+ v_ |= v;
364
+ return old;
365
+ }
366
+
367
+ value_type
368
+ fetch_xor(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
369
+ {
370
+ guard_type guard(const_cast<value_type *>(&v_));
371
+
372
+ value_type old = v_;
373
+ v_ ^= v;
374
+ return old;
375
+ }
376
+
377
+ bool
378
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
379
+ {
380
+ return false;
381
+ }
382
+
383
+ BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
384
+ private:
385
+ base_atomic(const base_atomic &) /* = delete */ ;
386
+ void operator=(const base_atomic &) /* = delete */ ;
387
+ value_type v_;
388
+ };
389
+
390
+ template<typename T, unsigned int Size, bool Sign>
391
+ class base_atomic<T *, void *, Size, Sign>
392
+ {
393
+ private:
394
+ typedef base_atomic this_type;
395
+ typedef T * value_type;
396
+ typedef ptrdiff_t difference_type;
397
+ typedef lockpool::scoped_lock guard_type;
398
+ public:
399
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
400
+ base_atomic(void) {}
401
+
402
+ void
403
+ store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
404
+ {
405
+ guard_type guard(const_cast<value_type *>(&v_));
406
+ v_ = v;
407
+ }
408
+
409
+ value_type
410
+ load(memory_order /*order*/ = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
411
+ {
412
+ guard_type guard(const_cast<value_type *>(&v_));
413
+
414
+ value_type v = const_cast<const volatile value_type &>(v_);
415
+ return v;
416
+ }
417
+
418
+ value_type
419
+ exchange(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
420
+ {
421
+ guard_type guard(const_cast<value_type *>(&v_));
422
+
423
+ value_type old = v_;
424
+ v_ = v;
425
+ return old;
426
+ }
427
+
428
+ bool
429
+ compare_exchange_strong(value_type & expected, value_type desired,
430
+ memory_order /*success_order*/,
431
+ memory_order /*failure_order*/) volatile BOOST_NOEXCEPT
432
+ {
433
+ guard_type guard(const_cast<value_type *>(&v_));
434
+
435
+ if (v_ == expected) {
436
+ v_ = desired;
437
+ return true;
438
+ } else {
439
+ expected = v_;
440
+ return false;
441
+ }
442
+ }
443
+
444
+ bool
445
+ compare_exchange_weak(value_type & expected, value_type desired,
446
+ memory_order success_order,
447
+ memory_order failure_order) volatile BOOST_NOEXCEPT
448
+ {
449
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
450
+ }
451
+
452
+ value_type fetch_add(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
453
+ {
454
+ guard_type guard(const_cast<value_type *>(&v_));
455
+
456
+ value_type old = v_;
457
+ v_ += v;
458
+ return old;
459
+ }
460
+
461
+ value_type fetch_sub(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile
462
+ {
463
+ guard_type guard(const_cast<value_type *>(&v_));
464
+
465
+ value_type old = v_;
466
+ v_ -= v;
467
+ return old;
468
+ }
469
+
470
+ bool
471
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
472
+ {
473
+ return false;
474
+ }
475
+
476
+ BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
477
+ private:
478
+ base_atomic(const base_atomic &) /* = delete */ ;
479
+ void operator=(const base_atomic &) /* = delete */ ;
480
+ value_type v_;
481
+ };
482
+
483
+ template<unsigned int Size, bool Sign>
484
+ class base_atomic<void *, void *, Size, Sign>
485
+ {
486
+ private:
487
+ typedef base_atomic this_type;
488
+ typedef ptrdiff_t difference_type;
489
+ typedef void * value_type;
490
+ typedef lockpool::scoped_lock guard_type;
491
+ public:
492
+ BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
493
+ base_atomic(void) {}
494
+
495
+ void
496
+ store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
497
+ {
498
+ guard_type guard(const_cast<value_type *>(&v_));
499
+ v_ = v;
500
+ }
501
+
502
+ value_type
503
+ load(memory_order /*order*/ = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
504
+ {
505
+ guard_type guard(const_cast<value_type *>(&v_));
506
+
507
+ value_type v = const_cast<const volatile value_type &>(v_);
508
+ return v;
509
+ }
510
+
511
+ value_type
512
+ exchange(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
513
+ {
514
+ guard_type guard(const_cast<value_type *>(&v_));
515
+
516
+ value_type old = v_;
517
+ v_ = v;
518
+ return old;
519
+ }
520
+
521
+ bool
522
+ compare_exchange_strong(value_type & expected, value_type desired,
523
+ memory_order /*success_order*/,
524
+ memory_order /*failure_order*/) volatile BOOST_NOEXCEPT
525
+ {
526
+ guard_type guard(const_cast<value_type *>(&v_));
527
+
528
+ if (v_ == expected) {
529
+ v_ = desired;
530
+ return true;
531
+ } else {
532
+ expected = v_;
533
+ return false;
534
+ }
535
+ }
536
+
537
+ bool
538
+ compare_exchange_weak(value_type & expected, value_type desired,
539
+ memory_order success_order,
540
+ memory_order failure_order) volatile BOOST_NOEXCEPT
541
+ {
542
+ return compare_exchange_strong(expected, desired, success_order, failure_order);
543
+ }
544
+
545
+ bool
546
+ is_lock_free(void) const volatile BOOST_NOEXCEPT
547
+ {
548
+ return false;
549
+ }
550
+
551
+ value_type fetch_add(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
552
+ {
553
+ guard_type guard(const_cast<value_type *>(&v_));
554
+
555
+ value_type old = v_;
556
+ char * cv = reinterpret_cast<char*>(old);
557
+ cv += v;
558
+ v_ = cv;
559
+ return old;
560
+ }
561
+
562
+ value_type fetch_sub(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile
563
+ {
564
+ guard_type guard(const_cast<value_type *>(&v_));
565
+
566
+ value_type old = v_;
567
+ char * cv = reinterpret_cast<char*>(old);
568
+ cv -= v;
569
+ v_ = cv;
570
+ return old;
571
+ }
572
+
573
+ BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
574
+
575
+ private:
576
+ base_atomic(const base_atomic &) /* = delete */ ;
577
+ void operator=(const base_atomic &) /* = delete */ ;
578
+ value_type v_;
579
+ };
580
+
581
+ }
582
+ }
583
+ }
584
+
585
+ #endif