passenger 6.0.23 → 6.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +26 -1
  3. data/Rakefile +7 -3
  4. data/bin/passenger-install-apache2-module +5 -0
  5. data/bin/passenger-install-nginx-module +17 -2
  6. data/build/apache2.rb +1 -1
  7. data/build/basics.rb +10 -4
  8. data/build/cxx_tests.rb +18 -7
  9. data/build/support/cxx_dependency_map.rb +40 -6
  10. data/build/test_basics.rb +4 -12
  11. data/package.json +1 -1
  12. data/passenger.gemspec +1 -1
  13. data/src/agent/Core/ApplicationPool/Group/InitializationAndShutdown.cpp +8 -0
  14. data/src/agent/Core/ApplicationPool/Group/InternalUtils.cpp +10 -2
  15. data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +8 -0
  16. data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +9 -0
  17. data/src/agent/Core/ApplicationPool/Group/OutOfBandWork.cpp +9 -0
  18. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +63 -50
  19. data/src/agent/Core/ApplicationPool/Group/SessionManagement.cpp +19 -9
  20. data/src/agent/Core/ApplicationPool/Group/SpawningAndRestarting.cpp +8 -0
  21. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +8 -0
  22. data/src/agent/Core/ApplicationPool/Group/Verification.cpp +8 -0
  23. data/src/agent/Core/ApplicationPool/Group.h +15 -5
  24. data/src/agent/Core/ApplicationPool/Pool/AnalyticsCollection.cpp +5 -0
  25. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +5 -0
  26. data/src/agent/Core/ApplicationPool/Pool/GeneralUtils.cpp +5 -0
  27. data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +5 -0
  28. data/src/agent/Core/ApplicationPool/Pool/InitializationAndShutdown.cpp +5 -0
  29. data/src/agent/Core/ApplicationPool/Pool/Miscellaneous.cpp +5 -0
  30. data/src/agent/Core/ApplicationPool/Pool/ProcessUtils.cpp +5 -0
  31. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +11 -1
  32. data/src/agent/Core/ApplicationPool/Pool.h +0 -2
  33. data/src/agent/Core/ApplicationPool/Process.h +22 -6
  34. data/src/agent/Core/ApplicationPool/Session.h +6 -1
  35. data/src/agent/Core/Config.h +7 -3
  36. data/src/agent/Core/Controller/Config.h +1 -1
  37. data/src/agent/Core/CoreMain.cpp +10 -17
  38. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -53
  39. data/src/agent/Core/SpawningKit/Handshake/Session.h +3 -0
  40. data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +5 -2
  41. data/src/agent/Core/SpawningKit/SmartSpawner.h +6 -2
  42. data/src/agent/Core/SpawningKit/Spawner.h +4 -0
  43. data/src/agent/Shared/Fundamentals/AbortHandler.cpp +88 -9
  44. data/src/agent/Shared/Fundamentals/AbortHandler.h +2 -0
  45. data/src/agent/Shared/Fundamentals/Initialization.cpp +9 -3
  46. data/src/agent/Shared/Fundamentals/Initialization.h +3 -3
  47. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +6 -7
  48. data/src/agent/Watchdog/Config.h +1 -1
  49. data/src/agent/Watchdog/WatchdogMain.cpp +4 -7
  50. data/src/apache2_module/ConfigGeneral/ManifestGeneration.h +5 -3
  51. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +3 -0
  52. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h.cxxcodebuilder +3 -0
  53. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +2 -1
  54. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h.cxxcodebuilder +2 -1
  55. data/src/cxx_supportlib/Constants.h +1 -1
  56. data/src/cxx_supportlib/DataStructures/StringMap.h +0 -1
  57. data/src/cxx_supportlib/FileTools/PathManip.cpp +1 -1
  58. data/src/cxx_supportlib/SafeLibev.h +1 -3
  59. data/src/cxx_supportlib/ServerKit/Hooks.h +2 -2
  60. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +0 -1
  61. data/src/cxx_supportlib/ServerKit/HttpServer.h +15 -10
  62. data/src/cxx_supportlib/ServerKit/Server.h +0 -6
  63. data/src/cxx_supportlib/Utils/AsyncSignalSafeUtils.h +2 -0
  64. data/src/cxx_supportlib/Utils/SpeedMeter.h +0 -3
  65. data/src/cxx_supportlib/oxt/implementation.cpp +11 -0
  66. data/src/cxx_supportlib/oxt/system_calls.cpp +10 -3
  67. data/src/cxx_supportlib/oxt/thread.hpp +1 -1
  68. data/src/cxx_supportlib/vendor-modified/boost/asio/as_tuple.hpp +35 -9
  69. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_immediate_executor.hpp +3 -2
  70. data/src/cxx_supportlib/vendor-modified/boost/asio/associator.hpp +1 -1
  71. data/src/cxx_supportlib/vendor-modified/boost/asio/async_result.hpp +74 -68
  72. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_datagram_socket.hpp +11 -11
  73. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_deadline_timer.hpp +2 -2
  74. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_random_access_file.hpp +2 -2
  75. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_raw_socket.hpp +10 -10
  76. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_readable_pipe.hpp +1 -1
  77. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_seq_packet_socket.hpp +3 -3
  78. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_serial_port.hpp +2 -2
  79. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_signal_set.hpp +1 -1
  80. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket.hpp +2 -2
  81. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_acceptor.hpp +9 -9
  82. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_file.hpp +2 -2
  83. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_socket.hpp +6 -6
  84. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_waitable_timer.hpp +2 -2
  85. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_writable_pipe.hpp +1 -1
  86. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_allocator.hpp +88 -22
  87. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_cancellation_slot.hpp +91 -22
  88. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_executor.hpp +105 -23
  89. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_immediate_executor.hpp +90 -23
  90. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +2 -2
  91. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer_registration.hpp +1 -1
  92. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_after.hpp +303 -0
  93. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_at.hpp +296 -0
  94. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/impl/co_composed.hpp → co_composed.hpp} +208 -61
  95. data/src/cxx_supportlib/vendor-modified/boost/asio/completion_condition.hpp +49 -0
  96. data/src/cxx_supportlib/vendor-modified/boost/asio/compose.hpp +10 -201
  97. data/src/cxx_supportlib/vendor-modified/boost/asio/composed.hpp +415 -0
  98. data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +214 -48
  99. data/src/cxx_supportlib/vendor-modified/boost/asio/coroutine.hpp +3 -4
  100. data/src/cxx_supportlib/vendor-modified/boost/asio/default_completion_token.hpp +91 -0
  101. data/src/cxx_supportlib/vendor-modified/boost/asio/deferred.hpp +9 -5
  102. data/src/cxx_supportlib/vendor-modified/boost/asio/detached.hpp +2 -2
  103. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffered_stream_storage.hpp +1 -1
  104. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_message.hpp → detail/completion_message.hpp} +14 -16
  105. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_payload.hpp → detail/completion_payload.hpp} +30 -32
  106. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_handler.hpp → detail/completion_payload_handler.hpp} +15 -13
  107. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +26 -32
  108. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/deadline_timer_service.hpp +5 -1
  109. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_alloc_helpers.hpp +14 -118
  110. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/descriptor_ops.ipp +36 -33
  111. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.ipp +1 -1
  112. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_descriptor_service.ipp +7 -5
  113. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_socket_service_base.ipp +6 -4
  114. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +44 -35
  115. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_select_interrupter.ipp +1 -1
  116. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/initiation_base.hpp +64 -0
  117. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/memory.hpp +0 -11
  118. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_descriptor_service.hpp +20 -16
  119. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_send_op.hpp +0 -1
  120. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service.hpp +4 -4
  121. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service_base.hpp +23 -18
  122. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/recycling_allocator.hpp +9 -0
  123. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_endpoint_op.hpp +1 -1
  124. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_query_op.hpp +1 -1
  125. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_info_base.hpp +11 -1
  126. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timed_cancel_op.hpp +363 -0
  127. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wrapped_handler.hpp +29 -51
  128. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/allocator.hpp +1 -1
  129. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking.hpp +1 -1
  130. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking_adaptation.hpp +1 -1
  131. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context.hpp +1 -1
  132. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/mapping.hpp +1 -1
  133. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/occupancy.hpp +1 -1
  134. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/outstanding_work.hpp +1 -1
  135. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/relationship.hpp +1 -1
  136. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_channel.hpp +2 -1
  137. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_concurrent_channel.hpp +2 -1
  138. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_composed.hpp +2 -114
  139. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_receive_op.hpp +2 -3
  140. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_functions.hpp +27 -19
  141. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_op.hpp +0 -1
  142. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_service.hpp +17 -15
  143. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_promise_allocator.hpp +2 -3
  144. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/impl/channel_service.hpp +4 -2
  145. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/partial_promise.hpp +3 -5
  146. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/as_single.hpp +12 -7
  147. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/coro.hpp +1 -1
  148. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/parallel_group.hpp +38 -40
  149. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/promise.hpp +3 -3
  150. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_coro.hpp +5 -5
  151. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_promise.hpp +1 -1
  152. data/src/cxx_supportlib/vendor-modified/boost/asio/immediate.hpp +144 -0
  153. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/append.hpp +14 -7
  154. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/as_tuple.hpp +45 -14
  155. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp +3 -3
  156. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_after.hpp +270 -0
  157. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_at.hpp +270 -0
  158. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/co_spawn.hpp +8 -0
  159. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect.hpp +60 -166
  160. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/consign.hpp +14 -7
  161. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/detached.hpp +2 -2
  162. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/prepend.hpp +14 -7
  163. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read.hpp +26 -177
  164. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_at.hpp +16 -82
  165. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +13 -286
  166. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/redirect_error.hpp +55 -18
  167. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/spawn.hpp +1 -1
  168. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write.hpp +26 -185
  169. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write_at.hpp +16 -87
  170. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context_strand.hpp +5 -5
  171. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +6 -6
  172. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/socket_option.hpp +1 -1
  173. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.ipp +1 -1
  174. data/src/cxx_supportlib/vendor-modified/boost/asio/placeholders.hpp +12 -6
  175. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_descriptor.hpp +1 -1
  176. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_stream_descriptor.hpp +2 -2
  177. data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +127 -28
  178. data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +70 -20
  179. data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +114 -36
  180. data/src/cxx_supportlib/vendor-modified/boost/asio/redirect_error.hpp +43 -3
  181. data/src/cxx_supportlib/vendor-modified/boost/asio/registered_buffer.hpp +2 -2
  182. data/src/cxx_supportlib/vendor-modified/boost/asio/spawn.hpp +0 -1
  183. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/openssl_init.ipp +2 -2
  184. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +10 -7
  185. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +5 -5
  186. data/src/cxx_supportlib/vendor-modified/boost/asio/this_coro.hpp +2 -2
  187. data/src/cxx_supportlib/vendor-modified/boost/asio/use_awaitable.hpp +2 -2
  188. data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +1 -1
  189. data/src/cxx_supportlib/vendor-modified/boost/asio/uses_executor.hpp +1 -1
  190. data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +1 -1
  191. data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +147 -35
  192. data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +74 -22
  193. data/src/cxx_supportlib/vendor-modified/boost/asio.hpp +6 -0
  194. data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +4 -1
  195. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/futex.hpp +42 -11
  196. data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +15 -37
  197. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +8 -8
  198. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +1 -1
  199. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +151 -10
  200. data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +11 -9
  201. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +611 -102
  202. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +1 -1
  203. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +47 -47
  204. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +25 -24
  205. data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocation_type.hpp +7 -7
  206. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_list.hpp +2 -2
  207. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_slist.hpp +2 -2
  208. data/src/cxx_supportlib/vendor-modified/boost/container/detail/construct_in_place.hpp +35 -1
  209. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +14 -14
  210. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +1 -1
  211. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +55 -23
  212. data/src/cxx_supportlib/vendor-modified/boost/container/detail/function_detector.hpp +1 -1
  213. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_container.hpp +2 -2
  214. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_contiguous_container.hpp +1 -1
  215. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_pair.hpp +4 -4
  216. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +8 -8
  217. data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +9 -9
  218. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +4 -4
  219. data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +96 -10
  220. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +19 -4
  221. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +1 -1
  222. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +17 -17
  223. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common.hpp +1 -1
  224. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +2 -2
  225. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_resource.hpp +4 -4
  226. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +86 -52
  227. data/src/cxx_supportlib/vendor-modified/boost/container/detail/version_type.hpp +4 -4
  228. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +12 -0
  229. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +145 -65
  230. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +105 -22
  231. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +2 -2
  232. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +30 -22
  233. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +19 -2
  234. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +1 -1
  235. data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +15 -8
  236. data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +6 -5
  237. data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +15 -15
  238. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +1 -1
  239. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +1 -1
  240. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +3 -3
  241. data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +1 -1
  242. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +2 -2
  243. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +31 -24
  244. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +45 -43
  245. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +45 -33
  246. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +5 -7
  247. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +55 -47
  248. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator.hpp +3 -3
  249. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +222 -73
  250. data/src/cxx_supportlib/vendor-modified/boost/core/detail/minstd_rand.hpp +58 -0
  251. data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +13 -13
  252. data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +53 -5
  253. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +1 -0
  254. data/src/cxx_supportlib/vendor-modified/boost/core/pointer_in_range.hpp +49 -0
  255. data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +2 -0
  256. data/src/cxx_supportlib/vendor-modified/boost/core/type_name.hpp +7 -2
  257. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +22 -34
  258. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +141 -38
  259. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/algorithm.hpp +8 -8
  260. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash.hpp +1 -1
  261. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +8 -6
  262. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_traits.hpp +18 -18
  263. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +22 -17
  264. data/src/cxx_supportlib/vendor-modified/boost/libs/random/src/random_device.cpp +3 -1
  265. data/src/cxx_supportlib/vendor-modified/boost/move/detail/config_begin.hpp +0 -1
  266. data/src/cxx_supportlib/vendor-modified/boost/move/detail/launder.hpp +53 -0
  267. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +9 -1
  268. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +6 -1
  269. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
  270. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/integral_wrapper.hpp +2 -1
  271. data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
  272. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/requires_cxx11.hpp +1 -1
  273. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp +4 -1
  274. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category_message.hpp +13 -1
  275. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +13 -1
  276. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map_fwd.hpp +15 -0
  277. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +13 -1
  278. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set_fwd.hpp +15 -0
  279. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +22 -6
  280. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +38 -10
  281. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +111 -2
  282. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/cumulative_stats.hpp +177 -0
  283. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +11 -1
  284. data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +33 -7
  285. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +12 -0
  286. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map_fwd.hpp +15 -0
  287. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +12 -0
  288. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set_fwd.hpp +14 -0
  289. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +19 -0
  290. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +12 -0
  291. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map_fwd.hpp +15 -0
  292. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +12 -0
  293. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set_fwd.hpp +14 -0
  294. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +17 -0
  295. data/src/cxx_supportlib/vendor-modified/boost/utility/detail/minstd_rand.hpp +1 -43
  296. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  297. data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +6 -2
  298. data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +10 -0
  299. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +12 -4
  300. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +32 -5
  301. data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +0 -4
  302. data/src/ruby_supportlib/phusion_passenger/utils/json.rb +5 -1
  303. data/src/ruby_supportlib/phusion_passenger/utils.rb +5 -15
  304. data/src/ruby_supportlib/phusion_passenger.rb +5 -5
  305. metadata +21 -8
