passenger 4.0.20 → 4.0.21

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (496) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.gitignore +1 -0
  5. data/.travis.yml +1 -1
  6. data/NEWS +15 -0
  7. data/README.md +5 -3
  8. data/Rakefile +1 -0
  9. data/bin/passenger-config +1 -5
  10. data/bin/passenger-install-apache2-module +53 -5
  11. data/bin/passenger-install-nginx-module +19 -6
  12. data/bin/passenger-memory-stats +3 -3
  13. data/build/agents.rb +11 -8
  14. data/build/apache2.rb +9 -5
  15. data/build/basics.rb +15 -21
  16. data/build/common_library.rb +16 -6
  17. data/build/cplusplus_support.rb +5 -5
  18. data/build/cxx_tests.rb +3 -3
  19. data/build/documentation.rb +1 -1
  20. data/build/misc.rb +4 -37
  21. data/build/node_tests.rb +29 -0
  22. data/build/oxt_tests.rb +1 -1
  23. data/build/packaging.rb +29 -10
  24. data/build/preprocessor.rb +2 -1
  25. data/build/test_basics.rb +15 -6
  26. data/debian.template/locations.ini.template +1 -0
  27. data/debian.template/passenger.install.template +1 -0
  28. data/dev/copy_boost_headers.rb +7 -3
  29. data/dev/run_travis.sh +32 -16
  30. data/doc/Users guide Apache.idmap.txt +22 -34
  31. data/doc/Users guide Apache.txt +20 -234
  32. data/doc/Users guide Nginx.idmap.txt +84 -66
  33. data/doc/Users guide Nginx.txt +50 -1
  34. data/doc/Users guide Standalone.idmap.txt +74 -0
  35. data/doc/Users guide Standalone.txt +22 -9
  36. data/doc/Users guide.txt +51 -0
  37. data/doc/users_guide_snippets/environment_variables.txt +0 -3
  38. data/doc/users_guide_snippets/installation.txt +337 -380
  39. data/doc/users_guide_snippets/installation/run_installer.txt +58 -0
  40. data/doc/users_guide_snippets/installation/verify_running_epilogue.txt +6 -0
  41. data/doc/users_guide_snippets/support_information.txt +2 -9
  42. data/doc/users_guide_snippets/troubleshooting/default.txt +112 -0
  43. data/doc/users_guide_snippets/troubleshooting/rails.txt +56 -0
  44. data/doc/users_guide_snippets/where_to_get_support.txt +9 -0
  45. data/ext/apache2/Bucket.h +1 -1
  46. data/ext/apache2/Configuration.hpp +0 -44
  47. data/ext/apache2/CreateDirConfig.cpp +1 -1
  48. data/ext/apache2/CreateDirConfig.cpp.erb +1 -1
  49. data/ext/apache2/Hooks.cpp +28 -21
  50. data/ext/apache2/MergeDirConfig.cpp +1 -0
  51. data/ext/apache2/MergeDirConfig.cpp.erb +1 -1
  52. data/ext/apache2/SetHeaders.cpp +73 -0
  53. data/ext/apache2/SetHeaders.cpp.erb +88 -0
  54. data/ext/boost/algorithm/string/detail/find_format.hpp +5 -5
  55. data/ext/boost/algorithm/string/detail/find_format_all.hpp +5 -5
  56. data/ext/boost/algorithm/string/detail/finder.hpp +1 -1
  57. data/ext/boost/algorithm/string/formatter.hpp +2 -2
  58. data/ext/boost/assert.hpp +6 -1
  59. data/ext/boost/atomic.hpp +18 -0
  60. data/ext/boost/atomic/atomic.hpp +241 -0
  61. data/ext/boost/atomic/detail/base.hpp +585 -0
  62. data/ext/boost/atomic/detail/cas32strong.hpp +885 -0
  63. data/ext/boost/atomic/detail/cas32weak.hpp +947 -0
  64. data/ext/boost/atomic/detail/cas64strong.hpp +443 -0
  65. data/ext/boost/atomic/detail/config.hpp +54 -0
  66. data/ext/boost/atomic/detail/gcc-alpha.hpp +368 -0
  67. data/ext/boost/atomic/detail/gcc-armv6plus.hpp +252 -0
  68. data/ext/boost/atomic/detail/gcc-cas.hpp +157 -0
  69. data/ext/boost/atomic/detail/gcc-ppc.hpp +2850 -0
  70. data/ext/boost/atomic/detail/gcc-sparcv9.hpp +1259 -0
  71. data/ext/boost/atomic/detail/gcc-x86.hpp +1766 -0
  72. data/ext/boost/atomic/detail/generic-cas.hpp +206 -0
  73. data/ext/boost/atomic/detail/interlocked.hpp +200 -0
  74. data/ext/boost/atomic/detail/linux-arm.hpp +189 -0
  75. data/ext/boost/atomic/detail/lockpool.hpp +97 -0
  76. data/ext/boost/atomic/detail/platform.hpp +62 -0
  77. data/ext/boost/atomic/detail/type-classification.hpp +45 -0
  78. data/ext/boost/chrono/config.hpp +8 -3
  79. data/ext/boost/chrono/duration.hpp +9 -10
  80. data/ext/boost/chrono/system_clocks.hpp +1 -1
  81. data/ext/boost/chrono/time_point.hpp +4 -3
  82. data/ext/boost/config/auto_link.hpp +53 -52
  83. data/ext/boost/config/compiler/borland.hpp +1 -0
  84. data/ext/boost/config/compiler/clang.hpp +24 -1
  85. data/ext/boost/config/compiler/codegear.hpp +1 -0
  86. data/ext/boost/config/compiler/common_edg.hpp +1 -0
  87. data/ext/boost/config/compiler/cray.hpp +1 -0
  88. data/ext/boost/config/compiler/digitalmars.hpp +1 -0
  89. data/ext/boost/config/compiler/gcc.hpp +29 -3
  90. data/ext/boost/config/compiler/gcc_xml.hpp +2 -1
  91. data/ext/boost/config/compiler/hp_acc.hpp +1 -0
  92. data/ext/boost/config/compiler/intel.hpp +1 -1
  93. data/ext/boost/config/compiler/metrowerks.hpp +1 -0
  94. data/ext/boost/config/compiler/mpw.hpp +1 -0
  95. data/ext/boost/config/compiler/pathscale.hpp +1 -0
  96. data/ext/boost/config/compiler/pgi.hpp +1 -0
  97. data/ext/boost/config/compiler/sunpro_cc.hpp +1 -0
  98. data/ext/boost/config/compiler/vacpp.hpp +3 -2
  99. data/ext/boost/config/compiler/visualc.hpp +25 -11
  100. data/ext/boost/config/platform/vxworks.hpp +353 -15
  101. data/ext/boost/config/select_compiler_config.hpp +4 -4
  102. data/ext/boost/config/stdlib/dinkumware.hpp +10 -3
  103. data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
  104. data/ext/boost/config/suffix.hpp +45 -19
  105. data/ext/boost/date_time/format_date_parser.hpp +1 -11
  106. data/ext/boost/date_time/strings_from_facet.hpp +5 -3
  107. data/ext/boost/detail/atomic_redef_macros.hpp +19 -0
  108. data/ext/boost/detail/atomic_undef_macros.hpp +39 -0
  109. data/ext/boost/detail/endian.hpp +52 -4
  110. data/ext/boost/detail/scoped_enum_emulation.hpp +10 -10
  111. data/ext/boost/detail/select_type.hpp +36 -0
  112. data/ext/boost/exception/current_exception_cast.hpp +1 -1
  113. data/ext/boost/exception/detail/error_info_impl.hpp +3 -5
  114. data/ext/boost/exception/detail/exception_ptr.hpp +3 -3
  115. data/ext/boost/exception/detail/is_output_streamable.hpp +1 -1
  116. data/ext/boost/exception/detail/object_hex_dump.hpp +1 -1
  117. data/ext/boost/exception/detail/type_info.hpp +1 -1
  118. data/ext/boost/exception/diagnostic_information.hpp +15 -14
  119. data/ext/boost/exception/exception.hpp +1 -1
  120. data/ext/boost/exception/get_error_info.hpp +1 -1
  121. data/ext/boost/exception/info.hpp +12 -13
  122. data/ext/boost/exception/to_string.hpp +6 -1
  123. data/ext/boost/exception/to_string_stub.hpp +9 -1
  124. data/ext/boost/foreach.hpp +5 -5
  125. data/ext/boost/function/function_template.hpp +6 -6
  126. data/ext/boost/functional/hash/detail/float_functions.hpp +90 -0
  127. data/ext/boost/functional/hash/detail/hash_float.hpp +11 -2
  128. data/ext/boost/functional/hash/extensions.hpp +14 -2
  129. data/ext/boost/functional/hash/hash.hpp +26 -5
  130. data/ext/boost/get_pointer.hpp +17 -2
  131. data/ext/boost/integer_traits.hpp +1 -1
  132. data/ext/boost/lexical_cast.hpp +615 -395
  133. data/ext/boost/libs/atomic/lockpool.cpp +24 -0
  134. data/ext/boost/libs/system/src/error_code.cpp +25 -18
  135. data/ext/boost/libs/thread/src/future.cpp +7 -5
  136. data/ext/boost/libs/thread/src/pthread/once.cpp +9 -3
  137. data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +90 -0
  138. data/ext/boost/libs/thread/src/pthread/thread.cpp +129 -95
  139. data/ext/boost/libs/thread/src/pthread/timeconv.inl +20 -1
  140. data/ext/boost/limits.hpp +1 -1
  141. data/ext/boost/math/policies/policy.hpp +10 -0
  142. data/ext/boost/math/special_functions/detail/round_fwd.hpp +17 -4
  143. data/ext/boost/math/special_functions/fpclassify.hpp +114 -45
  144. data/ext/boost/math/special_functions/math_fwd.hpp +195 -83
  145. data/ext/boost/math/special_functions/sign.hpp +13 -8
  146. data/ext/boost/math/tools/config.hpp +38 -16
  147. data/ext/boost/move/algorithm.hpp +275 -0
  148. data/ext/boost/move/core.hpp +332 -0
  149. data/ext/boost/move/detail/config_begin.hpp +23 -0
  150. data/ext/boost/move/detail/config_end.hpp +20 -0
  151. data/ext/boost/move/detail/meta_utils.hpp +158 -0
  152. data/ext/boost/move/iterator.hpp +298 -0
  153. data/ext/boost/move/move.hpp +10 -1256
  154. data/ext/boost/move/traits.hpp +142 -0
  155. data/ext/boost/move/utility.hpp +194 -0
  156. data/ext/boost/mpl/assert.hpp +72 -4
  157. data/ext/boost/noncopyable.hpp +15 -3
  158. data/ext/boost/pointer_to_other.hpp +55 -0
  159. data/ext/boost/range/concepts.hpp +4 -4
  160. data/ext/boost/range/detail/extract_optional_type.hpp +1 -1
  161. data/ext/boost/range/empty.hpp +1 -1
  162. data/ext/boost/range/iterator_range_core.hpp +4 -1
  163. data/ext/boost/range/iterator_range_io.hpp +2 -2
  164. data/ext/boost/ratio/config.hpp +6 -0
  165. data/ext/boost/ratio/detail/overflow_helpers.hpp +2 -2
  166. data/ext/boost/smart_ptr/allocate_shared_array.hpp +250 -0
  167. data/ext/boost/smart_ptr/detail/allocate_array_helper.hpp +169 -0
  168. data/ext/boost/smart_ptr/detail/array_deleter.hpp +124 -0
  169. data/ext/boost/smart_ptr/detail/array_traits.hpp +53 -0
  170. data/ext/boost/smart_ptr/detail/array_utility.hpp +178 -0
  171. data/ext/boost/smart_ptr/detail/make_array_helper.hpp +157 -0
  172. data/ext/boost/smart_ptr/detail/operator_bool.hpp +16 -9
  173. data/ext/boost/smart_ptr/detail/shared_count.hpp +78 -7
  174. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +15 -0
  175. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +12 -6
  176. data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +1 -0
  177. data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +1 -0
  178. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +1 -0
  179. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +1 -0
  180. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +1 -0
  181. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +1 -0
  182. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +1 -0
  183. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +1 -0
  184. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +1 -0
  185. data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +1 -0
  186. data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +1 -0
  187. data/ext/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +162 -0
  188. data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +1 -0
  189. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +1 -0
  190. data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +1 -0
  191. data/ext/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +1 -0
  192. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +15 -0
  193. data/ext/boost/smart_ptr/detail/sp_forward.hpp +39 -0
  194. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +19 -3
  195. data/ext/boost/smart_ptr/detail/sp_if_array.hpp +31 -0
  196. data/ext/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
  197. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +5 -12
  198. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +4 -4
  199. data/ext/boost/smart_ptr/make_shared.hpp +5 -1060
  200. data/ext/boost/smart_ptr/make_shared_array.hpp +247 -0
  201. data/ext/boost/smart_ptr/make_shared_object.hpp +1128 -0
  202. data/ext/boost/smart_ptr/scoped_array.hpp +32 -7
  203. data/ext/boost/smart_ptr/scoped_ptr.hpp +31 -5
  204. data/ext/boost/smart_ptr/shared_array.hpp +135 -20
  205. data/ext/boost/smart_ptr/shared_ptr.hpp +444 -126
  206. data/ext/boost/smart_ptr/weak_ptr.hpp +39 -28
  207. data/ext/boost/static_assert.hpp +74 -17
  208. data/ext/boost/system/error_code.hpp +76 -68
  209. data/ext/boost/system/system_error.hpp +5 -1
  210. data/ext/boost/thread/barrier.hpp +6 -2
  211. data/ext/boost/thread/completion_latch.hpp +233 -0
  212. data/ext/boost/thread/condition.hpp +6 -1
  213. data/ext/boost/thread/detail/async_func.hpp +571 -0
  214. data/ext/boost/thread/detail/config.hpp +248 -40
  215. data/ext/boost/thread/detail/counter.hpp +93 -0
  216. data/ext/boost/thread/detail/delete.hpp +12 -0
  217. data/ext/boost/thread/detail/invoke.hpp +1351 -0
  218. data/ext/boost/thread/detail/is_convertible.hpp +48 -0
  219. data/ext/boost/thread/detail/lockable_wrapper.hpp +45 -0
  220. data/ext/boost/thread/detail/log.hpp +83 -0
  221. data/ext/boost/thread/detail/make_tuple_indices.hpp +224 -0
  222. data/ext/boost/thread/detail/move.hpp +32 -16
  223. data/ext/boost/thread/detail/thread.hpp +236 -41
  224. data/ext/boost/thread/detail/thread_group.hpp +55 -9
  225. data/ext/boost/thread/detail/thread_interruption.hpp +4 -1
  226. data/ext/boost/thread/exceptions.hpp +2 -0
  227. data/ext/boost/thread/externally_locked.hpp +351 -0
  228. data/ext/boost/thread/externally_locked_stream.hpp +170 -0
  229. data/ext/boost/thread/future.hpp +2517 -455
  230. data/ext/boost/thread/future_error_code.hpp +61 -0
  231. data/ext/boost/thread/is_locked_by_this_thread.hpp +39 -0
  232. data/ext/boost/thread/latch.hpp +142 -0
  233. data/ext/boost/thread/lock_algorithms.hpp +468 -0
  234. data/ext/boost/thread/lock_concepts.hpp +197 -0
  235. data/ext/boost/thread/lock_factories.hpp +78 -0
  236. data/ext/boost/thread/lock_guard.hpp +88 -0
  237. data/ext/boost/thread/lock_options.hpp +31 -0
  238. data/ext/boost/thread/lock_traits.hpp +45 -0
  239. data/ext/boost/thread/lock_types.hpp +1226 -0
  240. data/ext/boost/thread/lockable_adapter.hpp +226 -0
  241. data/ext/boost/thread/lockable_concepts.hpp +157 -0
  242. data/ext/boost/thread/lockable_traits.hpp +207 -0
  243. data/ext/boost/thread/locks.hpp +5 -1816
  244. data/ext/boost/thread/mutex.hpp +33 -1
  245. data/ext/boost/thread/null_mutex.hpp +243 -0
  246. data/ext/boost/thread/once.hpp +10 -1
  247. data/ext/boost/thread/poly_lockable.hpp +68 -0
  248. data/ext/boost/thread/poly_lockable_adapter.hpp +89 -0
  249. data/ext/boost/thread/poly_shared_lockable.hpp +135 -0
  250. data/ext/boost/thread/poly_shared_lockable_adapter.hpp +170 -0
  251. data/ext/boost/thread/pthread/condition_variable.hpp +74 -26
  252. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +54 -27
  253. data/ext/boost/thread/pthread/mutex.hpp +101 -38
  254. data/ext/boost/thread/pthread/once.hpp +459 -44
  255. data/ext/boost/thread/pthread/once_atomic.hpp +313 -0
  256. data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -10
  257. data/ext/boost/thread/pthread/shared_mutex.hpp +226 -61
  258. data/ext/boost/thread/pthread/shared_mutex_assert.hpp +724 -0
  259. data/ext/boost/thread/pthread/thread_data.hpp +53 -50
  260. data/ext/boost/thread/pthread/timespec.hpp +96 -12
  261. data/ext/boost/thread/recursive_mutex.hpp +44 -1
  262. data/ext/boost/thread/reverse_lock.hpp +3 -2
  263. data/ext/boost/thread/scoped_thread.hpp +285 -0
  264. data/ext/boost/thread/shared_lock_guard.hpp +2 -1
  265. data/ext/boost/thread/shared_mutex.hpp +23 -0
  266. data/ext/boost/thread/strict_lock.hpp +235 -0
  267. data/ext/boost/thread/sync_bounded_queue.hpp +594 -0
  268. data/ext/boost/thread/sync_queue.hpp +516 -0
  269. data/ext/boost/thread/synchronized_value.hpp +1001 -0
  270. data/ext/boost/thread/testable_mutex.hpp +148 -0
  271. data/ext/boost/thread/thread.hpp +1 -13
  272. data/ext/boost/thread/thread_functors.hpp +57 -0
  273. data/ext/boost/thread/thread_guard.hpp +46 -0
  274. data/ext/boost/thread/thread_only.hpp +29 -0
  275. data/ext/boost/thread/v2/shared_mutex.hpp +1062 -0
  276. data/ext/boost/thread/v2/thread.hpp +37 -10
  277. data/ext/boost/thread/xtime.hpp +2 -1
  278. data/ext/boost/token_functions.hpp +16 -16
  279. data/ext/boost/type_traits/add_lvalue_reference.hpp +26 -0
  280. data/ext/boost/type_traits/add_reference.hpp +1 -1
  281. data/ext/boost/type_traits/add_rvalue_reference.hpp +4 -4
  282. data/ext/boost/type_traits/aligned_storage.hpp +13 -0
  283. data/ext/boost/type_traits/common_type.hpp +11 -12
  284. data/ext/boost/type_traits/config.hpp +1 -1
  285. data/ext/boost/type_traits/detail/common_type_imp.hpp +1 -1
  286. data/ext/boost/type_traits/detail/has_binary_operator.hpp +1 -1
  287. data/ext/boost/type_traits/detail/is_function_ptr_tester.hpp +1 -1
  288. data/ext/boost/type_traits/has_left_shift.hpp +49 -0
  289. data/ext/boost/type_traits/has_right_shift.hpp +49 -0
  290. data/ext/boost/type_traits/has_trivial_move_assign.hpp +57 -0
  291. data/ext/boost/type_traits/has_trivial_move_constructor.hpp +57 -0
  292. data/ext/boost/type_traits/intrinsics.hpp +18 -2
  293. data/ext/boost/type_traits/is_abstract.hpp +1 -1
  294. data/ext/boost/type_traits/is_array.hpp +1 -1
  295. data/ext/boost/type_traits/is_const.hpp +1 -1
  296. data/ext/boost/type_traits/is_convertible.hpp +78 -17
  297. data/ext/boost/type_traits/is_function.hpp +6 -1
  298. data/ext/boost/type_traits/is_integral.hpp +6 -1
  299. data/ext/boost/type_traits/is_nothrow_move_assignable.hpp +84 -0
  300. data/ext/boost/type_traits/is_nothrow_move_constructible.hpp +84 -0
  301. data/ext/boost/type_traits/is_pod.hpp +3 -1
  302. data/ext/boost/type_traits/is_rvalue_reference.hpp +1 -1
  303. data/ext/boost/type_traits/is_volatile.hpp +1 -1
  304. data/ext/boost/type_traits/make_signed.hpp +153 -0
  305. data/ext/boost/type_traits/make_unsigned.hpp +16 -0
  306. data/ext/boost/type_traits/remove_const.hpp +1 -1
  307. data/ext/boost/type_traits/remove_cv.hpp +1 -1
  308. data/ext/boost/type_traits/remove_reference.hpp +1 -1
  309. data/ext/boost/type_traits/remove_volatile.hpp +1 -1
  310. data/ext/boost/unordered/detail/allocate.hpp +1120 -0
  311. data/ext/boost/unordered/detail/buckets.hpp +876 -0
  312. data/ext/boost/unordered/detail/equivalent.hpp +680 -0
  313. data/ext/boost/unordered/detail/extract_key.hpp +183 -0
  314. data/ext/boost/unordered/detail/fwd.hpp +23 -0
  315. data/ext/boost/unordered/detail/table.hpp +861 -0
  316. data/ext/boost/unordered/detail/unique.hpp +622 -0
  317. data/ext/boost/unordered/detail/util.hpp +260 -0
  318. data/ext/boost/unordered/unordered_map.hpp +1652 -0
  319. data/ext/boost/unordered/unordered_map_fwd.hpp +65 -0
  320. data/ext/boost/unordered/unordered_set.hpp +1549 -0
  321. data/ext/boost/unordered/unordered_set_fwd.hpp +63 -0
  322. data/ext/boost/unordered_map.hpp +18 -0
  323. data/ext/boost/unordered_set.hpp +18 -0
  324. data/ext/boost/utility/addressof.hpp +2 -2
  325. data/ext/boost/utility/result_of.hpp +8 -1
  326. data/ext/boost/version.hpp +2 -2
  327. data/ext/common/Account.h +1 -1
  328. data/ext/common/AccountsDatabase.h +1 -1
  329. data/ext/common/AgentsStarter.cpp +3 -1
  330. data/ext/common/AgentsStarter.h +2 -2
  331. data/ext/common/ApplicationPool2/AppTypes.cpp +24 -6
  332. data/ext/common/ApplicationPool2/AppTypes.h +17 -8
  333. data/ext/common/ApplicationPool2/Common.h +12 -12
  334. data/ext/common/ApplicationPool2/DirectSpawner.h +2 -2
  335. data/ext/common/ApplicationPool2/DummySpawner.h +3 -3
  336. data/ext/common/ApplicationPool2/Group.h +6 -6
  337. data/ext/common/ApplicationPool2/Implementation.cpp +19 -19
  338. data/ext/common/ApplicationPool2/PipeWatcher.h +5 -5
  339. data/ext/common/ApplicationPool2/Pool.h +21 -21
  340. data/ext/common/ApplicationPool2/Process.h +6 -6
  341. data/ext/common/ApplicationPool2/Session.h +1 -1
  342. data/ext/common/ApplicationPool2/SmartSpawner.h +24 -12
  343. data/ext/common/ApplicationPool2/Socket.h +2 -2
  344. data/ext/common/ApplicationPool2/Spawner.h +64 -14
  345. data/ext/common/ApplicationPool2/SpawnerFactory.h +7 -7
  346. data/ext/common/ApplicationPool2/SuperGroup.h +5 -5
  347. data/ext/common/BackgroundEventLoop.cpp +4 -4
  348. data/ext/common/BackgroundEventLoop.h +1 -1
  349. data/ext/common/Constants.h +13 -1
  350. data/ext/common/EventedBufferedInput.h +8 -8
  351. data/ext/common/Exceptions.cpp +71 -0
  352. data/ext/common/Exceptions.h +60 -7
  353. data/ext/common/FileDescriptor.h +4 -4
  354. data/ext/common/MessageClient.h +1 -1
  355. data/ext/common/MessageServer.h +5 -5
  356. data/ext/common/MultiLibeio.cpp +3 -3
  357. data/ext/common/MultiLibeio.h +2 -2
  358. data/ext/common/RandomGenerator.h +11 -11
  359. data/ext/common/ResourceLocator.h +8 -1
  360. data/ext/common/SafeLibev.h +12 -12
  361. data/ext/common/ServerInstanceDir.h +11 -3
  362. data/ext/common/UnionStation.h +10 -10
  363. data/ext/common/Utils.cpp +11 -13
  364. data/ext/common/Utils.h +9 -9
  365. data/ext/common/Utils/BlockingQueue.h +10 -10
  366. data/ext/common/Utils/BufferedIO.h +1 -1
  367. data/ext/common/Utils/CachedFileStat.hpp +2 -2
  368. data/ext/common/Utils/FileChangeChecker.h +1 -1
  369. data/ext/common/Utils/HashMap.h +13 -4
  370. data/ext/common/Utils/IOUtils.cpp +33 -10
  371. data/ext/common/Utils/IniFile.h +3 -3
  372. data/ext/common/Utils/Lock.h +2 -2
  373. data/ext/common/Utils/MessagePassing.h +10 -10
  374. data/ext/common/Utils/ProcessMetricsCollector.h +24 -6
  375. data/ext/common/Utils/ScopeGuard.h +5 -5
  376. data/ext/common/Utils/jsoncpp.cpp +2 -0
  377. data/ext/common/agents/HelperAgent/FileBackedPipe.h +26 -26
  378. data/ext/common/agents/HelperAgent/Main.cpp +18 -18
  379. data/ext/common/agents/HelperAgent/RequestHandler.cpp +4 -4
  380. data/ext/common/agents/HelperAgent/RequestHandler.h +30 -21
  381. data/ext/common/agents/LoggingAgent/AdminController.h +1 -1
  382. data/ext/common/agents/LoggingAgent/FilterSupport.h +13 -11
  383. data/ext/common/agents/LoggingAgent/LoggingServer.h +11 -11
  384. data/ext/common/agents/LoggingAgent/Main.cpp +9 -9
  385. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  386. data/ext/common/agents/SpawnPreparer.cpp +1 -0
  387. data/ext/common/agents/Watchdog/AgentWatcher.cpp +8 -7
  388. data/ext/common/agents/Watchdog/Main.cpp +81 -73
  389. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +1 -1
  390. data/ext/libev/Changes +57 -0
  391. data/ext/libev/LICENSE +2 -1
  392. data/ext/libev/Makefile.in +110 -50
  393. data/ext/libev/README +8 -8
  394. data/ext/libev/aclocal.m4 +1503 -861
  395. data/ext/libev/config.guess +290 -304
  396. data/ext/libev/config.sub +77 -198
  397. data/ext/libev/configure +1735 -890
  398. data/ext/libev/configure.ac +3 -2
  399. data/ext/libev/ev++.h +6 -6
  400. data/ext/libev/ev.c +541 -214
  401. data/ext/libev/ev.h +106 -100
  402. data/ext/libev/ev_epoll.c +1 -1
  403. data/ext/libev/ev_kqueue.c +20 -4
  404. data/ext/libev/ev_vars.h +15 -16
  405. data/ext/libev/ev_win32.c +12 -2
  406. data/ext/libev/ev_wrap.h +162 -160
  407. data/ext/libev/event.c +29 -6
  408. data/ext/libev/event.h +9 -2
  409. data/ext/libev/ltmain.sh +2632 -1384
  410. data/ext/nginx/ConfigurationCommands.c +1 -1
  411. data/ext/nginx/ConfigurationCommands.c.erb +3 -1
  412. data/ext/nginx/ContentHandler.c +25 -2
  413. data/ext/nginx/CreateLocationConfig.c +1 -0
  414. data/ext/nginx/CreateLocationConfig.c.erb +1 -1
  415. data/ext/nginx/MergeLocationConfig.c +1 -0
  416. data/ext/nginx/MergeLocationConfig.c.erb +1 -1
  417. data/ext/nginx/config +12 -0
  418. data/ext/oxt/dynamic_thread_group.hpp +7 -4
  419. data/ext/oxt/system_calls.cpp +5 -1
  420. data/ext/oxt/system_calls.hpp +3 -0
  421. data/helper-scripts/node-loader.js +117 -249
  422. data/lib/phusion_passenger.rb +27 -5
  423. data/lib/phusion_passenger/abstract_installer.rb +104 -9
  424. data/lib/phusion_passenger/admin_tools/memory_stats.rb +10 -9
  425. data/lib/phusion_passenger/apache2/config_options.rb +6 -3
  426. data/lib/phusion_passenger/common_library.rb +7 -1
  427. data/lib/phusion_passenger/constants.rb +6 -0
  428. data/lib/phusion_passenger/loader_shared_helpers.rb +7 -4
  429. data/lib/phusion_passenger/nginx/config_options.rb +2 -1
  430. data/lib/phusion_passenger/packaging.rb +3 -0
  431. data/lib/phusion_passenger/platform_info/apache.rb +43 -6
  432. data/lib/phusion_passenger/platform_info/apache_detector.rb +15 -5
  433. data/lib/phusion_passenger/platform_info/compiler.rb +167 -32
  434. data/lib/phusion_passenger/platform_info/cxx_portability.rb +133 -77
  435. data/lib/phusion_passenger/platform_info/depcheck.rb +17 -7
  436. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +3 -3
  437. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  438. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -6
  439. data/lib/phusion_passenger/platform_info/linux.rb +2 -1
  440. data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
  441. data/lib/phusion_passenger/platform_info/ruby.rb +18 -3
  442. data/lib/phusion_passenger/standalone/runtime_installer.rb +6 -2
  443. data/lib/phusion_passenger/standalone/start_command.rb +8 -2
  444. data/lib/phusion_passenger/utils/ansi_colors.rb +9 -0
  445. data/lib/phusion_passenger/utils/hosts_file_parser.rb +4 -2
  446. data/node_lib/phusion_passenger/httplib_emulation.js +141 -0
  447. data/node_lib/phusion_passenger/line_reader.js +154 -0
  448. data/node_lib/phusion_passenger/request_handler.js +65 -0
  449. data/node_lib/phusion_passenger/session_protocol_parser.js +113 -0
  450. data/resources/templates/apache2/deployment_example.txt.erb +2 -1
  451. data/resources/templates/apache2/installing_against_a_different_apache.txt.erb +14 -0
  452. data/resources/templates/apache2/multiple_apache_installations_detected.txt.erb +15 -0
  453. data/resources/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  454. data/resources/templates/general_error_with_html.html.template +1 -1
  455. data/resources/templates/installer_common/gem_install_permission_problems.txt.erb +17 -0
  456. data/resources/templates/installer_common/low_amount_of_memory_warning.txt.erb +6 -4
  457. data/resources/templates/installer_common/world_inaccessible_directories.txt.erb +16 -0
  458. data/resources/templates/nginx/deployment_example.txt.erb +2 -1
  459. data/resources/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  460. data/resources/templates/standalone/config.erb +1 -0
  461. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -3
  462. data/test/cxx/ApplicationPool2/PoolTest.cpp +4 -4
  463. data/test/cxx/ApplicationPool2/ProcessTest.cpp +5 -5
  464. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -5
  465. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +1 -1
  466. data/test/cxx/EventedBufferedInputTest.cpp +6 -6
  467. data/test/cxx/FileBackedPipeTest.cpp +1 -1
  468. data/test/cxx/MessagePassingTest.cpp +1 -1
  469. data/test/cxx/MessageServerTest.cpp +4 -4
  470. data/test/cxx/RequestHandlerTest.cpp +7 -7
  471. data/test/cxx/UnionStationTest.cpp +2 -2
  472. data/test/node/line_reader_spec.js +338 -0
  473. data/test/node/spec_helper.js +27 -0
  474. data/test/ruby/standalone/runtime_installer_spec.rb +2 -1
  475. metadata +131 -22
  476. metadata.gz.asc +7 -7
  477. data/ext/boost/functional/hash/detail/container_fwd_0x.hpp +0 -29
  478. data/ext/boost/lambda/core.hpp +0 -79
  479. data/ext/boost/lambda/detail/actions.hpp +0 -174
  480. data/ext/boost/lambda/detail/arity_code.hpp +0 -110
  481. data/ext/boost/lambda/detail/function_adaptors.hpp +0 -789
  482. data/ext/boost/lambda/detail/is_instance_of.hpp +0 -104
  483. data/ext/boost/lambda/detail/lambda_config.hpp +0 -48
  484. data/ext/boost/lambda/detail/lambda_functor_base.hpp +0 -615
  485. data/ext/boost/lambda/detail/lambda_functors.hpp +0 -324
  486. data/ext/boost/lambda/detail/lambda_fwd.hpp +0 -74
  487. data/ext/boost/lambda/detail/lambda_traits.hpp +0 -578
  488. data/ext/boost/lambda/detail/member_ptr.hpp +0 -737
  489. data/ext/boost/lambda/detail/operator_actions.hpp +0 -139
  490. data/ext/boost/lambda/detail/operator_lambda_func_base.hpp +0 -271
  491. data/ext/boost/lambda/detail/operator_return_type_traits.hpp +0 -917
  492. data/ext/boost/lambda/detail/operators.hpp +0 -370
  493. data/ext/boost/lambda/detail/ret.hpp +0 -325
  494. data/ext/boost/lambda/detail/return_type_traits.hpp +0 -282
  495. data/ext/boost/lambda/detail/select_functions.hpp +0 -74
  496. data/ext/boost/lambda/lambda.hpp +0 -34
