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
@@ -8,7 +8,8 @@
8
8
 
9
9
  #include <boost/thread/detail/config.hpp>
10
10
  #include <boost/thread/exceptions.hpp>
11
- #include <boost/thread/locks.hpp>
11
+ #include <boost/thread/lock_guard.hpp>
12
+ #include <boost/thread/lock_types.hpp>
12
13
  #include <boost/thread/mutex.hpp>
13
14
  #include <boost/thread/pthread/condition_variable_fwd.hpp>
14
15
 
@@ -24,6 +25,10 @@
24
25
  #include <vector>
25
26
  #include <utility>
26
27
 
28
+ #if defined(__ANDROID__)
29
+ #include <asm/page.h> // http://code.google.com/p/android/issues/detail?id=39983
30
+ #endif
31
+
27
32
  #include <pthread.h>
28
33
  #include <unistd.h>
29
34
 
@@ -77,6 +82,7 @@ namespace boost
77
82
 
78
83
  namespace detail
79
84
  {
85
+ struct future_object_base;
80
86
  struct tss_cleanup_function;
81
87
  struct thread_exit_callback_node;
82
88
  struct tss_data_node
@@ -107,8 +113,7 @@ namespace boost
107
113
  bool joined;
108
114
  boost::detail::thread_exit_callback_node* thread_exit_callbacks;
109
115
  std::map<void const*,boost::detail::tss_data_node> tss_data;
110
- bool interrupt_enabled;
111
- bool interrupt_requested;
116
+
112
117
  pthread_mutex_t* cond_mutex;
113
118
  pthread_cond_t* current_cond;
114
119
  typedef std::vector<std::pair<condition_variable*, mutex*>
@@ -116,27 +121,49 @@ namespace boost
116
121
  > notify_list_t;
117
122
  notify_list_t notify;
118
123
 
124
+ typedef std::vector<shared_ptr<future_object_base> > async_states_t;
125
+ async_states_t async_states_;
126
+
127
+ //#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
128
+ // These data must be at the end so that the access to the other fields doesn't change
129
+ // when BOOST_THREAD_PROVIDES_INTERRUPTIONS is defined.
130
+ // Another option is to have them always
131
+ bool interrupt_enabled;
132
+ bool interrupt_requested;
133
+ //#endif
119
134
  thread_data_base():
135
+ thread_handle(0),
120
136
  done(false),join_started(false),joined(false),
121
137
  thread_exit_callbacks(0),
122
- interrupt_enabled(true),
123
- interrupt_requested(false),
138
+ cond_mutex(0),
124
139
  current_cond(0),
125
- notify()
140
+ notify(),
141
+ async_states_()
142
+ //#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
143
+ , interrupt_enabled(true)
144
+ , interrupt_requested(false)
145
+ //#endif
126
146
  {}
127
147
  virtual ~thread_data_base();
128
148
 
129
149
  typedef pthread_t native_handle_type;
130
150
 
131
151
  virtual void run()=0;
132
- void notify_all_at_thread_exit(condition_variable* cv, mutex* m)
152
+ virtual void notify_all_at_thread_exit(condition_variable* cv, mutex* m)
133
153
  {
134
154
  notify.push_back(std::pair<condition_variable*, mutex*>(cv, m));
135
155
  }
156
+
157
+ void make_ready_at_thread_exit(shared_ptr<future_object_base> as)
158
+ {
159
+ async_states_.push_back(as);
160
+ }
161
+
136
162
  };
137
163
 
138
164
  BOOST_THREAD_DECL thread_data_base* get_current_thread_data();
139
165
 
166
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
140
167
  class interruption_checker
141
168
  {
142
169
  thread_data_base* const thread_info;
@@ -188,71 +215,47 @@ namespace boost
188
215
  }
189
216
  }
190
217
  };
218
+ #endif
191
219
  }
192
220
 
193
221
  namespace this_thread
194
222
  {
223
+ namespace hiden
224
+ {
225
+ void BOOST_THREAD_DECL sleep_for(const timespec& ts);
226
+ void BOOST_THREAD_DECL sleep_until(const timespec& ts);
227
+ }
228
+
195
229
  #ifdef BOOST_THREAD_USES_CHRONO
230
+ #ifdef BOOST_THREAD_SLEEP_FOR_IS_STEADY
231
+
196
232
  inline
197
233
  void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns)