@@ -230,7 +230,7 @@ public:
230
230
  default:
231
231
  p.p->ec_ = boost::asio::error::invalid_argument;
232
232
  start_op(impl, reactor::read_op, p.p,
233
- is_continuation, false, true, &io_ex, 0);
233
+ is_continuation, false, true, false, &io_ex, 0);
234
234
  p.v = p.p = 0;
235
235
  return;
236
236
  }
@@ -243,7 +243,8 @@ public:
243
243
  &reactor_, &impl.reactor_data_, impl.socket_, op_type);
244
244
  }
245
245
 
246
- start_op(impl, op_type, p.p, is_continuation, false, false, &io_ex, 0);
246
+ start_op(impl, op_type, p.p, is_continuation,
247
+ false, false, false, &io_ex, 0);
247
248
  p.v = p.p = 0;
248
249
  }
249
250
 
@@ -315,7 +316,7 @@ public:
315
316
  start_op(impl, reactor::write_op, p.p, is_continuation, true,
316
317
  ((impl.state_ & socket_ops::stream_oriented)
317
318
  && buffer_sequence_adapter<boost::asio::const_buffer,
318
- ConstBufferSequence>::all_empty(buffers)), &io_ex, 0);
319
+ ConstBufferSequence>::all_empty(buffers)), true, &io_ex, 0);
319
320
  p.v = p.p = 0;