@@ -0,0 +1,24 @@
1
+ #include <boost/atomic.hpp>
2
+
3
+ // Copyright (c) 2011 Helge Bahmann
4
+ //
5
+ // Distributed under the Boost Software License, Version 1.0.
6
+ // See accompanying file LICENSE_1_0.txt or copy at
7
+ // http://www.boost.org/LICENSE_1_0.txt)
8
+
9
+ namespace boost {
10
+ namespace atomics {
11
+ namespace detail {
12
+
13
+ static lockpool::lock_type lock_pool_[41];
14
+
15
+ // NOTE: This function must NOT be inline. Otherwise MSVC 9 will sometimes generate broken code for modulus operation which result in crashes.
16
+ BOOST_ATOMIC_DECL lockpool::lock_type& lockpool::get_lock_for(const volatile void* addr)
17
+ {
18
+ std::size_t index = reinterpret_cast<std::size_t>(addr) % (sizeof(lock_pool_) / sizeof(*lock_pool_));
19
+ return lock_pool_[index];
20
+ }
21
+
22
+ }
23
+ }
24
+ }
@@ -22,9 +22,6 @@
22
22
  #include <cstdlib>
23
23
  #include <cassert>
24
24
 
25
- using namespace boost::system;
26
- using namespace boost::system::errc;
27
-
28
25
  #include <cstring> // for strerror/strerror_r
