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,226 @@
1
+ //////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // (C) Copyright Vicente J. Botet Escriba 2008-2009,2012. Distributed under the Boost
4
+ // Software License, Version 1.0. (See accompanying file
5
+ // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
+ //
7
+ // See http://www.boost.org/libs/thread for documentation.
8
+ //
9
+ //////////////////////////////////////////////////////////////////////////////
10
+
11
+ #ifndef BOOST_THREAD_LOCKABLE_ADAPTER_HPP
12
+ #define BOOST_THREAD_LOCKABLE_ADAPTER_HPP
13
+
14
+ #include <boost/thread/detail/delete.hpp>
15
+ #include <boost/chrono/chrono.hpp>
16
+
17
+ namespace boost
18
+ {
19
+
20
+ //[basic_lockable_adapter
21
+ template <typename BasicLockable>
22
+ class basic_lockable_adapter
23
+ {
24
+ public:
25
+ typedef BasicLockable mutex_type;
26
+
27
+ protected:
28
+ mutex_type& lockable() const
29
+ {
30
+ return lockable_;
31
+ }
32
+ mutable mutex_type lockable_; /*< mutable so that it can be modified by const functions >*/
33
+ public:
34
+
35
+ BOOST_THREAD_NO_COPYABLE( basic_lockable_adapter) /*< no copyable >*/
36
+
37
+ basic_lockable_adapter()
38
+ {}
39
+
40
+ void lock()
41
+ {
42
+ lockable().lock();
43
+ }
44
+ void unlock()
45
+ {
46
+ lockable().unlock();
47
+ }
48
+
49
+ };
50
+ //]
51
+
52
+ //[lockable_adapter
53
+ template <typename Lockable>
54
+ class lockable_adapter : public basic_lockable_adapter<Lockable>
55
+ {
56
+ public:
57
+ typedef Lockable mutex_type;
58
+
59
+ bool try_lock()
60
+ {
61
+ return this->lockable().try_lock();
62
+ }
63
+ };
64
+ //]
65
+
66
+ //[timed_lockable_adapter
67
+ template <typename TimedLock>
68
+ class timed_lockable_adapter: public lockable_adapter<TimedLock>
69
+ {
70
+ public:
71
+ typedef TimedLock mutex_type;
72
+
73
+ template <typename Clock, typename Duration>
74
+ bool try_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
75
+ {
76
+ return this->lockable().try_lock_until(abs_time);
77
+ }
78
+ template <typename Rep, typename Period>
79
+ bool try_lock_for(chrono::duration<Rep, Period> const & rel_time)
80
+ {
81
+ return this->lockable().try_lock_for(rel_time);
82
+ }
83
+
84
+ };
85
+ //]
86
+
87
+ //[shared_lockable_adapter
88
+ template <typename SharableLock>
89
+ class shared_lockable_adapter: public timed_lockable_adapter<SharableLock>
90
+ {
91
+ public:
92
+ typedef SharableLock mutex_type;
93
+
94
+ void lock_shared()
95
+ {
96
+ this->lockable().lock_shared();
97
+ }
98
+ bool try_lock_shared()
99
+ {
100
+ return this->lockable().try_lock_shared();
101
+ }
102
+ void unlock_shared()
103
+ {
104
+ this->lockable().unlock_shared();
105
+ }
106
+
107
+ template <typename Clock, typename Duration>
108
+ bool try_lock_shared_until(chrono::time_point<Clock, Duration> const & abs_time)
109
+ {
110
+ return this->lockable().try_lock_shared_until(abs_time);
111
+ }
112
+ template <typename Rep, typename Period>
113
+ bool try_lock_shared_for(chrono::duration<Rep, Period> const & rel_time)
114
+ {
115
+ return this->lockable().try_lock_shared_for(rel_time);
116
+ }
117
+
118
+ };
119
+
120
+ //]
121
+
122
+ //[upgrade_lockable_adapter
123
+ template <typename UpgradableLock>
124
+ class upgrade_lockable_adapter: public shared_lockable_adapter<UpgradableLock>
125
+ {
126
+ public:
127
+ typedef UpgradableLock mutex_type;
128
+
129
+ void lock_upgrade()
130
+ {
131
+ this->lockable().lock_upgrade();
132
+ }
133
+
134
+ bool try_lock_upgrade()
135
+ {
136
+ return this->lockable().try_lock_upgrade();
137
+ }
138
+
139
+ void unlock_upgrade()
140
+ {
141
+ this->lockable().unlock_upgrade();
142
+ }
143
+
144
+ template <typename Clock, typename Duration>
145
+ bool try_lock_upgrade_until(chrono::time_point<Clock, Duration> const & abs_time)
146
+ {
147
+ return this->lockable().try_lock_upgrade_until(abs_time);
148
+ }
149
+ template <typename Rep, typename Period>
150
+ bool try_lock_upgrade_for(chrono::duration<Rep, Period> const & rel_time)
151
+ {
152
+ return this->lockable().try_lock_upgrade_for(rel_time);
153
+ }
154
+
155
+ bool try_unlock_shared_and_lock()
156
+ {
157
+ return this->lockable().try_unlock_shared_and_lock();
158
+ }
159
+
160
+ template <typename Clock, typename Duration>
161
+ bool try_unlock_shared_and_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
162
+ {
163
+ return this->lockable().try_unlock_shared_and_lock_until(abs_time);
164
+ }
165
+ template <typename Rep, typename Period>
166
+ bool try_unlock_shared_and_lock_for(chrono::duration<Rep, Period> const & rel_time)
167
+ {
168
+ return this->lockable().try_unlock_shared_and_lock_for(rel_time);
169
+ }
170
+
171
+ void unlock_and_lock_shared()
172
+ {
173
+ this->lockable().unlock_and_lock_shared();
174
+ }
175
+
176
+ bool try_unlock_shared_and_lock_upgrade()
177
+ {
178
+ return this->lockable().try_unlock_shared_and_lock_upgrade();
179
+ }
180
+
181
+ template <typename Clock, typename Duration>
182
+ bool try_unlock_shared_and_lock_upgrade_until(chrono::time_point<Clock, Duration> const & abs_time)
183
+ {
184
+ return this->lockable().try_unlock_shared_and_lock_upgrade_until(abs_time);
185
+ }
186
+ template <typename Rep, typename Period>
187
+ bool try_unlock_shared_and_lock_upgrade_for(chrono::duration<Rep, Period> const & rel_time)
188
+ {
189
+ return this->lockable().try_unlock_shared_and_lock_upgrade_for(rel_time);
190
+ }
191
+
192
+ void unlock_and_lock_upgrade()
193
+ {
194
+ this->lockable().unlock_and_lock_upgrade();
195
+ }
196
+
197
+ void unlock_upgrade_and_lock()
198
+ {
199
+ this->lockable().unlock_upgrade_and_lock();
200
+ }
201
+
202
+ bool try_unlock_upgrade_and_lock()
203
+ {
204
+ return this->lockable().try_unlock_upgrade_and_lock();
205
+ }
206
+ template <typename Clock, typename Duration>
207
+ bool try_unlock_upgrade_and_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
208
+ {
209
+ return this->lockable().try_unlock_upgrade_and_lock_until(abs_time);
210
+ }
211
+ template <typename Rep, typename Period>
212
+ bool try_unlock_upgrade_and_lock_for(chrono::duration<Rep, Period> const & rel_time)
213
+ {
214
+ return this->lockable().try_unlock_upgrade_and_lock_for(rel_time);
215
+ }
216
+
217
+ void unlock_upgrade_and_lock_shared()
218
+ {
219
+ this->lockable().unlock_upgrade_and_lock_shared();
220
+ }
221
+
222
+ };
223
+ //]
224
+
225
+ }
226
+ #endif
@@ -0,0 +1,157 @@
1
+ // (C) Copyright 2012 Vicente Botet
2
+ //
3
+ // Distributed under the Boost Software License, Version 1.0. (See accompanying
4
+ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
+
6
+ #ifndef BOOST_THREAD_LOCKABLE_CONCEPTS_HPP
7
+ #define BOOST_THREAD_LOCKABLE_CONCEPTS_HPP
8
+
9
+ #include <boost/chrono/chrono.hpp>
10
+ #include <boost/concept_check.hpp>
11
+
12
+ namespace boost
13
+ {
14
+
15
+ /**
16
+ * BasicLockable object supports the basic features
17
+ * required to delimit a critical region
18
+ * Supports the basic lock and unlock functions.
19
+ */
20
+
21
+ //[BasicLockable
22
+ template <typename Mutex>
23
+ struct BasicLockable
24
+ {
25
+
26
+ BOOST_CONCEPT_USAGE(BasicLockable)
27
+ {
28
+ l.lock();
29
+ l.unlock();
30
+ }
31
+ BasicLockable() : l(*static_cast<Mutex*>(0)) {}
32
+ private:
33
+ BasicLockable operator=(BasicLockable const&);
34
+
35
+ Mutex& l;
36
+ }
37
+ ;
38
+ //]
39
+ /**
40
+ * Lockable extends BasicLockable
41
+ * with try_lock functions.
42
+ */
43
+
44
+ //[Lockable
45
+ template <typename Mutex>
46
+ struct Lockable
47
+ {
48
+ BOOST_CONCEPT_ASSERT(( BasicLockable<Mutex> ));
49
+
50
+ BOOST_CONCEPT_USAGE(Lockable)
51
+ {
52
+ if (l.try_lock()) return;
53
+ }
54
+ Lockable() : l(*static_cast<Mutex*>(0)) {}
55
+ private:
56
+ Lockable operator=(Lockable const&);
57
+ Mutex& l;
58
+ };
59
+ //]
60
+
61
+ /**
62
+ * TimedLockable object extends Lockable
63
+ * with timed lock functions: try_lock_until and try_lock_for and the exception based lock_until and lock_for
64
+ */
65
+
66
+ //[TimedLockable
67
+ template <typename Mutex>
68
+ struct TimedLockable
69
+ {
70
+ BOOST_CONCEPT_ASSERT(( Lockable<Mutex> ));
71
+
72
+ BOOST_CONCEPT_USAGE(TimedLockable)
73
+ {
74
+ if (l.try_lock_until(t)) return;
75
+ if (l.try_lock_for(d)) return;
76
+ }
77
+ TimedLockable() : l(*static_cast<Mutex*>(0)) {}
78
+ private:
79
+ TimedLockable operator=(TimedLockable const&);
80
+ Mutex& l;
81
+ chrono::system_clock::time_point t;
82
+ chrono::system_clock::duration d;
83
+ };
84
+ //]
85
+
86
+ /**
87
+ * SharedLockable object extends TimedLockable
88
+ * with the lock_shared, lock_shared_until, lock_shared_for, try_lock_shared_until, try_lock_shared
89
+ * and unlock_shared functions
90
+ */
91
+ //[SharedLockable
92
+ template <typename Mutex>
93
+ struct SharedLockable
94
+ {
95
+ BOOST_CONCEPT_ASSERT(( TimedLockable<Mutex> ));
96
+
97
+ BOOST_CONCEPT_USAGE(SharedLockable)
98
+ {
99
+ l.lock_shared();
100
+ l.unlock_shared();
101
+ if (l.try_lock_shared()) return;
102
+ if (l.try_lock_shared_until(t)) return;
103
+ if (l.try_lock_shared_for(d)) return;
104
+ }
105
+ SharedLockable() : l(*static_cast<Mutex*>(0)) {}
106
+ private:
107
+ SharedLockable operator=(SharedLockable const&);
108
+ Mutex& l;
109
+ chrono::system_clock::time_point t;
110
+ chrono::system_clock::duration d;
111
+ };
112
+ //]
113
+
114
+ /**
115
+ * UpgradeLockable object extends SharedLockable
116
+ * with the lock_upgrade, lock_upgrade_until, unlock_upgrade_and_lock,
117
+ * unlock_and_lock_shared and unlock_upgrade_and_lock_shared functions
118
+ */
119
+
120
+ //[UpgradeLockable
121
+ template <typename Mutex>
122
+ struct UpgradeLockable
123
+ {
124
+ BOOST_CONCEPT_ASSERT(( SharedLockable<Mutex> ));
125
+
126
+ BOOST_CONCEPT_USAGE(UpgradeLockable)
127
+ {
128
+ l.lock_upgrade();
129
+ l.unlock_upgrade();
130
+ if (l.try_lock_upgrade()) return;
131
+ if (l.try_lock_upgrade_until(t)) return;
132
+ if (l.try_lock_upgrade_for(d)) return;
133
+ if (l.try_unlock_shared_and_lock()) return;
134
+ if (l.try_unlock_shared_and_lock_until(t)) return;
135
+ if (l.try_unlock_shared_and_lock_for(d)) return;
136
+ l.unlock_and_lock_shared();
137
+ if (l.try_unlock_shared_and_lock_upgrade()) return;
138
+ if (l.try_unlock_shared_and_lock_upgrade_until(t)) return;
139
+ if (l.try_unlock_shared_and_lock_upgrade_for(d)) return;
140
+ l.unlock_and_lock_upgrade();
141
+ l.unlock_upgrade_and_lock();
142
+ if (l.try_unlock_upgrade_and_lock()) return;
143
+ if (l.try_unlock_upgrade_and_lock_until(t)) return;
144
+ if (l.try_unlock_upgrade_and_lock_for(d)) return;
145
+ l.unlock_upgrade_and_lock_shared();
146
+ }
147
+ UpgradeLockable() : l(*static_cast<Mutex*>(0)) {}
148
+ private:
149
+ UpgradeLockable operator=(UpgradeLockable const&);
150
+ Mutex& l;
151
+ chrono::system_clock::time_point t;
152
+ chrono::system_clock::duration d;
153
+ };
154
+ //]
155
+
156
+ }
157
+ #endif
@@ -0,0 +1,207 @@
1
+ // Distributed under the Boost Software License, Version 1.0. (See
2
+ // accompanying file LICENSE_1_0.txt or copy at
3
+ // http://www.boost.org/LICENSE_1_0.txt)
4
+ // (C) Copyright 2007 Anthony Williams
5
+ // (C) Copyright 2011-2012 Vicente J. Botet Escriba
6
+
7
+ #ifndef BOOST_THREAD_LOCKABLE_TRAITS_HPP
8
+ #define BOOST_THREAD_LOCKABLE_TRAITS_HPP
9
+
10
+ #include <boost/thread/detail/config.hpp>
11
+
12
+ #include <boost/assert.hpp>
13
+ #include <boost/detail/workaround.hpp>
14
+ #include <boost/type_traits/is_class.hpp>
15
+
16
+ #include <boost/config/abi_prefix.hpp>
17
+
18
+ // todo make use of integral_constant, true_type and false_type
19
+
20
+ namespace boost
21
+ {
22
+ namespace sync
23
+ {
24
+
25
+ #if defined(BOOST_NO_SFINAE) || \
26
+ BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) || \
27
+ BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
28
+ #if ! defined BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
29
+ #define BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
30
+ #endif
31
+ #endif
32
+
33
+ #ifndef BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
34
+ namespace detail
35
+ {
36
+ #define BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(member_name) \
37
+ template<typename T, bool=boost::is_class<T>::value> \
38
+ struct has_member_called_##member_name \
39
+ { \
40
+ BOOST_STATIC_CONSTANT(bool, value=false); \
41
+ }; \
42
+ \
43
+ template<typename T> \
44
+ struct has_member_called_##member_name<T,true> \
45
+ { \
46
+ typedef char true_type; \
47
+ struct false_type \
48
+ { \
49
+ true_type dummy[2]; \
50
+ }; \
51
+ \
52
+ struct fallback { int member_name; }; \
53
+ struct derived: \
54
+ T, fallback \
55
+ { \
56
+ derived(); \
57
+ }; \
58
+ \
59
+ template<int fallback::*> struct tester; \
60
+ \
61
+ template<typename U> \
62
+ static false_type has_member(tester<&U::member_name>*); \
63
+ template<typename U> \
64
+ static true_type has_member(...); \
65
+ \
66
+ BOOST_STATIC_CONSTANT( \
67
+ bool, value=sizeof(has_member<derived>(0))==sizeof(true_type)); \
68
+ }
69
+
70
+ BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(lock)
71
+ ; BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(unlock);
72
+ BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(try_lock);
73
+
74
+ template<typename T,bool=has_member_called_lock<T>::value >
75
+ struct has_member_lock
76
+ {
77
+ BOOST_STATIC_CONSTANT(bool, value=false);
78
+ };
79
+
80
+ template<typename T>
81
+ struct has_member_lock<T,true>
82
+ {
83
+ typedef char true_type;
84
+ struct false_type
85
+ {
86
+ true_type dummy[2];
87
+ };
88
+
89
+ template<typename U,typename V>
90
+ static true_type has_member(V (U::*)());
91
+ template<typename U>
92
+ static false_type has_member(U);
93
+
94
+ BOOST_STATIC_CONSTANT(
95
+ bool,value=sizeof(has_member_lock<T>::has_member(&T::lock))==sizeof(true_type));
96
+ };
97
+
98
+ template<typename T,bool=has_member_called_unlock<T>::value >
99
+ struct has_member_unlock
100
+ {
101
+ BOOST_STATIC_CONSTANT(bool, value=false);
102
+ };
103
+
104
+ template<typename T>
105
+ struct has_member_unlock<T,true>
106
+ {
107
+ typedef char true_type;
108
+ struct false_type
109
+ {
110
+ true_type dummy[2];
111
+ };
112
+
113
+ template<typename U,typename V>
114
+ static true_type has_member(V (U::*)());
115
+ template<typename U>
116
+ static false_type has_member(U);
117
+
118
+ BOOST_STATIC_CONSTANT(
119
+ bool,value=sizeof(has_member_unlock<T>::has_member(&T::unlock))==sizeof(true_type));
120
+ };
121
+
122
+ template<typename T,bool=has_member_called_try_lock<T>::value >
123
+ struct has_member_try_lock
124
+ {
125
+ BOOST_STATIC_CONSTANT(bool, value=false);
126
+ };
127
+
128
+ template<typename T>
129
+ struct has_member_try_lock<T,true>
130
+ {
131
+ typedef char true_type;
132
+ struct false_type
133
+ {
134
+ true_type dummy[2];
135
+ };
136
+
137
+ template<typename U>
138
+ static true_type has_member(bool (U::*)());
139
+ template<typename U>
140
+ static false_type has_member(U);
141
+
142
+ BOOST_STATIC_CONSTANT(
143
+ bool,value=sizeof(has_member_try_lock<T>::has_member(&T::try_lock))==sizeof(true_type));
144
+ };
145
+
146
+ }
147
+
148
+ template<typename T>
149
+ struct is_basic_lockable
150
+ {
151
+ BOOST_STATIC_CONSTANT(bool, value = detail::has_member_lock<T>::value &&
152
+ detail::has_member_unlock<T>::value);
153
+ };
154
+ template<typename T>
155
+ struct is_lockable
156
+ {
157
+ BOOST_STATIC_CONSTANT(bool, value =
158
+ is_basic_lockable<T>::value &&
159
+ detail::has_member_try_lock<T>::value);
160
+ };
161
+
162
+ #else
163
+ template<typename T>
164
+ struct is_basic_lockable
165
+ {
166
+ BOOST_STATIC_CONSTANT(bool, value = false);
167
+ };
168
+ template<typename T>
169
+ struct is_lockable
170
+ {
171
+ BOOST_STATIC_CONSTANT(bool, value = false);
172
+ };
173
+ #endif
174
+
175
+ template<typename T>
176
+ struct is_recursive_mutex_sur_parole
177
+ {
178
+ BOOST_STATIC_CONSTANT(bool, value = false);
179
+ };
180
+ template<typename T>
181
+ struct is_recursive_mutex_sur_parolle : is_recursive_mutex_sur_parole<T>
182
+ {
183
+ };
184
+
185
+ template<typename T>
186
+ struct is_recursive_basic_lockable
187
+ {
188
+ BOOST_STATIC_CONSTANT(bool, value = is_basic_lockable<T>::value &&
189
+ is_recursive_mutex_sur_parolle<T>::value);
190
+ };
191
+ template<typename T>
192
+ struct is_recursive_lockable
193
+ {
194
+ BOOST_STATIC_CONSTANT(bool, value = is_lockable<T>::value &&
195
+ is_recursive_mutex_sur_parolle<T>::value);
196
+ };
197
+ }
198
+ template<typename T>
199
+ struct is_mutex_type
200
+ {
201
+ BOOST_STATIC_CONSTANT(bool, value = sync::is_lockable<T>::value);
202
+ };
203
+
204
+ }
205
+ #include <boost/config/abi_suffix.hpp>
206
+
207
+ #endif