320
321
  }
321
322
 
@@ -348,7 +349,7 @@ public:
348
349
  &impl, impl.socket_, "async_send(null_buffers)"));
349
350
 
350
351
  start_op(impl, reactor::write_op, p.p,
351
- is_continuation, false, false, &io_ex, 0);
352
+ is_continuation, false, false, false, &io_ex, 0);
352
353
  p.v = p.p = 0;
353
354
  }
354
355
 
@@ -425,7 +426,7 @@ public:
425
426
  (flags & socket_base::message_out_of_band) == 0,
426
427
  ((impl.state_ & socket_ops::stream_oriented)
427
428
  && buffer_sequence_adapter<boost::asio::mutable_buffer,
428
- MutableBufferSequence>::all_empty(buffers)), &io_ex, 0);
429
+ MutableBufferSequence>::all_empty(buffers)), true, &io_ex, 0);
429
430
  p.v = p.p = 0;
430
431
  }
431
432
 
@@ -461,7 +462,7 @@ public:
461
462
  start_op(impl,
462
463
  (flags & socket_base::message_out_of_band)
463
464
  ? reactor::except_op : reactor::read_op,
464
- p.p, is_continuation, false, false, &io_ex, 0);
465
+ p.p, is_continuation, false, false, false, &io_ex, 0);
465
466
  p.v = p.p = 0;
