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
@@ -3,18 +3,24 @@
3
3
  // Distributed under the Boost Software License, Version 1.0. (See
4
4
  // accompanying file LICENSE_1_0.txt or copy at
5
5
  // http://www.boost.org/LICENSE_1_0.txt)
6
- // (C) Copyright 2007-10 Anthony Williams
7
- // (C) Copyright 20011-12 Vicente J. Botet Escriba
6
+ // (C) Copyright 2007-2010 Anthony Williams
7
+ // (C) Copyright 20011-2012 Vicente J. Botet Escriba
8
8
 
9
9
  #include <boost/thread/detail/config.hpp>
10
+
10
11
  #include <boost/thread/exceptions.hpp>
11
12
  #ifndef BOOST_NO_IOSTREAM
12
13
  #include <ostream>
13
14
  #endif
14
15
  #include <boost/thread/detail/move.hpp>
15
16
  #include <boost/thread/mutex.hpp>
17
+ #if defined BOOST_THREAD_USES_DATETIME
16
18
  #include <boost/thread/xtime.hpp>
19
+ #endif
17
20
  #include <boost/thread/detail/thread_heap_alloc.hpp>
21
+ #include <boost/thread/detail/make_tuple_indices.hpp>
22
+ #include <boost/thread/detail/invoke.hpp>
23
+ #include <boost/thread/detail/is_convertible.hpp>
18
24
  #include <boost/assert.hpp>
19
25
  #include <list>
20
26
  #include <algorithm>
@@ -23,8 +29,6 @@
23
29
  #include <boost/bind.hpp>
24
30
  #include <stdlib.h>
25
31
  #include <memory>
26
- //#include <vector>
27
- //#include <utility>
28
32
  #include <boost/utility/enable_if.hpp>
29
33
  #include <boost/type_traits/remove_reference.hpp>
30
34
  #include <boost/io/ios_state.hpp>
@@ -36,6 +40,9 @@
36
40
  #include <boost/chrono/ceil.hpp>
37
41
  #endif
38
42
 
43
+ #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
44
+ #include <tuple>
45
+ #endif
39
46
  #include <boost/config/abi_prefix.hpp>
40
47
 
41
48
  #ifdef BOOST_MSVC
@@ -48,6 +55,38 @@ namespace boost
48
55
 
49
56
  namespace detail
50
57
  {
58
+
59
+ #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
60
+
61
+ template<typename F, class ...ArgTypes>
62
+ class thread_data:
63
+ public detail::thread_data_base
64
+ {
65
+ public:
66
+ BOOST_THREAD_NO_COPYABLE(thread_data)
67
+ #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
68
+ thread_data(BOOST_THREAD_RV_REF(F) f_, BOOST_THREAD_RV_REF(ArgTypes)... args_):
69
+ fp(boost::forward<F>(f_), boost::forward<ArgTypes>(args_)...)
70
+ {}
71
+ #endif
72
+ template <std::size_t ...Indices>
73
+ void run2(tuple_indices<Indices...>)
74
+ {
75
+
76
+ invoke(std::move(std::get<0>(fp)), std::move(std::get<Indices>(fp))...);
77
+ }
78
+ void run()
79
+ {
80
+ typedef typename make_tuple_indices<std::tuple_size<std::tuple<F, ArgTypes...> >::value, 1>::type index_type;
81
+
82
+ run2(index_type());
83
+ }
84
+
85
+ private:
86
+ std::tuple<typename decay<F>::type, typename decay<ArgTypes>::type...> fp;
87
+ };
88
+ #else // defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
89
+
51
90
  template<typename F>
52
91
  class thread_data:
53
92
  public detail::thread_data_base
@@ -115,6 +154,7 @@ namespace boost
115
154
  f();
116
155
  }
117
156
  };
157
+ #endif
118
158
  }
119
159
 
120
160
  class BOOST_THREAD_DECL thread