29
26
 
30
27
  # if defined( BOOST_WINDOWS_API )
@@ -36,19 +33,21 @@ using namespace boost::system::errc;
36
33
  # endif
37
34
 
38
35
  //----------------------------------------------------------------------------//
36
+ namespace boost
37
+ {
38
+ namespace system
39
+ {
39
40
 
40
41
  namespace
41
42
  {
42
- #if defined(__PGI)
43
- using boost::system::errc::invalid_argument;
44
- #endif
43
+
45
44
  // standard error categories ---------------------------------------------//
46
45
 
47
46
  class generic_error_category : public error_category
48
47
  {
49
48
  public:
50
49
  generic_error_category(){}
51
- const char * name() const;
50
+ const char * name() const BOOST_SYSTEM_NOEXCEPT;
52
51
  std::string message( int ev ) const;
53
52
  };
54
53
 
@@ -56,20 +55,25 @@ namespace
56
55
  {
57
56
  public:
58
57
  system_error_category(){}
59
- const char * name() const;
58
+ const char * name() const BOOST_SYSTEM_NOEXCEPT;
60
59
  std::string message( int ev ) const;
61
- error_condition default_error_condition( int ev ) const;
60
+ error_condition default_error_condition( int ev ) const BOOST_SYSTEM_NOEXCEPT;
62
61
  };
63
62
 
64
63
  // generic_error_category implementation ---------------------------------//
65
64
 
66
- const char * generic_error_category::name() const
65
+ const char * generic_error_category::name() const BOOST_SYSTEM_NOEXCEPT
67
66
  {
68
67
  return "generic";
69
68
  }
70
69
 
71
70
  std::string generic_error_category::message( int ev ) const
72
71
  {
72
+ using namespace boost::system::errc;
73
+ #if defined(__PGI)
74
+ using boost::system::errc::invalid_argument;
75
+ #endif
76
+
73
77
  static std::string unknown_err( "Unknown error" );
74
78
  // strerror_r is preferred because it is always thread safe,
75
79
  // however, we fallback to strerror in certain cases because:
@@ -133,7 +137,9 @@ namespace
133
137
  }
134
138
  }
135
139
  std::string msg;
140
+ # ifndef BOOST_NO_EXCEPTIONS
136
141
  try
142
+ # endif
137
143
  {
138
144
  msg = ( ( result == invalid_argument ) ? "Unknown error" : bp );
139
145
  }
@@ -154,13 +160,18 @@ namespace
154
160
  }
155
161
  // system_error_category implementation --------------------------------//
156
162
 
157
- const char * system_error_category::name() const
163
+ const char * system_error_category::name() const BOOST_SYSTEM_NOEXCEPT
158
164
  {
159
165
  return "system";
160
166
  }
161
167
 
162
- error_condition system_error_category::default_error_condition( int ev ) const
168
+ error_condition system_error_category::default_error_condition( int ev ) const BOOST_SYSTEM_NOEXCEPT
163
169
  {
170
+ using namespace boost::system::errc;
171
+ #if defined(__PGI)
172
+ using boost::system::errc::invalid_argument;
173
+ #endif
174
+
164
175
  switch ( ev )
165
176
  {
166
177
  case 0: return make_error_condition( success );
@@ -401,10 +412,6 @@ namespace
401
412
 
402
413
  } // unnamed namespace
403
414
 
404
- namespace boost
405
- {
406
- namespace system
407
- {
408
415
 
409
416
  # ifndef BOOST_SYSTEM_NO_DEPRECATED
410
417
  BOOST_SYSTEM_DECL error_code throws; // "throw on error" special error_code;
@@ -414,13 +421,13 @@ namespace boost
414
421
  // address for comparison purposes
415
422
  # endif
416
423
 
417
- BOOST_SYSTEM_DECL const error_category & system_category()
424
+ BOOST_SYSTEM_DECL const error_category & system_category() BOOST_SYSTEM_NOEXCEPT
418
425
  {
419
426
  static const system_error_category system_category_const;
420
427
  return system_category_const;
421
428
  }
422
429
 
423
- BOOST_SYSTEM_DECL const error_category & generic_category()
430
+ BOOST_SYSTEM_DECL const error_category & generic_category() BOOST_SYSTEM_NOEXCEPT
424
431
  {
425
432
  static const generic_error_category generic_category_const;
426
433
  return generic_category_const;
@@ -7,7 +7,7 @@
7
7
  #ifndef BOOST_NO_EXCEPTIONS
8
8
 
9
9
 
10
- #include <boost/thread/future.hpp>
10
+ #include <boost/thread/future_error_code.hpp>
11
11
 
12
12
  namespace boost
13
13
  {
@@ -19,12 +19,12 @@ namespace boost
19
19
  public boost::system::error_category
20
20
  {
21
21
  public:
22
- virtual const char* name() const; //BOOST_NOEXCEPT;
22
+ virtual const char* name() const BOOST_NOEXCEPT;
23
23
  virtual std::string message(int ev) const;
24
24
  };
25
25
 
26
26
  const char*
27
- future_error_category::name() const //BOOST_NOEXCEPT
27
+ future_error_category::name() const BOOST_NOEXCEPT
28
28
  {
29
29
  return "future";
30
30
  }
@@ -48,14 +48,16 @@ namespace boost
48
48
  }
49
49
  return std::string("unspecified future_errc value\n");
50
50
  }
51
+ future_error_category future_error_category_var;
51
52
  }
52
53
 
54
+ BOOST_THREAD_DECL
53
55
  const system::error_category&
54
56
  future_category() BOOST_NOEXCEPT
55
57
  {
56
- static thread_detail::future_error_category f;
57
- return f;
58
+ return thread_detail::future_error_category_var;
58
59
  }
59
60
 
60
61
  }
61
62
  #endif
63
+
@@ -3,7 +3,12 @@
3
3
  // Distributed under the Boost Software License, Version 1.0. (See accompanying
4
4
  // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
5
 
6
+ #include <boost/thread/detail/config.hpp>
7
+ #ifdef BOOST_THREAD_ONCE_ATOMIC
8
+ #include "./once_atomic.cpp"
9
+ #else
6
10
  #define __STDC_CONSTANT_MACROS
11
+ #include <boost/thread/pthread/pthread_mutex_scoped_lock.hpp>
7
12
  #include <boost/thread/once.hpp>
8
13
  #include <boost/assert.hpp>
9
14
  #include <pthread.h>
@@ -12,9 +17,9 @@
12
17
 
13
18
  namespace boost
14
19
  {
15
- namespace detail
20
+ namespace thread_detail
16
21
  {
17
- BOOST_THREAD_DECL thread_detail::uintmax_atomic_t once_global_epoch=BOOST_THREAD_DETAIL_UINTMAX_ATOMIC_MAX_C;
22
+ BOOST_THREAD_DECL uintmax_atomic_t once_global_epoch=BOOST_THREAD_DETAIL_UINTMAX_ATOMIC_MAX_C;
18
23
  BOOST_THREAD_DECL pthread_mutex_t once_epoch_mutex=PTHREAD_MUTEX_INITIALIZER;
19
24
  BOOST_THREAD_DECL pthread_cond_t once_epoch_cv = PTHREAD_COND_INITIALIZER;
20
25
 
@@ -55,7 +60,7 @@ namespace boost
55
60
  #endif
56
61
  }
57
62
 
58
- thread_detail::uintmax_atomic_t& get_once_per_thread_epoch()
63
+ uintmax_atomic_t& get_once_per_thread_epoch()
59
64
  {
60
65
  BOOST_VERIFY(!pthread_once(&epoch_tss_key_flag,create_epoch_tss_key));
61
66
  void* data=pthread_getspecific(epoch_tss_key);
@@ -70,3 +75,4 @@ namespace boost
70
75
  }
71
76
 
72
77
  }
78
+ #endif //
@@ -0,0 +1,90 @@
1
+ // (C) Copyright 2013 Andrey Semashev
2
+ // (C) Copyright 2013 Vicente J. Botet Escriba
3
+ //
4
+ // Distributed under the Boost Software License, Version 1.0. (See accompanying
5
+ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
+
7
+ //#define __STDC_CONSTANT_MACROS
8
+ #include <boost/thread/detail/config.hpp>
9
+ #include <boost/thread/once.hpp>
10
+ #include <boost/thread/pthread/pthread_mutex_scoped_lock.hpp>
11
+ #include <boost/assert.hpp>
12
+ #include <boost/static_assert.hpp>
13
+ #include <boost/atomic.hpp>
14
+ #include <boost/memory_order.hpp>
15
+ #include <pthread.h>
16
+
17
+ namespace boost
18
+ {
19
+ namespace thread_detail
20
+ {
21
+
22
+ enum flag_states
23
+ {
24
+ uninitialized, in_progress, initialized
25
+ };
26
+
27
+
28
+ #ifndef BOOST_THREAD_PROVIDES_ONCE_CXX11
29
+ BOOST_STATIC_ASSERT_MSG(sizeof(atomic_int_type) == sizeof(atomic_type), "Boost.Thread: unsupported platform");
30
+ #endif
31
+
32
+ static pthread_mutex_t once_mutex = PTHREAD_MUTEX_INITIALIZER;
33
+ static pthread_cond_t once_cv = PTHREAD_COND_INITIALIZER;
34
+
35
+ BOOST_THREAD_DECL bool enter_once_region(once_flag& flag) BOOST_NOEXCEPT
36
+ {
37
+ atomic_type& f = get_atomic_storage(flag);
38
+ if (f.load(memory_order_acquire) != initialized)
39
+ {
40
+ pthread::pthread_mutex_scoped_lock lk(&once_mutex);
41
+ if (f.load(memory_order_acquire) != initialized)
42
+ {
43
+ while (true)
44
+ {
45
+ atomic_int_type expected = uninitialized;
46
+ if (f.compare_exchange_strong(expected, in_progress, memory_order_acq_rel, memory_order_acquire))
47
+ {
48
+ // We have set the flag to in_progress
49
+ return true;
50
+ }
51
+ else if (expected == initialized)
52
+ {
53
+ // Another thread managed to complete the initialization
54
+ return false;
55
+ }
56
+ else
57
+ {
58
+ // Wait until the initialization is complete
59
+ //pthread::pthread_mutex_scoped_lock lk(&once_mutex);
60
+ BOOST_VERIFY(!pthread_cond_wait(&once_cv, &once_mutex));
61
+ }
62
+ }
63
+ }
64
+ }
65
+ return false;
66
+ }
67
+
68
+ BOOST_THREAD_DECL void commit_once_region(once_flag& flag) BOOST_NOEXCEPT
69
+ {
70
+ atomic_type& f = get_atomic_storage(flag);
71
+ {
72
+ pthread::pthread_mutex_scoped_lock lk(&once_mutex);
73
+ f.store(initialized, memory_order_release);
74
+ }
75
+ BOOST_VERIFY(!pthread_cond_broadcast(&once_cv));
76
+ }
77
+
78
+ BOOST_THREAD_DECL void rollback_once_region(once_flag& flag) BOOST_NOEXCEPT
79
+ {
80
+ atomic_type& f = get_atomic_storage(flag);
81
+ {
82
+ pthread::pthread_mutex_scoped_lock lk(&once_mutex);
83
+ f.store(uninitialized, memory_order_release);
84
+ }
85
+ BOOST_VERIFY(!pthread_cond_broadcast(&once_cv));
86
+ }
87
+
88
+ } // namespace thread_detail
89
+
90
+ } // namespace boost
@@ -1,20 +1,22 @@
1
1
  // Copyright (C) 2001-2003
2
2
  // William E. Kempf
3
3
  // Copyright (C) 2007-8 Anthony Williams
4
- // (C) Copyright 2011 Vicente J. Botet Escriba
4
+ // (C) Copyright 2011-2012 Vicente J. Botet Escriba
5
5
  //
6
6
  // Distributed under the Boost Software License, Version 1.0. (See accompanying
7
7
  // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8
8
 
9
9
  #include <boost/thread/detail/config.hpp>
10
10
 
11
- #include <boost/thread/thread.hpp>
11
+ #include <boost/thread/thread_only.hpp>
12
+ #if defined BOOST_THREAD_USES_DATETIME
12
13
  #include <boost/thread/xtime.hpp>
14
+ #endif
13
15
  #include <boost/thread/condition_variable.hpp>
14
16
  #include <boost/thread/locks.hpp>
15
17
  #include <boost/thread/once.hpp>
16
18
  #include <boost/thread/tss.hpp>
17
- #include <boost/throw_exception.hpp>
19
+ #include <boost/thread/future.hpp>
18
20
 
19
21
  #ifdef __GLIBC__
20
22
  #include <sys/sysinfo.h>
@@ -33,14 +35,17 @@ namespace boost
33
35
  {
34
36
  thread_data_base::~thread_data_base()
35
37
  {
36
- {
37
38
  for (notify_list_t::iterator i = notify.begin(), e = notify.end();
38
39
  i != e; ++i)
39
40
  {
40
41
  i->second->unlock();
41
42
  i->first->notify_all();
42
43
  }
43
- }
44
+ for (async_states_t::iterator i = async_states_.begin(), e = async_states_.end();
45
+ i != e; ++i)
46
+ {
47
+ (*i)->make_ready();
48
+ }
44
49
  }
45
50
 
46
51
  struct thread_exit_callback_node
@@ -72,6 +77,7 @@ namespace boost
72
77
  {
73
78
  while(!thread_info->tss_data.empty() || thread_info->thread_exit_callbacks)
74
79
  {
80
+
75
81
  while(thread_info->thread_exit_callbacks)
76
82
  {
77
83
  detail::thread_exit_callback_node* const current_node=thread_info->thread_exit_callbacks;
@@ -97,7 +103,10 @@ namespace boost
97
103
  thread_info->tss_data.erase(current);
98
104
  }
99
105
  }
100
- thread_info->self.reset();
106
+ if (thread_info) // fixme: should we test this?
107
+ {
108
+ thread_info->self.reset();
109
+ }
101
110
  }
102
111
  }
103
112
  }
@@ -148,26 +157,33 @@ namespace boost
148
157
  boost::detail::thread_data_ptr thread_info = static_cast<boost::detail::thread_data_base*>(param)->self;
149
158
  thread_info->self.reset();
150
159
  detail::set_current_thread_data(thread_info.get());
160
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
151
161
  BOOST_TRY
152
162
  {
163
+ #endif
153
164
  thread_info->run();
165
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
166
+
154
167
  }
155
168
  BOOST_CATCH (thread_interrupted const&)
156
169
  {
157
170
  }
158
- BOOST_CATCH_END
159
171
  // Removed as it stops the debugger identifying the cause of the exception
160
172
  // Unhandled exceptions still cause the application to terminate
161
173
  // BOOST_CATCH(...)
162
174
  // {
175
+ // throw;
176
+ //
163
177
  // std::terminate();
164
178
  // }
165
-
179
+ BOOST_CATCH_END
180
+ #endif
166
181
  detail::tls_destructor(thread_info.get());
167
182
  detail::set_current_thread_data(0);
168
183
  boost::lock_guard<boost::mutex> lock(thread_info->data_mutex);
169
184
  thread_info->done=true;
170
185
  thread_info->done_condition.notify_all();
186
+
171
187
  return 0;
172
188
  }