466
467
  }
467
468
 
@@ -533,7 +534,8 @@ public:
533
534
  (in_flags & socket_base::message_out_of_band)
534
535
  ? reactor::except_op : reactor::read_op,
535
536
  p.p, is_continuation,
536
- (in_flags & socket_base::message_out_of_band) == 0, false, &io_ex, 0);
537
+ (in_flags & socket_base::message_out_of_band) == 0,
538
+ false, true, &io_ex, 0);
537
539
  p.v = p.p = 0;
538
540
  }
539
541
 
@@ -574,7 +576,7 @@ public:
574
576
  start_op(impl,
575
577
  (in_flags & socket_base::message_out_of_band)
576
578
  ? reactor::except_op : reactor::read_op,
577
- p.p, is_continuation, false, false, &io_ex, 0);
579
+ p.p, is_continuation, false, false, false, &io_ex, 0);
578
580
  p.v = p.p = 0;
579
581
  }
580
582
 
@@ -590,8 +592,9 @@ protected:
590
592
  const native_handle_type& native_socket, boost::system::error_code& ec);
591
593
 
592
594
  // Start the asynchronous read or write operation.
593
- BOOST_ASIO_DECL void do_start_op(base_implementation_type& impl, int op_type,
594
- reactor_op* op, bool is_continuation, bool is_non_blocking, bool noop,
595
+ BOOST_ASIO_DECL void do_start_op(base_implementation_type& impl,
596
+ int op_type, reactor_op* op, bool is_continuation,
597
+ bool allow_speculative, bool noop, bool needs_non_blocking,
595
598
  void (*on_immediate)(operation* op, bool, const void*),
596
599
  const void* immediate_arg);
597
600
 
@@ -599,18 +602,19 @@ protected:
599
602
  // immediate completion.
600
603
  template <typename Op>
601
604
  void start_op(base_implementation_type& impl, int op_type, Op* op,
602
- bool is_continuation, bool is_non_blocking, bool noop,
603
- const void* io_ex, ...)
605
+ bool is_continuation, bool allow_speculative, bool noop,
606
+ bool needs_non_blocking, const void* io_ex, ...)
604
607
  {
605
- return do_start_op(impl, op_type, op, is_continuation,
606
- is_non_blocking, noop, &Op::do_immediate, io_ex);
608
+ return do_start_op(impl, op_type, op, is_continuation, allow_speculative,
609
+ noop, needs_non_blocking, &Op::do_immediate, io_ex);
607
610
  }
608
611
 
609
612
  // Start the asynchronous operation for handlers that are not specialised for
610
613
  // immediate completion.
611
614
  template <typename Op>