@@ -125,24 +165,55 @@ namespace boost
125
165
  BOOST_THREAD_MOVABLE_ONLY(thread)
126
166
  protected:
127
167
 
168
+ struct dummy;
169
+
128
170
  void release_handle();
129
171
 
130
172
  detail::thread_data_ptr thread_info;
131
173
 
132
- void start_thread();
133
- void start_thread(const attributes& attr);
174
+ private:
175
+ bool start_thread_noexcept();
176
+ bool start_thread_noexcept(const attributes& attr);
177
+ public:
178
+ void start_thread()
179
+ {
180
+ if (!start_thread_noexcept())
181
+ {
182
+ boost::throw_exception(thread_resource_error());
183
+ }
184
+ }
185
+ void start_thread(const attributes& attr)
186
+ {
187
+ if (!start_thread_noexcept(attr))
188
+ {
189
+ boost::throw_exception(thread_resource_error());
190
+ }
191
+ }
134
192
 
135
193
  explicit thread(detail::thread_data_ptr data);
136
194
 
137
195
  detail::thread_data_ptr get_thread_info BOOST_PREVENT_MACRO_SUBSTITUTION () const;
138
196
 
139
197
  #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
198
+ #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
199
+ template<typename F, class ...ArgTypes>
200
+ static inline detail::thread_data_ptr make_thread_info(BOOST_THREAD_RV_REF(F) f, BOOST_THREAD_RV_REF(ArgTypes)... args)
201
+ {
202
+ return detail::thread_data_ptr(detail::heap_new<
203
+ detail::thread_data<typename boost::remove_reference<F>::type, ArgTypes...>
204
+ >(
205
+ boost::forward<F>(f), boost::forward<ArgTypes>(args)...
206
+ )
207
+ );
208
+ }
209
+ #else
140
210
  template<typename F>
141
211
  static inline detail::thread_data_ptr make_thread_info(BOOST_THREAD_RV_REF(F) f)
142
212
  {
143
213
  return detail::thread_data_ptr(detail::heap_new<detail::thread_data<typename boost::remove_reference<F>::type> >(
144
214
  boost::forward<F>(f)));
145
215
  }
216
+ #endif
146
217
  static inline detail::thread_data_ptr make_thread_info(void (*f)())