198
234
  {
199
- using namespace chrono;
200
- boost::detail::thread_data_base* const thread_info=boost::detail::get_current_thread_data();
201
-
202
- if(thread_info)
203
- {
204
- unique_lock<mutex> lk(thread_info->sleep_mutex);
205
- while(cv_status::no_timeout==thread_info->sleep_condition.wait_for(lk,ns)) {}
206
- }
207
- else
208
- {
209
- if (ns >= nanoseconds::zero())
210
- {
211
-
212
- # if defined(BOOST_HAS_PTHREAD_DELAY_NP)
213
- timespec ts;
214
- ts.tv_sec = static_cast<long>(duration_cast<seconds>(ns).count());
215
- ts.tv_nsec = static_cast<long>((ns - seconds(ts.tv_sec)).count());
216
- BOOST_VERIFY(!pthread_delay_np(&ts));
217
- # elif defined(BOOST_HAS_NANOSLEEP)
218
- timespec ts;
219
- ts.tv_sec = static_cast<long>(duration_cast<seconds>(ns).count());
220
- ts.tv_nsec = static_cast<long>((ns - seconds(ts.tv_sec)).count());
221
- // nanosleep takes a timespec that is an offset, not
222
- // an absolute time.
223
- nanosleep(&ts, 0);
224
- # else
225
- mutex mx;
226
- mutex::scoped_lock lock(mx);
227
- condition_variable cond;
228
- cond.wait_for(lock, ns);
229
- # endif
230
- }
231
- }
235
+ return boost::this_thread::hiden::sleep_for(boost::detail::to_timespec(ns));
232
236
  }
233
237
  #endif
238
+ #endif // BOOST_THREAD_USES_CHRONO
239
+
234
240
  void BOOST_THREAD_DECL yield() BOOST_NOEXCEPT;
235
241
 
242
+ #if defined BOOST_THREAD_USES_DATETIME
236
243
  #ifdef __DECXXX
237
244
  /// Workaround of DECCXX issue of incorrect template substitution
238
- template<typename TimeDuration>
239
- inline void sleep(TimeDuration const& rel_time)
245
+ template<>
246
+ #endif
247
+ inline void sleep(system_time const& abs_time)
240
248
  {
241
- this_thread::sleep(get_system_time()+rel_time);
249
+ return boost::this_thread::hiden::sleep_until(boost::detail::to_timespec(abs_time));
242
250
  }
243
251
 
244
- template<>
245
- void BOOST_THREAD_DECL sleep(system_time const& abs_time);
246
- #else
247
- void BOOST_THREAD_DECL sleep(system_time const& abs_time);
248
-
249
252
  template<typename TimeDuration>
250
253
  inline BOOST_SYMBOL_VISIBLE void sleep(TimeDuration const& rel_time)
251
254
  {
252
255
  this_thread::sleep(get_system_time()+rel_time);
253
256
  }
254
- #endif
255
- }
257
+ #endif // BOOST_THREAD_USES_DATETIME
258
+ } // this_thread
256
259
  }
257
260
 
258
261
  #include <boost/config/abi_suffix.hpp>
@@ -1,34 +1,118 @@
1
1
  #ifndef BOOST_THREAD_PTHREAD_TIMESPEC_HPP
2
2
  #define BOOST_THREAD_PTHREAD_TIMESPEC_HPP
3
- // (C) Copyright 2007-8 Anthony Williams
3
+ // (C) Copyright 2007-8 Anthony Williams
4
+ // (C) Copyright 2012 Vicente J. Botet Escriba
4
5
  //
5
6
  // Distributed under the Boost Software License, Version 1.0. (See
6
7
  // accompanying file LICENSE_1_0.txt or copy at
7
8
  // http://www.boost.org/LICENSE_1_0.txt)
8
9
 
10
+ #include <boost/thread/detail/config.hpp>
9
11
  #include <boost/thread/thread_time.hpp>
12
+ #if defined BOOST_THREAD_USES_DATETIME
10
13
  #include <boost/date_time/posix_time/conversion.hpp>
14
+ #endif
11
15
  #include <pthread.h>
12
16
  #ifndef _WIN32
13
17
  #include <unistd.h>
14
18
  #endif
19
+ #ifdef BOOST_THREAD_USES_CHRONO
20
+ #include <boost/chrono/duration.hpp>
21
+ #endif
22
+
23
+ #if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
24
+ # define BOOST_THREAD_TIMESPEC_MAC_API
25
+ #include <sys/time.h> //for gettimeofday and timeval
26
+ #else
27
+ #include <time.h> // for clock_gettime
28
+ #endif
15
29
 