612
- void start_op(base_implementation_type& impl, int op_type, Op* op,
613
- bool is_continuation, bool is_non_blocking, bool noop, const void*,
615
+ void start_op(base_implementation_type& impl, int op_type,
616
+ Op* op, bool is_continuation, bool allow_speculative,
617
+ bool noop, bool needs_non_blocking, const void*,
614
618
  enable_if_t<
615
619
  is_same<
616
620
  typename associated_immediate_executor<
@@ -621,8 +625,9 @@ protected:
621
625
  >::value
622
626
  >*)
623
627
  {
624
- return do_start_op(impl, op_type, op, is_continuation, is_non_blocking,
625
- noop, &reactor::call_post_immediate_completion, &reactor_);
628
+ return do_start_op(impl, op_type, op, is_continuation,
629
+ allow_speculative, noop, needs_non_blocking,
630
+ &reactor::call_post_immediate_completion, &reactor_);
626
631
  }
627
632
 
628
633
  // Start the asynchronous accept operation.
@@ -49,16 +49,25 @@ public:
49
49
 
50
50
  T* allocate(std::size_t n)
51
51
  {
52
+ #if !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
52
53
  void* p = thread_info_base::allocate(Purpose(),
53
54
  thread_context::top_of_thread_call_stack(),
54
55
  sizeof(T) * n, alignof(T));
56
+ #else // !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
57
+ void* p = boost::asio::aligned_new(align, s);
58
+ #endif // !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
55
59
  return static_cast<T*>(p);
56
60
  }
57
61
 
58
62
  void deallocate(T* p, std::size_t n)
59
63
  {
64
+ #if !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
60
65
  thread_info_base::deallocate(Purpose(),
61
66
  thread_context::top_of_thread_call_stack(), p, sizeof(T) * n);
67
+ #else // !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
68
+ (void)n;
69
+ boost::asio::aligned_delete(p);
70
+ #endif // !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
62
71
  }
63
72
  };
64
73
 