147
218
  {
148
219
  return detail::thread_data_ptr(detail::heap_new<detail::thread_data<void(*)()> >(
@@ -150,7 +221,12 @@ namespace boost
150
221
  }
151
222
  #else
152
223
  template<typename F>
153
- static inline detail::thread_data_ptr make_thread_info(F f)
224
+ static inline detail::thread_data_ptr make_thread_info(F f
225
+ , typename disable_if_c<
226
+ //boost::thread_detail::is_convertible<F&,BOOST_THREAD_RV_REF(F)>::value ||
227
+ is_same<typename decay<F>::type, thread>::value,
228
+ dummy* >::type=0
229
+ )
154
230
  {
155
231
  return detail::thread_data_ptr(detail::heap_new<detail::thread_data<F> >(f));
156
232
  }
@@ -161,7 +237,6 @@ namespace boost
161
237
  }
162
238
 
163
239
  #endif
164
- struct dummy;
165
240
  public:
166
241
  #if 0 // This should not be needed anymore. Use instead BOOST_THREAD_MAKE_RV_REF.
167
242
  #if BOOST_WORKAROUND(__SUNPRO_CC, < 0x5100)
@@ -171,6 +246,7 @@ namespace boost
171
246
  thread() BOOST_NOEXCEPT;
172
247
  ~thread()
173
248
  {
249
+
174
250
  #if defined BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE
175
251
  if (joinable()) {
176
252
  std::terminate();
@@ -184,7 +260,7 @@ namespace boost
184
260
  class F
185
261
  >
186
262
  explicit thread(BOOST_THREAD_RV_REF(F) f
187
- , typename disable_if<is_same<typename decay<F>::type, thread>, dummy* >::type=0
263
+ //, typename disable_if<is_same<typename decay<F>::type, thread>, dummy* >::type=0
188
264
  ):
189
265
  thread_info(make_thread_info(thread_detail::decay_copy(boost::forward<F>(f))))
190
266
  {
@@ -193,7 +269,7 @@ namespace boost
193
269
  template <
194
270
  class F
195
271
  >
196
- thread(attributes& attrs, BOOST_THREAD_RV_REF(F) f):
272
+ thread(attributes const& attrs, BOOST_THREAD_RV_REF(F) f):
197
273
  thread_info(make_thread_info(thread_detail::decay_copy(boost::forward<F>(f))))
198
274
  {
199
275
  start_thread(attrs);
@@ -208,7 +284,7 @@ namespace boost
208
284
  start_thread();
209
285
  }
210
286
  template <class F>
211
- thread(attributes& attrs, F f):
287
+ thread(attributes const& attrs, F f):
212
288
  thread_info(make_thread_info(f))
213
289
  {
214
290
  start_thread(attrs);
@@ -216,15 +292,19 @@ namespace boost
216
292
  #else
217
293
  template <class F>
218
294
  explicit thread(F f
219
- // todo Disable also if Or is_same<typename decay<F>::type, thread>
220
- , typename disable_if<boost::is_convertible<F&,BOOST_THREAD_RV_REF(F) >, dummy* >::type=0):
295
+ , typename disable_if_c<
296
+ boost::thread_detail::is_convertible<F&,BOOST_THREAD_RV_REF(F)>::value
297
+ //|| is_same<typename decay<F>::type, thread>::value
298
+ , dummy* >::type=0
299
+ ):
221
300
  thread_info(make_thread_info(f))
222
301
  {
223
302
  start_thread();
224
303
  }
225
304
  template <class F>
226
- thread(attributes& attrs, F f
227
- , typename disable_if<boost::is_convertible<F&,BOOST_THREAD_RV_REF(F) >, dummy* >::type=0):
305
+ thread(attributes const& attrs, F f
306
+ , typename disable_if<boost::thread_detail::is_convertible<F&,BOOST_THREAD_RV_REF(F) >, dummy* >::type=0
307
+ ):
228
308
  thread_info(make_thread_info(f))
229
309
  {
230
310
  start_thread(attrs);
@@ -234,14 +314,22 @@ namespace boost
234
314
  explicit thread(BOOST_THREAD_RV_REF(F) f
235
315
  , typename disable_if<is_same<typename decay<F>::type, thread>, dummy* >::type=0
236
316
  ):
237
- thread_info(make_thread_info(f))
317
+ #ifdef BOOST_THREAD_USES_MOVE
318
+ thread_info(make_thread_info(boost::move<F>(f))) // todo : Add forward
319
+ #else
320
+ thread_info(make_thread_info(f)) // todo : Add forward
321
+ #endif
238
322
  {
239
323
  start_thread();
240
324
  }
241
325
 
242
326
  template <class F>
243
- thread(attributes& attrs, BOOST_THREAD_RV_REF(F) f):
244
- thread_info(make_thread_info(f))
327
+ thread(attributes const& attrs, BOOST_THREAD_RV_REF(F) f):
328
+ #ifdef BOOST_THREAD_USES_MOVE
329
+ thread_info(make_thread_info(boost::move<F>(f))) // todo : Add forward
330
+ #else
331
+ thread_info(make_thread_info(f)) // todo : Add forward
332
+ #endif
245
333
  {
246
334
  start_thread(attrs);
247
335
  }
@@ -272,8 +360,32 @@ namespace boost
272
360
  return *this;
273
361
  }
274
362
 
363
+ #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
364
+ template <class F, class Arg, class ...Args>
365
+ thread(F&& f, Arg&& arg, Args&&... args) :
366
+ thread_info(make_thread_info(
367
+ thread_detail::decay_copy(boost::forward<F>(f)),
368
+ thread_detail::decay_copy(boost::forward<Arg>(arg)),
369
+ thread_detail::decay_copy(boost::forward<Args>(args))...)
370
+ )
371
+
372
+ {
373
+ start_thread();
374
+ }
375
+ template <class F, class Arg, class ...Args>
376
+ thread(attributes const& attrs, F&& f, Arg&& arg, Args&&... args) :
377
+ thread_info(make_thread_info(
378
+ thread_detail::decay_copy(boost::forward<F>(f)),
379
+ thread_detail::decay_copy(boost::forward<Arg>(arg)),
380
+ thread_detail::decay_copy(boost::forward<Args>(args))...)
381
+ )
382
+
383
+ {
384
+ start_thread(attrs);
385
+ }
386
+ #else
275
387
  template <class F,class A1>
276
- thread(F f,A1 a1,typename disable_if<boost::is_convertible<F&,thread_attributes >, dummy* >::type=0):
388
+ thread(F f,A1 a1,typename disable_if<boost::thread_detail::is_convertible<F&,thread_attributes >, dummy* >::type=0):
277
389
  thread_info(make_thread_info(boost::bind(boost::type<void>(),f,a1)))
278
390
  {
279
391
  start_thread();
@@ -333,18 +445,26 @@ namespace boost
333
445
  {
334
446
  start_thread();
335
447
  }
336
-
448
+ #endif
337
449
  void swap(thread& x) BOOST_NOEXCEPT
338
450
  {
339
451
  thread_info.swap(x.thread_info);
340
452
  }
341
453
 
342
- class BOOST_SYMBOL_VISIBLE id;
454
+ class id;
455
+ #ifdef BOOST_THREAD_PLATFORM_PTHREAD
456
+ inline id get_id() const BOOST_NOEXCEPT;
457
+ #else
343
458
  id get_id() const BOOST_NOEXCEPT;
459
+ #endif
344
460
 
345
461
 
346
462
  bool joinable() const BOOST_NOEXCEPT;
347
- void join();
463
+ private:
464
+ bool join_noexcept();
465
+ public:
466
+ inline void join();
467
+
348
468
  #ifdef BOOST_THREAD_USES_CHRONO
349
469
  template <class Rep, class Period>
350
470
  bool try_join_for(const chrono::duration<Rep, Period>& rel_time)
@@ -356,8 +476,13 @@ namespace boost
356
476
  {
357
477
  using namespace chrono;
358
478
  system_clock::time_point s_now = system_clock::now();
359
- typename Clock::time_point c_now = Clock::now();
360
- return try_join_until(s_now + ceil<nanoseconds>(t - c_now));
479
+ bool joined= false;
480
+ do {
481
+ typename Clock::duration d = ceil<nanoseconds>(t-Clock::now());
482
+ if (d <= Clock::duration::zero()) return false; // in case the Clock::time_point t is already reached
483
+ joined = try_join_until(s_now + d);
484
+ } while (! joined);
485
+ return true;
361
486
  }
362
487
  template <class Duration>
363
488
  bool try_join_until(const chrono::time_point<chrono::system_clock, Duration>& t)
@@ -368,10 +493,15 @@ namespace boost
368
493
  }
369
494
  #endif
370
495
  #if defined(BOOST_THREAD_PLATFORM_WIN32)
371
- bool timed_join(const system_time& abs_time);
372
496
  private:
373
- bool do_try_join_until(uintmax_t milli);
497
+ bool do_try_join_until_noexcept(uintmax_t milli, bool& res);
498
+ inline bool do_try_join_until(uintmax_t milli);
374
499
  public:
500
+ bool timed_join(const system_time& abs_time);
501
+ //{
502
+ // return do_try_join_until(get_milliseconds_until(wait_until));
503
+ //}
504
+
375
505
  #ifdef BOOST_THREAD_USES_CHRONO
376
506
  bool try_join_until(const chrono::time_point<chrono::system_clock, chrono::nanoseconds>& tp)
377
507
  {
@@ -382,35 +512,37 @@ namespace boost
382
512
 
383
513
 
384
514
  #else
515
+ private:
516
+ bool do_try_join_until_noexcept(struct timespec const &timeout, bool& res);
517
+ inline bool do_try_join_until(struct timespec const &timeout);
518
+ public:
519
+ #if defined BOOST_THREAD_USES_DATETIME
385
520
  bool timed_join(const system_time& abs_time)
386
521
  {
387
- struct timespec const ts=detail::get_timespec(abs_time);
522
+ struct timespec const ts=detail::to_timespec(abs_time);
388
523
  return do_try_join_until(ts);
389
524
  }
525
+ #endif
390
526
  #ifdef BOOST_THREAD_USES_CHRONO
391
527
  bool try_join_until(const chrono::time_point<chrono::system_clock, chrono::nanoseconds>& tp)
392
528
  {
393
529
  using namespace chrono;
394
530
  nanoseconds d = tp.time_since_epoch();
395
- timespec ts;
396
- seconds s = duration_cast<seconds>(d);
397
- ts.tv_sec = static_cast<long>(s.count());
398
- ts.tv_nsec = static_cast<long>((d - s).count());
531
+ timespec ts = boost::detail::to_timespec(d);
399
532
  return do_try_join_until(ts);
400
533
  }
401
534
  #endif
402
- private:
403
- bool do_try_join_until(struct timespec const &timeout);
404
- public:
405
535
 
406
536
  #endif
537
+ public:
407
538
 
539
+ #if defined BOOST_THREAD_USES_DATETIME
408
540
  template<typename TimeDuration>
409
541
  inline bool timed_join(TimeDuration const& rel_time)
410
542
  {
411
543
  return timed_join(get_system_time()+rel_time);
412
544
  }
413
-
545
+ #endif
414
546
  void detach();
415
547
 
416
548
  static unsigned hardware_concurrency() BOOST_NOEXCEPT;
@@ -419,12 +551,13 @@ namespace boost
419
551
  typedef detail::thread_data_base::native_handle_type native_handle_type;
420
552
  native_handle_type native_handle();
421
553
 
422
- #if defined BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0
554
+ #if defined BOOST_THREAD_PROVIDES_THREAD_EQ
423
555
  // Use thread::id when comparisions are needed
424
556
  // backwards compatibility
425
557
  bool operator==(const thread& other) const;
426
558
  bool operator!=(const thread& other) const;
427
559
  #endif
560
+ #if defined BOOST_THREAD_USES_DATETIME
428
561
  static inline void yield() BOOST_NOEXCEPT
429
562
  {
430
563
  this_thread::yield();
@@ -434,10 +567,13 @@ namespace boost
434
567
  {
435
568
  this_thread::sleep(xt);
436
569
  }
570
+ #endif
437
571
 
572
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
438
573
  // extensions
439
574
  void interrupt();
440
575
  bool interruption_requested() const BOOST_NOEXCEPT;
576
+ #endif
441
577
  };
442
578
 
443
579
  inline void swap(thread& lhs,thread& rhs) BOOST_NOEXCEPT
@@ -456,16 +592,24 @@ namespace boost
456
592
 
457
593
  namespace this_thread
458
594
  {
595
+ #ifdef BOOST_THREAD_PLATFORM_PTHREAD
596
+ inline thread::id get_id() BOOST_NOEXCEPT;
597
+ #else
459
598
  thread::id BOOST_THREAD_DECL get_id() BOOST_NOEXCEPT;
599
+ #endif
460
600
 
601
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
461
602
  void BOOST_THREAD_DECL interruption_point();
462
603
  bool BOOST_THREAD_DECL interruption_enabled() BOOST_NOEXCEPT;
463
604
  bool BOOST_THREAD_DECL interruption_requested() BOOST_NOEXCEPT;
605
+ #endif
464
606
 
607
+ #if defined BOOST_THREAD_USES_DATETIME
465
608
  inline BOOST_SYMBOL_VISIBLE void sleep(xtime const& abs_time)
466
609
  {
467
610
  sleep(system_time(abs_time));
468
611
  }
612
+ #endif
469
613
  }
470
614
 
471
615
  class BOOST_SYMBOL_VISIBLE thread::id
@@ -501,11 +645,7 @@ namespace boost
501
645
  public:
502
646
  id() BOOST_NOEXCEPT:
503
647
  #if defined BOOST_THREAD_PROVIDES_BASIC_THREAD_ID
504
- #if defined(BOOST_THREAD_PLATFORM_WIN32)
505
- thread_data(0)
506
- #else
507
648
  thread_data(0)
508
- #endif
509
649
  #else
510
650
  thread_data()
511
651
  #endif
@@ -583,6 +723,61 @@ namespace boost
583
723
  #endif
584
724
  };
585
725
 
726
+ #ifdef BOOST_THREAD_PLATFORM_PTHREAD
727
+ thread::id thread::get_id() const BOOST_NOEXCEPT
728
+ {
729
+ #if defined BOOST_THREAD_PROVIDES_BASIC_THREAD_ID
730
+ return const_cast<thread*>(this)->native_handle();
731
+ #else
732
+ detail::thread_data_ptr const local_thread_info=(get_thread_info)();
733
+ return (local_thread_info? id(local_thread_info) : id());
734
+ #endif
735
+ }
736
+
737
+ namespace this_thread
738
+ {
739
+ inline thread::id get_id() BOOST_NOEXCEPT
740
+ {
741
+ #if defined BOOST_THREAD_PROVIDES_BASIC_THREAD_ID
742
+ return pthread_self();
743
+ #else
744
+ boost::detail::thread_data_base* const thread_info=get_or_make_current_thread_data();
745
+ return (thread_info?thread::id(thread_info->shared_from_this()):thread::id());
746
+ #endif
747
+ }
748
+ }
749
+ #endif
750
+ void thread::join() {
751
+ if (this_thread::get_id() == get_id())
752
+ boost::throw_exception(thread_resource_error(system::errc::resource_deadlock_would_occur, "boost thread: trying joining itself"));
753
+
754
+ BOOST_THREAD_VERIFY_PRECONDITION( join_noexcept(),
755
+ thread_resource_error(system::errc::invalid_argument, "boost thread: thread not joinable")
756
+ );
757
+ }
758
+
759
+ #ifdef BOOST_THREAD_PLATFORM_PTHREAD
760
+ bool thread::do_try_join_until(struct timespec const &timeout)
761
+ #else
762
+ bool thread::do_try_join_until(uintmax_t timeout)
763
+ #endif
764
+ {
765
+ if (this_thread::get_id() == get_id())
766
+ boost::throw_exception(thread_resource_error(system::errc::resource_deadlock_would_occur, "boost thread: trying joining itself"));
767
+ bool res;
768
+ if (do_try_join_until_noexcept(timeout, res))
769
+ {
770
+ return res;
771
+ }
772
+ else
773
+ {
774
+ BOOST_THREAD_THROW_ELSE_RETURN(
775
+ (thread_resource_error(system::errc::invalid_argument, "boost thread: thread not joinable")),
776
+ false
777
+ );
778
+ }
779
+ }
780
+
586
781
  #if !defined(BOOST_NO_IOSTREAM) && defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
587
782
  template<class charT, class traits>
588
783
  BOOST_SYMBOL_VISIBLE
@@ -593,7 +788,7 @@ namespace boost
593
788
  }
594
789
  #endif
595
790
 
596
- #if defined BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0
791
+ #if defined BOOST_THREAD_PROVIDES_THREAD_EQ
597
792
  inline bool thread::operator==(const thread& other) const
598
793
  {
599
794
  return get_id()==other.get_id();