173
189
  }
@@ -177,7 +193,9 @@ namespace boost
177
193
  {
178
194
  externally_launched_thread()
179
195
  {
196
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
180
197
  interrupt_enabled=false;
198
+ #endif
181
199
  }
182
200
 
183
201
  void run()
@@ -215,18 +233,20 @@ namespace boost
215
233
  thread::thread() BOOST_NOEXCEPT
216
234
  {}
217
235
 
218
- void thread::start_thread()
236
+ bool thread::start_thread_noexcept()
219
237
  {
220
238
  thread_info->self=thread_info;
221
239
  int const res = pthread_create(&thread_info->thread_handle, 0, &thread_proxy, thread_info.get());
222
240
  if (res != 0)
223
241
  {
224
242
  thread_info->self.reset();
225
- boost::throw_exception(thread_resource_error(res, "boost thread: failed in pthread_create"));
243
+ return false;
244
+ // boost::throw_exception(thread_resource_error(res, "boost thread: failed in pthread_create"));
226
245
  }
246
+ return true;
227
247
  }
228
248
 
229
- void thread::start_thread(const attributes& attr)
249
+ bool thread::start_thread_noexcept(const attributes& attr)
230
250
  {
231
251
  thread_info->self=thread_info;
232
252
  const attributes::native_handle_type* h = attr.native_handle();
@@ -234,14 +254,16 @@ namespace boost
234
254
  if (res != 0)
235
255
  {
236
256
  thread_info->self.reset();
237
- boost::throw_exception(thread_resource_error());
257
+ return false;
258
+ // boost::throw_exception(thread_resource_error(res, "boost thread: failed in pthread_create"));
238
259
  }
239
260
  int detached_state;
240
261
  res = pthread_attr_getdetachstate(h, &detached_state);
241
262
  if (res != 0)
242
263
  {
243
264
  thread_info->self.reset();
244
- boost::throw_exception(thread_resource_error());
265
+ return false;
266
+ // boost::throw_exception(thread_resource_error(res, "boost thread: failed in pthread_attr_getdetachstate"));
245
267
  }
246
268
  if (PTHREAD_CREATE_DETACHED==detached_state)
247
269
  {
@@ -259,6 +281,7 @@ namespace boost
259
281
  }
260
282
  }
261
283
  }