@@ -78,7 +78,7 @@ public:
78
78
  {
79
79
  // The operation is being run on the worker io_context. Time to perform
80
80
  // the resolver operation.
81
-
81
+
82
82
  // Perform the blocking endpoint resolution operation.
83
83
  char host_name[NI_MAXHOST] = "";
84
84
  char service_name[NI_MAXSERV] = "";
@@ -86,7 +86,7 @@ public:
86
86
  {
87
87
  // The operation is being run on the worker io_context. Time to perform
88
88
  // the resolver operation.
89
-
89
+
90
90
  // Perform the blocking host resolution operation.
91
91
  socket_ops::background_getaddrinfo(o->cancel_token_,
92
92
  o->query_.host_name().c_str(), o->query_.service_name().c_str(),
@@ -90,7 +90,17 @@ public:
90
90
  };
91
91
  };
92
92
 
93
- enum { max_mem_index = parallel_group_tag::end_mem_index };
93
+ struct timed_cancel_tag
94
+ {
95
+ enum
96
+ {
97
+ cache_size = BOOST_ASIO_RECYCLING_ALLOCATOR_CACHE_SIZE,
98
+ begin_mem_index = parallel_group_tag::end_mem_index,
99
+ end_mem_index = begin_mem_index + cache_size
100
+ };
101
+ };
102
+
103
+ enum { max_mem_index = timed_cancel_tag::end_mem_index };
94
104
 
95
105
  thread_info_base()
96
106
  #if !defined(BOOST_ASIO_NO_EXCEPTIONS)
@@ -0,0 +1,363 @@
1
+ //
2
+ // detail/timed_cancel_op.hpp
3
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~
4
+ //
5
+ // Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6
+ //
7
+ // Distributed under the Boost Software License, Version 1.0. (See accompanying
8
+ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9
+ //
10
+
11
+ #ifndef BOOST_ASIO_DETAIL_TIMED_CANCEL_OP_HPP
12
+ #define BOOST_ASIO_DETAIL_TIMED_CANCEL_OP_HPP
13
+
14
+ #if defined(_MSC_VER) && (_MSC_VER >= 1200)
15
+ # pragma once
16
+ #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17
+
18
+ #include <boost/asio/detail/config.hpp>
19
+ #include <boost/asio/associated_cancellation_slot.hpp>
20
+ #include <boost/asio/associator.hpp>
21
+ #include <boost/asio/basic_waitable_timer.hpp>
22
+ #include <boost/asio/cancellation_signal.hpp>
23
+ #include <boost/asio/detail/atomic_count.hpp>
24
+ #include <boost/asio/detail/completion_payload.hpp>
25
+ #include <boost/asio/detail/completion_payload_handler.hpp>
26
+ #include <boost/asio/detail/handler_alloc_helpers.hpp>
27
+ #include <boost/asio/detail/type_traits.hpp>
28
+
29
+ #include <boost/asio/detail/push_options.hpp>
30
+
31
+ namespace boost {
32
+ namespace asio {
33
+ namespace detail {
34
+
35
+ template <typename Op, typename... Signatures>
36
+ class timed_cancel_op_handler;
37
+
38
+ template <typename Op>
39
+ class timed_cancel_timer_handler;
40
+
41
+ template <typename Handler, typename Timer, typename... Signatures>
42
+ class timed_cancel_op
43
+ {
44
+ public:
45
+ using handler_type = Handler;
46
+
47
+ BOOST_ASIO_DEFINE_TAGGED_HANDLER_PTR(
48
+ thread_info_base::timed_cancel_tag, timed_cancel_op);
49
+
50
+ timed_cancel_op(Handler& handler, Timer timer,
51
+ cancellation_type_t cancel_type)
52
+ : ref_count_(2),
53
+ handler_(static_cast<Handler&&>(handler)),
54
+ timer_(static_cast<Timer&&>(timer)),
55
+ cancellation_type_(cancel_type),
56
+ cancel_proxy_(nullptr),
57
+ has_payload_(false),
58
+ has_pending_timer_wait_(true)
59
+ {
60
+ }
61
+
62
+ ~timed_cancel_op()
63
+ {
64
+ if (has_payload_)
65
+ payload_storage_.payload_.~payload_type();
66
+ }
67
+
68
+ cancellation_slot get_cancellation_slot() noexcept
69
+ {
70
+ return cancellation_signal_.slot();
71
+ }
72
+
73
+ template <typename Initiation, typename... Args>
74
+ void start(Initiation&& initiation, Args&&... args)
75
+ {
76
+ using op_handler_type =
77
+ timed_cancel_op_handler<timed_cancel_op, Signatures...>;
78
+ op_handler_type op_handler(this);
79
+
80
+ using timer_handler_type =
81
+ timed_cancel_timer_handler<timed_cancel_op>;
82
+ timer_handler_type timer_handler(this);
83
+
84
+ associated_cancellation_slot_t<Handler> slot
85
+ = (get_associated_cancellation_slot)(handler_);
86
+ if (slot.is_connected())
87
+ cancel_proxy_ = &slot.template emplace<cancel_proxy>(this);
88
+
89
+ timer_.async_wait(static_cast<timer_handler_type&&>(timer_handler));
90
+ async_initiate<op_handler_type, Signatures...>(
91
+ static_cast<Initiation&&>(initiation),
92
+ static_cast<op_handler_type&>(op_handler),
93
+ static_cast<Args&&>(args)...);
94
+ }
95
+
96
+ template <typename Message>
97
+ void handle_op(Message&& message)
98
+ {
99
+ if (cancel_proxy_)
100
+ cancel_proxy_->op_ = nullptr;
101
+
102
+ new (&payload_storage_.payload_) payload_type(
103
+ static_cast<Message&&>(message));
104
+ has_payload_ = true;
105
+
106
+ if (has_pending_timer_wait_)
107
+ {
108
+ timer_.cancel();
109
+ release();
110
+ }
111
+ else
112
+ {
113
+ complete();
114
+ }
115
+ }
116
+
117
+ void handle_timer()
118
+ {
119
+ has_pending_timer_wait_ = false;
120
+
121
+ if (has_payload_)
122
+ {
123
+ complete();
124
+ }
125
+ else
126
+ {
127
+ cancellation_signal_.emit(cancellation_type_);
128
+ release();
129
+ }
130
+ }
131
+
132
+ void release()
133
+ {
134
+ if (--ref_count_ == 0)
135
+ {
136
+ ptr p = { boost::asio::detail::addressof(handler_), this, this };
137
+ Handler handler(static_cast<Handler&&>(handler_));
138
+ p.h = boost::asio::detail::addressof(handler);
139
+ p.reset();
140
+ }
141
+ }
142
+
143
+ void complete()
144
+ {
145
+ if (--ref_count_ == 0)
146
+ {
147
+ ptr p = { boost::asio::detail::addressof(handler_), this, this };
148
+ completion_payload_handler<payload_type, Handler> handler(
149
+ static_cast<payload_type&&>(payload_storage_.payload_), handler_);
150
+ p.h = boost::asio::detail::addressof(handler.handler());
151
+ p.reset();
152
+ handler();
153
+ }
154
+ }
155
+
156
+ //private:
157
+ typedef completion_payload<Signatures...> payload_type;
158
+
159
+ struct cancel_proxy
160
+ {
161
+ cancel_proxy(timed_cancel_op* op)
162
+ : op_(op)
163
+ {
164
+ }
165
+
166
+ void operator()(cancellation_type_t type)
167
+ {
168
+ if (op_)
169
+ op_->cancellation_signal_.emit(type);
170
+ }
171
+
172
+ timed_cancel_op* op_;
173
+ };
174
+
175
+ // The number of handlers that share a reference to the state.
176
+ atomic_count ref_count_;
177
+
178
+ // The handler to be called when the operation completes.
179
+ Handler handler_;
180
+
181
+ // The timer used to determine when to cancel the pending operation.
182
+ Timer timer_;
183
+
184
+ // The cancellation signal and type used to cancel the pending operation.
185
+ cancellation_signal cancellation_signal_;
186
+ cancellation_type_t cancellation_type_;
187
+
188
+ // A proxy cancel handler used to allow cancellation of the timed operation.
189
+ cancel_proxy* cancel_proxy_;
190
+
191
+ // Arguments to be passed to the completion handler.
192
+ union payload_storage
193
+ {
194
+ payload_storage() {}
195
+ ~payload_storage() {}
196
+
197
+ char dummy_;
198
+ payload_type payload_;
199
+ } payload_storage_;
200
+
201
+ // Whether the payload storage contains a valid payload.
202
+ bool has_payload_;
203
+
204
+ // Whether the asynchronous wait on the timer is still pending
205
+ bool has_pending_timer_wait_;
206
+ };
207
+
208
+ template <typename Op, typename R, typename... Args>
209
+ class timed_cancel_op_handler<Op, R(Args...)>
210
+ {
211
+ public:
212
+ using cancellation_slot_type = cancellation_slot;
213
+
214
+ explicit timed_cancel_op_handler(Op* op)
215
+ : op_(op)
216
+ {
217
+ }
218
+
219
+ timed_cancel_op_handler(timed_cancel_op_handler&& other) noexcept
220
+ : op_(other.op_)
221
+ {
222
+ other.op_ = nullptr;
223
+ }
224
+
225
+ ~timed_cancel_op_handler()
226
+ {
227
+ if (op_)
228
+ op_->release();
229
+ }
230
+
231
+ cancellation_slot_type get_cancellation_slot() const noexcept
232
+ {
233
+ return op_->get_cancellation_slot();
234
+ }
235
+
236
+ template <typename... Args2>
237
+ enable_if_t<
238
+ is_constructible<completion_message<R(Args...)>, int, Args2...>::value
239
+ > operator()(Args2&&... args)
240
+ {
241
+ Op* op = op_;
242
+ op_ = nullptr;
243
+ typedef completion_message<R(Args...)> message_type;
244
+ op->handle_op(message_type(0, static_cast<Args2&&>(args)...));
245
+ }
246
+
247
+ //protected:
248
+ Op* op_;
249
+ };
250
+
251
+ template <typename Op, typename R, typename... Args, typename... Signatures>
252
+ class timed_cancel_op_handler<Op, R(Args...), Signatures...> :
253
+ public timed_cancel_op_handler<Op, Signatures...>
254
+ {
255
+ public:
256
+ using timed_cancel_op_handler<Op, Signatures...>::timed_cancel_op_handler;
257
+ using timed_cancel_op_handler<Op, Signatures...>::operator();
258
+
259
+ template <typename... Args2>
260
+ enable_if_t<
261
+ is_constructible<completion_message<R(Args...)>, int, Args2...>::value
262
+ > operator()(Args2&&... args)
263
+ {
264
+ Op* op = this->op_;
265
+ this->op_ = nullptr;
266
+ typedef completion_message<R(Args...)> message_type;
267
+ op->handle_op(message_type(0, static_cast<Args2&&>(args)...));
268
+ }
269
+ };
270
+
271
+ template <typename Op>
272
+ class timed_cancel_timer_handler
273
+ {
274
+ public:
275
+ using cancellation_slot_type = cancellation_slot;
276
+
277
+ explicit timed_cancel_timer_handler(Op* op)
278
+ : op_(op)
279
+ {
280
+ }
281
+
282
+ timed_cancel_timer_handler(timed_cancel_timer_handler&& other) noexcept
283
+ : op_(other.op_)
284
+ {
285
+ other.op_ = nullptr;
286
+ }
287
+
288
+ ~timed_cancel_timer_handler()
289
+ {
290
+ if (op_)
291
+ op_->release();
292
+ }
293
+
294
+ cancellation_slot_type get_cancellation_slot() const noexcept
295
+ {
296
+ return cancellation_slot_type();
297
+ }
298
+
299
+ void operator()(const boost::system::error_code&)
300
+ {
301
+ Op* op = op_;
302
+ op_ = nullptr;
303
+ op->handle_timer();
304
+ }
305
+
306
+ //private:
307
+ Op* op_;
308
+ };
309
+
310
+ } // namespace detail
311
+
312
+ template <template <typename, typename> class Associator,
313
+ typename Op, typename... Signatures, typename DefaultCandidate>
314
+ struct associator<Associator,
315
+ detail::timed_cancel_op_handler<Op, Signatures...>, DefaultCandidate>
316
+ : Associator<typename Op::handler_type, DefaultCandidate>
317
+ {
318
+ static typename Associator<typename Op::handler_type, DefaultCandidate>::type
319
+ get(const detail::timed_cancel_op_handler<Op, Signatures...>& h) noexcept
320
+ {
321
+ return Associator<typename Op::handler_type, DefaultCandidate>::get(
322
+ h.op_->handler_);
323
+ }
324
+
325
+ static auto get(const detail::timed_cancel_op_handler<Op, Signatures...>& h,
326
+ const DefaultCandidate& c) noexcept
327
+ -> decltype(Associator<typename Op::handler_type, DefaultCandidate>::get(
328
+ h.op_->handler_, c))
329
+ {
330
+ return Associator<typename Op::handler_type, DefaultCandidate>::get(
331
+ h.op_->handler_, c);
332
+ }
333
+ };
334
+
335
+ template <template <typename, typename> class Associator,
336
+ typename Op, typename DefaultCandidate>
337
+ struct associator<Associator,
338
+ detail::timed_cancel_timer_handler<Op>, DefaultCandidate>
339
+ : Associator<typename Op::handler_type, DefaultCandidate>
340
+ {
341
+ static typename Associator<typename Op::handler_type, DefaultCandidate>::type
342
+ get(const detail::timed_cancel_timer_handler<Op>& h) noexcept
343
+ {
344
+ return Associator<typename Op::handler_type, DefaultCandidate>::get(
345
+ h.op_->handler_);
346
+ }
347
+
348
+ static auto get(const detail::timed_cancel_timer_handler<Op>& h,
349
+ const DefaultCandidate& c) noexcept
350
+ -> decltype(Associator<typename Op::handler_type, DefaultCandidate>::get(
351
+ h.op_->handler_, c))
352
+ {
353
+ return Associator<typename Op::handler_type, DefaultCandidate>::get(
354
+ h.op_->handler_, c);
355
+ }
356
+ };
357
+
358
+ } // namespace asio
359
+ } // namespace boost
360
+
361
+ #include <boost/asio/detail/pop_options.hpp>
362
+
363
+ #endif // BOOST_ASIO_DETAIL_TIMED_CANCEL_OP_HPP
@@ -42,12 +42,36 @@ struct is_continuation_if_running
42
42
  }