16
30
  #include <boost/config/abi_prefix.hpp>
17
31
 
18
32
  namespace boost
19
33
  {
20
- namespace detail
21
- {
22
- inline struct timespec get_timespec(boost::system_time const& abs_time)
23
- {
24
- struct timespec timeout={0,0};
25
- boost::posix_time::time_duration const time_since_epoch=abs_time-boost::posix_time::from_time_t(0);
26
-
27
- timeout.tv_sec=time_since_epoch.total_seconds();
28
- timeout.tv_nsec=(long)(time_since_epoch.fractional_seconds()*(1000000000l/time_since_epoch.ticks_per_second()));
29
- return timeout;
30
- }
34
+ namespace detail
35
+ {
36
+ #if defined BOOST_THREAD_USES_DATETIME
37
+ inline struct timespec to_timespec(boost::system_time const& abs_time)
38
+ {
39
+ struct timespec timeout = { 0,0};
40
+ boost::posix_time::time_duration const time_since_epoch=abs_time-boost::posix_time::from_time_t(0);
41
+
42
+ timeout.tv_sec=time_since_epoch.total_seconds();
43
+ timeout.tv_nsec=(long)(time_since_epoch.fractional_seconds()*(1000000000l/time_since_epoch.ticks_per_second()));
44
+ return timeout;
45
+ }
46
+ #endif
47
+ #if defined BOOST_THREAD_USES_CHRONO
48
+ inline timespec to_timespec(chrono::nanoseconds const& ns)
49
+ {
50
+ struct timespec ts;
51
+ ts.tv_sec = static_cast<long>(chrono::duration_cast<chrono::seconds>(ns).count());
52
+ ts.tv_nsec = static_cast<long>((ns - chrono::duration_cast<chrono::seconds>(ns)).count());
53
+ return ts;
31
54
  }
55
+
56
+ #endif
57
+
58
+ inline timespec to_timespec(boost::intmax_t const& ns)
59
+ {
60
+ boost::intmax_t s = ns / 1000000000l;
61
+ struct timespec ts;
62
+ ts.tv_sec = static_cast<long> (s);
63
+ ts.tv_nsec = static_cast<long> (ns - s * 1000000000l);
64
+ return ts;
65
+ }
66
+ inline boost::intmax_t to_nanoseconds_int_max(timespec const& ts)
67
+ {
68
+ return static_cast<boost::intmax_t>(ts.tv_sec) * 1000000000l + ts.tv_nsec;
69
+ }
70
+ inline bool timespec_ge_zero(timespec const& ts)
71
+ {
72
+ return (ts.tv_sec >= 0) || (ts.tv_nsec >= 0);
73
+ }
74
+ inline timespec timespec_now()
75
+ {
76
+ timespec ts;
77
+
78
+ #if defined(BOOST_THREAD_TIMESPEC_MAC_API)
79
+ timeval tv;
80
+ ::gettimeofday(&tv, 0);
81
+ ts.tv_sec = tv.tv_sec;
82
+ ts.tv_nsec = tv.tv_usec * 1000;
83
+ #else
84
+ if ( ::clock_gettime( CLOCK_REALTIME, &ts ) )
85
+ {
86
+ BOOST_ASSERT(0 && "Boost::Thread - Internal Error");
87
+ }
88
+ #endif
89
+ return ts;
90
+ }
91
+ inline timespec timespec_zero()
92
+ {
93
+ timespec ts;
94
+ ts.tv_sec = 0;
95
+ ts.tv_nsec = 0;
96
+ return ts;
97
+ }
98
+ inline timespec timespec_plus(timespec const& lhs, timespec const& rhs)
99
+ {
100
+ return to_timespec(to_nanoseconds_int_max(lhs) + to_nanoseconds_int_max(rhs));
101
+ }
102
+ inline timespec timespec_minus(timespec const& lhs, timespec const& rhs)
103
+ {
104
+ return to_timespec(to_nanoseconds_int_max(lhs) - to_nanoseconds_int_max(rhs));
105
+ }
106
+ inline bool timespec_gt(timespec const& lhs, timespec const& rhs)
107
+ {
108
+ return to_nanoseconds_int_max(lhs) > to_nanoseconds_int_max(rhs);
109
+ }
110
+ inline bool timespec_ge(timespec const& lhs, timespec const& rhs)
111
+ {
112
+ return to_nanoseconds_int_max(lhs) >= to_nanoseconds_int_max(rhs);
113
+ }
114
+
115
+ }
32
116
  }
33
117
 
34
118
  #include <boost/config/abi_suffix.hpp>
@@ -3,7 +3,7 @@
3
3
 
4
4
  // recursive_mutex.hpp
5
5
  //
6
- // (C) Copyright 2007 Anthony Williams
6
+ // (C) Copyright 2007 Anthony Williams
7
7
  //
8
8
  // Distributed under the Boost Software License, Version 1.0. (See
9
9
  // accompanying file LICENSE_1_0.txt or copy at
@@ -18,4 +18,47 @@
18
18
  #error "Boost threads unavailable on this platform"
19
19
  #endif
20
20
 
21
+ #include <boost/thread/lockable_traits.hpp>
22
+
23
+ namespace boost
24
+ {
25
+ namespace sync
26
+ {
27
+
28
+ #ifdef BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
29
+ template<>
30
+ struct is_basic_lockable<recursive_mutex>
31
+ {
32
+ BOOST_STATIC_CONSTANT(bool, value = true);
33
+ };
34
+ template<>
35
+ struct is_lockable<recursive_mutex>
36
+ {
37
+ BOOST_STATIC_CONSTANT(bool, value = true);
38
+ };
39
+ template<>
40
+ struct is_basic_lockable<recursive_timed_mutex>
41
+ {
42
+ BOOST_STATIC_CONSTANT(bool, value = true);
43
+ };
44
+ template<>
45
+ struct is_lockable<recursive_timed_mutex>
46
+ {
47
+ BOOST_STATIC_CONSTANT(bool, value = true);
48
+ };
49
+ #endif
50
+
51
+ template<>
52
+ struct is_recursive_mutex_sur_parolle<recursive_mutex>
53
+ {
54
+ BOOST_STATIC_CONSTANT(bool, value = true);
55
+ };
56
+ template<>
57
+ struct is_recursive_mutex_sur_parolle<recursive_timed_mutex>
58
+ {
59
+ BOOST_STATIC_CONSTANT(bool, value = true);
60
+ };
61
+
62
+ }
63
+ }
21
64
  #endif
@@ -6,7 +6,9 @@
6
6
  #ifndef BOOST_THREAD_REVERSE_LOCK_HPP
7
7
  #define BOOST_THREAD_REVERSE_LOCK_HPP
8
8
  #include <boost/thread/detail/config.hpp>
9
- #include <boost/thread/locks.hpp>
9
+ #include <boost/thread/detail/move.hpp>
10
+ #include <boost/thread/lockable_traits.hpp>
11
+ #include <boost/thread/lock_options.hpp>
10
12
  #include <boost/thread/detail/delete.hpp>
11
13
 
12
14
  namespace boost
@@ -15,7 +17,6 @@ namespace boost
15
17
  template<typename Lock>
16
18
  class reverse_lock
17
19
  {
18
-
19
20
  public:
20
21
  typedef typename Lock::mutex_type mutex_type;
21
22
  BOOST_THREAD_NO_COPYABLE(reverse_lock)
@@ -0,0 +1,285 @@
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 2009-2012 Anthony Williams
5
+ // (C) Copyright 2012 Vicente J. Botet Escriba
6
+
7
+ // Based on the Anthony's idea of scoped_thread in CCiA
8
+
9
+ #ifndef BOOST_THREAD_SCOPED_THREAD_HPP
10
+ #define BOOST_THREAD_SCOPED_THREAD_HPP
11
+
12
+ #include <boost/thread/detail/config.hpp>
13
+ #include <boost/thread/detail/delete.hpp>
14
+ #include <boost/thread/detail/move.hpp>
15
+ #include <boost/thread/thread_functors.hpp>
16
+ #include <boost/thread/thread_only.hpp>
17
+
18
+ #include <boost/config/abi_prefix.hpp>
19
+
20
+ namespace boost
21
+ {
22
+
23
+ /**
24
+ * RAI @c thread wrapper adding a specific destroyer allowing to master what can be done at destruction time.
25
+ *
26
+ * CallableThread: A callable void(thread&) .
27
+ * The default is a join_if_joinable.
28
+ *
29
+ * thread std/boost::thread destructor terminates the program if the thread is not joinable.
30
+ * Having a wrapper that can join the thread before destroying it seems a natural need.
31
+ *
32
+ * Example:
33
+ *
34
+ * boost::strict_scoped_thread<> t((boost::thread(F)));
35
+ *
36
+ */
37
+ template <class CallableThread = join_if_joinable>
38
+ class strict_scoped_thread
39
+ {
40
+ thread t_;
41
+ struct dummy;
42
+ public:
43
+
44
+ BOOST_THREAD_NO_COPYABLE( strict_scoped_thread) /// non copyable
45
+
46
+ /*
47
+ *
48
+ */
49
+ #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
50
+ template <class F, class ...Args>
51
+ explicit strict_scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(Args)... args,
52
+ typename disable_if<is_same<typename decay<F>::type, thread>, dummy* >::type=0) :
53
+ t_(boost::forward<F>(f), boost::forward<Args>(args)...) {}
54
+ #else
55
+ template <class F>
56
+ explicit strict_scoped_thread(BOOST_THREAD_FWD_REF(F) f,
57
+ typename disable_if<is_same<typename decay<F>::type, thread>, dummy* >::type=0) :
58
+ t_(boost::forward<F>(f)) {}
59
+ template <class F, class A1>
60
+ strict_scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(A1) a1) :
61
+ t_(boost::forward<F>(f), boost::forward<A1>(a1)) {}
62
+ template <class F, class A1, class A2>
63
+ strict_scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(A1) a1, BOOST_THREAD_FWD_REF(A2) a2) :
64
+ t_(boost::forward<F>(f), boost::forward<A1>(a1), boost::forward<A2>(a2)) {}
65
+ template <class F, class A1, class A2, class A3>
66
+ strict_scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(A1) a1, BOOST_THREAD_FWD_REF(A2) a2, BOOST_THREAD_FWD_REF(A3) a3) :
67
+ t_(boost::forward<F>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)) {}
68
+ #endif
69
+
70
+ /**
71
+ * Constructor from the thread to own.
72
+ *
73
+ * @param t: the thread to own.
74
+ *
75
+ * Effects: move the thread to own @c t.
76
+ */
77
+ explicit strict_scoped_thread(BOOST_THREAD_RV_REF(thread) t) BOOST_NOEXCEPT :
78
+ t_(boost::move(t))
79
+ {
80
+ }
81
+
82
+ /**
83
+ * Destructor
84
+ * Effects: Call the CallableThread functor before destroying the owned thread.
85
+ * Remark: The CallableThread should not throw when joining the thread as the scoped variable is on a scope outside the thread function.
86
+ */
87
+ ~strict_scoped_thread()
88
+ {
89
+ CallableThread on_destructor;
90
+
91
+ on_destructor(t_);
92
+ }
93
+
94
+ };
95
+
96
+ /**
97
+ * RAI @c thread wrapper adding a specific destroyer allowing to master what can be done at destruction time.
98
+ *
99
+ * CallableThread: A callable void(thread&) .
100
+ * The default is join_if_joinable.
101
+ *
102
+ * thread std::thread destructor terminates the program if the thread is not joinable.
103
+ * Having a wrapper that can join the thread before destroying it seems a natural need.
104
+ *
105
+ * Remark: @c scoped_thread is not a @c thread as @c thread is not designed to be derived from as a polymorphic type.
106
+ * Anyway @c scoped_thread can be used in most of the contexts a @c thread could be used as it has the
107
+ * same non-deprecated interface with the exception of the construction.
108
+ *
109
+ * Example:
110
+ *
111
+ * boost::scoped_thread<> t((boost::thread(F)));
112
+ * t.interrupt();
113
+ *
114
+ */
115
+ template <class CallableThread = join_if_joinable>
116
+ class scoped_thread
117
+ {
118
+ thread t_;
119
+ struct dummy;
120
+ public:
121
+
122
+ typedef thread::id id;
123
+
124
+ BOOST_THREAD_MOVABLE_ONLY( scoped_thread) /// Movable only
125
+
126
+ /**
127
+ * Default Constructor.
128
+ *
129
+ * Effects: wraps a not-a-thread.
130
+ */
131
+ scoped_thread() BOOST_NOEXCEPT:
132
+ t_()
133
+ {
134
+ }
135
+
136
+ /**
137
+ *
138
+ */
139
+
140
+ #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
141
+ template <class F, class ...Args>
142
+ explicit scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(Args)... args,
143
+ typename disable_if<is_same<typename decay<F>::type, thread>, dummy* >::type=0) :
144
+ t_(boost::forward<F>(f), boost::forward<Args>(args)...) {}
145
+ #else
146
+ template <class F>
147
+ explicit scoped_thread(BOOST_THREAD_FWD_REF(F) f,
148
+ typename disable_if<is_same<typename decay<F>::type, thread>, dummy* >::type=0) :
149
+ t_(boost::forward<F>(f)) {}
150
+ template <class F, class A1>
151
+ scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(A1) a1) :
152
+ t_(boost::forward<F>(f), boost::forward<A1>(a1)) {}
153
+ template <class F, class A1, class A2>
154
+ scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(A1) a1, BOOST_THREAD_FWD_REF(A2) a2) :
155
+ t_(boost::forward<F>(f), boost::forward<A1>(a1), boost::forward<A2>(a2)) {}
156
+ template <class F, class A1, class A2, class A3>
157
+ scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(A1) a1, BOOST_THREAD_FWD_REF(A2) a2, BOOST_THREAD_FWD_REF(A3) a3) :
158
+ t_(boost::forward<F>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)) {}
159
+
160
+ #endif
161
+ /**
162
+ * Constructor from the thread to own.
163
+ *
164
+ * @param t: the thread to own.
165
+ *
166
+ * Effects: move the thread to own @c t.
167
+ */
168
+ explicit scoped_thread(BOOST_THREAD_RV_REF(thread) t) BOOST_NOEXCEPT :
169
+ t_(boost::move(t))
170
+ {
171
+ }
172
+
173
+ // explicit operator thread()
174
+ // {
175
+ // return boost::move(t_);
176
+ // }
177
+
178
+ /**
179
+ * Move constructor.
180
+ */
181
+ scoped_thread(BOOST_RV_REF(scoped_thread) x) BOOST_NOEXCEPT :
182
+ t_(boost::move(x.t_))
183
+ {}
184
+
185
+ /**
186
+ * Destructor
187
+ *
188
+ * Effects: Call the CallableThread functor before destroying the owned thread.
189
+ */
190
+ ~scoped_thread()
191
+ {
192
+ CallableThread on_destructor;
193
+
194
+ on_destructor(t_);
195
+ }
196
+
197
+ /**
198
+ * Move assignment.
199
+ */
200
+ scoped_thread& operator=(BOOST_RV_REF(scoped_thread) x)
201
+ {
202
+ t_ = boost::move(x.t_);
203
+ return *this;
204
+ }
205
+
206
+ /**
207
+ *
208
+ */
209
+ void swap(scoped_thread& x) BOOST_NOEXCEPT
210
+ {
211
+ t_.swap(x.t_);
212
+ }
213
+
214
+ // forwarded thread functions
215
+ inline thread::id get_id() const BOOST_NOEXCEPT
216
+ {
217
+ return t_.get_id();
218
+ }
219
+
220
+ void detach()
221
+ {
222
+ t_.detach();
223
+ }
224
+
225
+ void join()
226
+ {
227
+ t_.join();
228
+ }
229
+
230
+ #ifdef BOOST_THREAD_USES_CHRONO
231
+ template <class Rep, class Period>
232
+ bool try_join_for(const chrono::duration<Rep, Period>& rel_time)
233
+ {
234
+ return t_.try_join_for(rel_time);
235
+ }
236
+
237
+ template <class Clock, class Duration>
238
+ bool try_join_until(const chrono::time_point<Clock, Duration>& abs_time)
239
+ {
240
+ return t_.try_join_until(abs_time);
241
+ }
242
+ #endif
243
+
244
+ thread::native_handle_type native_handle()BOOST_NOEXCEPT
245
+ {
246
+ return t_.native_handle();
247
+ }
248
+
249
+ bool joinable() const BOOST_NOEXCEPT
250
+ {
251
+ return t_.joinable();
252
+ }
253
+
254
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
255
+ void interrupt()
256
+ {
257
+ t_.interrupt();
258
+ }
259
+
260
+ bool interruption_requested() const BOOST_NOEXCEPT
261
+ {
262
+ return t_.interruption_requested();
263
+ }
264
+ #endif
265
+
266
+ static unsigned hardware_concurrency()BOOST_NOEXCEPT
267
+ {
268
+ return thread::hardware_concurrency();
269
+ }
270
+
271
+ };
272
+
273
+ /**
274
+ * Effects: swaps the contents of two scoped threads.
275
+ */
276
+ template <class Destroyer>
277
+ void swap(scoped_thread<Destroyer>& lhs, scoped_thread<Destroyer>& rhs)
278
+ BOOST_NOEXCEPT {
279
+ return lhs.swap(rhs);
280
+ }
281
+
282
+ }
283
+ #include <boost/config/abi_suffix.hpp>
284
+
285
+ #endif