284
+ return true;
262
285
  }
263
286
 
264
287
 
@@ -268,12 +291,8 @@ namespace boost
268
291
  return thread_info;
269
292
  }
270
293
 
271
- void thread::join()
294
+ bool thread::join_noexcept()
272
295
  {
273
- if (this_thread::get_id() == get_id())
274
- {
275
- boost::throw_exception(thread_resource_error(system::errc::resource_deadlock_would_occur, "boost thread: trying joining itself"));
276
- }
277
296
  detail::thread_data_ptr const local_thread_info=(get_thread_info)();
278
297
  if(local_thread_info)
279
298
  {
@@ -312,21 +331,16 @@ namespace boost
312
331
  {
313
332
  thread_info.reset();
314
333
  }
334
+ return true;
315
335
  }
316
336
  else
317
337
  {
318
- #ifdef BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED
319
- boost::throw_exception(thread_resource_error(system::errc::invalid_argument, "boost thread: thread not joinable"));
320
- #endif
338
+ return false;
321
339
  }
322
340
  }
323
341
 
324
- bool thread::do_try_join_until(struct timespec const &timeout)
342
+ bool thread::do_try_join_until_noexcept(struct timespec const &timeout, bool& res)
325
343
  {
326
- if (this_thread::get_id() == get_id())
327
- {
328
- boost::throw_exception(thread_resource_error(system::errc::resource_deadlock_would_occur, "boost thread: trying joining itself"));
329
- }
330
344
  detail::thread_data_ptr const local_thread_info=(get_thread_info)();
331
345
  if(local_thread_info)
332
346
  {
@@ -336,9 +350,10 @@ namespace boost
336
350
  unique_lock<mutex> lock(local_thread_info->data_mutex);
337
351
  while(!local_thread_info->done)
338
352
  {
339
- if(!local_thread_info->done_condition.do_timed_wait(lock,timeout))
353
+ if(!local_thread_info->done_condition.do_wait_until(lock,timeout))
340
354
  {
341
- return false;
355
+ res=false;
356
+ return true;
342
357
  }
343
358
  }
344
359
  do_join=!local_thread_info->join_started;
@@ -368,19 +383,18 @@ namespace boost
368
383
  {
369
384
  thread_info.reset();
370
385
  }
386
+ res=true;
371
387
  return true;
372
388
  }
373
389
  else
374
390
  {
375
- #ifdef BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED
376
- boost::throw_exception(thread_resource_error(system::errc::invalid_argument, "boost thread: thread not joinable"));
377
- #endif
391
+ return false;
378
392
  }
379
393
  }