43
43
  };
44
44
 
45
+ template <typename Dispatcher, typename = void>
46
+ struct wrapped_executor
47
+ {
48
+ typedef Dispatcher executor_type;
49
+
50
+ static const Dispatcher& get(const Dispatcher& dispatcher) noexcept
51
+ {
52
+ return dispatcher;
53
+ }
54
+ };
55
+
56
+ template <typename Dispatcher>
57
+ struct wrapped_executor<Dispatcher,
58
+ void_type<typename Dispatcher::executor_type>>
59
+ {
60
+ typedef typename Dispatcher::executor_type executor_type;
61
+
62
+ static executor_type get(const Dispatcher& dispatcher) noexcept
63
+ {
64
+ return dispatcher.get_executor();
65
+ }
66
+ };
67
+
45
68
  template <typename Dispatcher, typename Handler,
46
69
  typename IsContinuation = is_continuation_delegated>
47
70
  class wrapped_handler
48
71
  {
49
72
  public:
50
73
  typedef void result_type;
74
+ typedef typename wrapped_executor<Dispatcher>::executor_type executor_type;
51
75
 
52
76
  wrapped_handler(Dispatcher dispatcher, Handler& handler)
53
77
  : dispatcher_(dispatcher),
@@ -67,6 +91,11 @@ public:
67
91
  {
68
92
  }
69
93
 
94
+ executor_type get_executor() const noexcept
95
+ {
96
+ return wrapped_executor<Dispatcher>::get(dispatcher_);
97
+ }
98
+
70
99
  void operator()()
71
100
  {
72
101
  dispatcher_.dispatch(static_cast<Handler&&>(handler_));
@@ -152,49 +181,6 @@ public:
152
181
  Handler handler_;
153
182
  };
154
183
 
155
- template <typename Handler, typename Context>
156
- class rewrapped_handler
157
- {
158
- public:
159
- explicit rewrapped_handler(Handler& handler, const Context& context)
160
- : context_(context),
161
- handler_(static_cast<Handler&&>(handler))
162
- {
163
- }
164
-
165
- explicit rewrapped_handler(const Handler& handler, const Context& context)
166
- : context_(context),
167
- handler_(handler)
168
- {
169
- }
170
-
171
- rewrapped_handler(const rewrapped_handler& other)
172
- : context_(other.context_),
173
- handler_(other.handler_)
174
- {
175
- }
176
-
177
- rewrapped_handler(rewrapped_handler&& other)
178
- : context_(static_cast<Context&&>(other.context_)),
179
- handler_(static_cast<Handler&&>(other.handler_))
180
- {
181
- }
182
-
183
- void operator()()
184
- {
185
- handler_();
186
- }
187
-
188
- void operator()() const
189
- {
190
- handler_();
191
- }
192
-
193
- //private:
194
- Context context_;
195
- Handler handler_;
196
- };
197
-
198
184
  template <typename Dispatcher, typename Handler, typename IsContinuation>
199
185
  inline bool asio_handler_is_continuation(
200
186
  wrapped_handler<Dispatcher, Handler, IsContinuation>* this_handler)
@@ -202,14 +188,6 @@ inline bool asio_handler_is_continuation(
202
188
  return IsContinuation()(this_handler->dispatcher_, this_handler->handler_);
203
189
  }
204
190
 
205
- template <typename Dispatcher, typename Context>
206
- inline bool asio_handler_is_continuation(
207
- rewrapped_handler<Dispatcher, Context>* this_handler)
208
- {
209
- return boost_asio_handler_cont_helpers::is_continuation(
210
- this_handler->context_);
211
- }
212
-
213
191
  } // namespace detail
214
192
  } // namespace asio
215
193
  } // namespace boost
@@ -226,7 +226,7 @@ const T allocator_t<void>::static_query_v;
226
226
  #endif // defined(BOOST_ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
227
227
  // && defined(BOOST_ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
228
228
 
229
- constexpr allocator_t<void> allocator;
229
+ BOOST_ASIO_INLINE_VARIABLE constexpr allocator_t<void> allocator;
230
230
 
231
231
  } // namespace execution
232
232
 
@@ -893,7 +893,7 @@ const T never_t<I>::static_query_v;
893
893
 
894
894
  typedef detail::blocking_t<> blocking_t;
895
895
 
896
- constexpr blocking_t blocking;
896
+ BOOST_ASIO_INLINE_VARIABLE constexpr blocking_t blocking;
897
897
 
898
898
  } // namespace execution
899
899
 
@@ -719,7 +719,7 @@ void blocking_execute(
719
719
 
720
720
  typedef detail::blocking_adaptation_t<> blocking_adaptation_t;
721
721
 
722
- constexpr blocking_adaptation_t blocking_adaptation;
722
+ BOOST_ASIO_INLINE_VARIABLE constexpr blocking_adaptation_t blocking_adaptation;
723
723
 
724
724
  } // namespace execution
725
725
 
@@ -139,7 +139,7 @@ const T context_t<I>::static_query_v;
139
139
 
140
140
  typedef detail::context_t<> context_t;
141
141
 
142
- constexpr context_t context;
142
+ BOOST_ASIO_INLINE_VARIABLE constexpr context_t context;
143
143
 
144
144
  } // namespace execution
145
145