380
394
 
381
395
  bool thread::joinable() const BOOST_NOEXCEPT
382
396
  {
383
- return (get_thread_info)();
397
+ return (get_thread_info)()?true:false;
384
398
  }
385
399
 
386
400
 
@@ -403,61 +417,104 @@ namespace boost
403
417
 
404
418
  namespace this_thread
405
419
  {
406
-
407
- #ifdef __DECXXX
408
- /// Workaround of DECCXX issue of incorrect template substitution
409
- template<>
410
- #endif
411
- void sleep(const system_time& st)
420
+ namespace hiden
421
+ {
422
+ void BOOST_THREAD_DECL sleep_for(const timespec& ts)
412
423
  {
413
- detail::thread_data_base* const thread_info=detail::get_current_thread_data();
424
+ boost::detail::thread_data_base* const thread_info=boost::detail::get_current_thread_data();
414
425
 
415
426
  if(thread_info)
416
427
  {
417
- unique_lock<mutex> lk(thread_info->sleep_mutex);
418
- while(thread_info->sleep_condition.timed_wait(lk,st)) {}
428
+ unique_lock<mutex> lk(thread_info->sleep_mutex);
429
+ while( thread_info->sleep_condition.do_wait_for(lk,ts)) {}
419
430
  }
420
431
  else
421
432
  {
422
- xtime const xt=get_xtime(st);
423
433
 
434
+ if (boost::detail::timespec_ge(ts, boost::detail::timespec_zero()))
435
+ {
436
+
437
+ # if defined(BOOST_HAS_PTHREAD_DELAY_NP)
438
+ # if defined(__IBMCPP__)
439
+ BOOST_VERIFY(!pthread_delay_np(const_cast<timespec*>(&ts)));
440
+ # else
441
+ BOOST_VERIFY(!pthread_delay_np(&ts));
442
+ # endif
443
+ # elif defined(BOOST_HAS_NANOSLEEP)
444
+ // nanosleep takes a timespec that is an offset, not
445
+ // an absolute time.
446
+ nanosleep(&ts, 0);
447
+ # else
448
+ mutex mx;
449
+ unique_lock<mutex> lock(mx);
450
+ condition_variable cond;
451
+ cond.do_wait_for(lock, ts);
452
+ # endif
453
+ }
454
+ }
455
+ }
456
+
457
+ void BOOST_THREAD_DECL sleep_until(const timespec& ts)
458
+ {
459
+ boost::detail::thread_data_base* const thread_info=boost::detail::get_current_thread_data();
460
+
461
+ if(thread_info)
462
+ {
463
+ unique_lock<mutex> lk(thread_info->sleep_mutex);
464
+ while(thread_info->sleep_condition.do_wait_until(lk,ts)) {}
465
+ }
466
+ else
467
+ {
468
+ timespec now = boost::detail::timespec_now();
469
+ if (boost::detail::timespec_gt(ts, now))
470
+ {
424
471
  for (int foo=0; foo < 5; ++foo)
425
472
  {
426
- # if defined(BOOST_HAS_PTHREAD_DELAY_NP)
427
- timespec ts;
428
- to_timespec_duration(xt, ts);
429
- BOOST_VERIFY(!pthread_delay_np(&ts));
430
- # elif defined(BOOST_HAS_NANOSLEEP)
431
- timespec ts;
432
- to_timespec_duration(xt, ts);
433
-
434
- // nanosleep takes a timespec that is an offset, not
435
- // an absolute time.
436
- nanosleep(&ts, 0);
437
- # else
438
- mutex mx;
439
- mutex::scoped_lock lock(mx);
440
- condition cond;
441
- cond.timed_wait(lock, xt);
442
- # endif
443
- xtime cur;
444
- xtime_get(&cur, TIME_UTC_);
445
- if (xtime_cmp(xt, cur) <= 0)
446
- return;
473
+
474
+ # if defined(BOOST_HAS_PTHREAD_DELAY_NP)
475
+ timespec d = boost::detail::timespec_minus(ts, now);
476
+ BOOST_VERIFY(!pthread_delay_np(&d));
477
+ # elif defined(BOOST_HAS_NANOSLEEP)
478
+ // nanosleep takes a timespec that is an offset, not
479
+ // an absolute time.
480
+ timespec d = boost::detail::timespec_minus(ts, now);
481
+ nanosleep(&d, 0);
482
+ # else
483
+ mutex mx;
484
+ unique_lock<mutex> lock(mx);
485
+ condition_variable cond;
486
+ cond.do_wait_until(lock, ts);
487
+ # endif
488
+ timespec now2 = boost::detail::timespec_now();
489
+ if (boost::detail::timespec_ge(now2, ts))
490
+ {
491
+ return;
492
+ }
447
493
  }
494
+ }
448
495
  }
449
496
  }
450
-
497
+ } // hiden
498
+ } // this_thread
499
+ namespace this_thread
500
+ {
451
501
  void yield() BOOST_NOEXCEPT
452
502
  {
453
503
  # if defined(BOOST_HAS_SCHED_YIELD)
454
504
  BOOST_VERIFY(!sched_yield());
455
505
  # elif defined(BOOST_HAS_PTHREAD_YIELD)
456
506
  BOOST_VERIFY(!pthread_yield());
507
+ //# elif defined BOOST_THREAD_USES_DATETIME
508
+ // xtime xt;
509
+ // xtime_get(&xt, TIME_UTC_);
510
+ // sleep(xt);
511
+ // sleep_for(chrono::milliseconds(0));
457
512
  # else
458
- xtime xt;
459
- xtime_get(&xt, TIME_UTC_);
460
- sleep(xt);
513
+ #error
514
+ timespec ts;
515
+ ts.tv_sec= 0;
516
+ ts.tv_nsec= 0;
517
+ hiden::sleep_for(ts);
461
518
  # endif
462
519
  }
463
520
  }
@@ -479,24 +536,7 @@ namespace boost
479
536
  #endif
480
537
  }
481
538
 
482
- thread::id thread::get_id() const BOOST_NOEXCEPT
483
- {
484
- #if defined BOOST_THREAD_PROVIDES_BASIC_THREAD_ID
485
- //return local_thread_info->thread_handle;
486
- return const_cast<thread*>(this)->native_handle();
487
- #else
488
- detail::thread_data_ptr const local_thread_info=(get_thread_info)();
489
- if(local_thread_info)
490
- {
491
- return id(local_thread_info);
492
- }
493
- else
494
- {
495
- return id();
496
- }
497
- #endif
498
- }
499
-
539
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
500
540
  void thread::interrupt()
501
541
  {
502
542
  detail::thread_data_ptr const local_thread_info=(get_thread_info)();
@@ -525,6 +565,7 @@ namespace boost
525
565
  return false;
526
566
  }
527
567
  }
568
+ #endif
528
569
 
529
570
  thread::native_handle_type thread::native_handle()
530
571
  {
@@ -542,18 +583,9 @@ namespace boost
542
583
 
543
584
 
544
585
 
586
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
545
587
  namespace this_thread
546
588
  {
547
- thread::id get_id() BOOST_NOEXCEPT
548
- {
549
- #if defined BOOST_THREAD_PROVIDES_BASIC_THREAD_ID
550
- return pthread_self();
551
- #else
552
- boost::detail::thread_data_base* const thread_info=get_or_make_current_thread_data();
553
- return thread::id(thread_info?thread_info->shared_from_this():detail::thread_data_ptr());
554
- #endif
555
- }
556
-
557
589
  void interruption_point()
558
590
  {
559
591
  #ifndef BOOST_NO_EXCEPTIONS
@@ -623,6 +655,7 @@ namespace boost
623
655
  }
624
656
  }
625
657
  }
658
+ #endif
626
659
 
627
660
  namespace detail
628
661
  {
@@ -698,6 +731,7 @@ namespace boost
698
731
  }
699
732
  }
700
733
  }
734
+
701
735
  BOOST_THREAD_DECL void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk)
702
736
  {
703
737
  detail::thread_data_base* const current_thread_data(detail::get_current_thread_data());