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
@@ -1,6 +1,6 @@
1
1
  //
2
- // experimental/impl/co_composed.hpp
3
- // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2
+ // co_composed.hpp
3
+ // ~~~~~~~~~~~~~~~
4
4
  //
5
5
  // Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6
6
  //
@@ -8,14 +8,17 @@
8
8
  // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9
9
  //
10
10
 
11
- #ifndef BOOST_ASIO_IMPL_EXPERIMENTAL_CO_COMPOSED_HPP
12
- #define BOOST_ASIO_IMPL_EXPERIMENTAL_CO_COMPOSED_HPP
11
+ #ifndef BOOST_ASIO_CO_COMPOSED_HPP
12
+ #define BOOST_ASIO_CO_COMPOSED_HPP
13
13
 
14
14
  #if defined(_MSC_VER) && (_MSC_VER >= 1200)
15
15
  # pragma once
16
16
  #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17
17
 
18
18
  #include <boost/asio/detail/config.hpp>
19
+
20
+ #if defined(BOOST_ASIO_HAS_CO_AWAIT) || defined(GENERATING_DOCUMENTATION)
21
+
19
22
  #include <new>
20
23
  #include <tuple>
21
24
  #include <variant>
@@ -45,7 +48,6 @@
45
48
 
46
49
  namespace boost {
47
50
  namespace asio {
48
- namespace experimental {
49
51
  namespace detail {
50
52
 
51
53
  #if defined(BOOST_ASIO_HAS_STD_COROUTINE)
@@ -75,7 +77,7 @@ class co_composed_handler_base;
75
77
  template <typename Executors, typename Handler, typename Return>
76
78
  class co_composed_promise;
77
79
 
78
- template <completion_signature... Signatures>
80
+ template <BOOST_ASIO_COMPLETION_SIGNATURE... Signatures>
79
81
  class co_composed_returns
80
82
  {
81
83
  };
@@ -91,7 +93,7 @@ struct co_composed_completion : std::tuple<T&&...>
91
93
  {
92
94
  template <typename... U>
93
95
  co_composed_completion(U&&... u) noexcept
94
- : std::tuple<T&&...>(std::forward<U>(u)...)
96
+ : std::tuple<T&&...>(static_cast<U&&>(u)...)
95
97
  {
96
98
  }
97
99
  };
@@ -313,8 +315,8 @@ public:
313
315
  (get_associated_cancellation_slot)(
314
316
  static_cast<co_composed_state<Executors, Handler, Return>*>(
315
317
  this)->handler()),
316
- std::forward<InFilter>(in_filter),
317
- std::forward<OutFilter>(out_filter));
318
+ static_cast<InFilter&&>(in_filter),
319
+ static_cast<OutFilter&&>(out_filter));
318
320
  }
319
321
 
320
322
  cancellation_type_t cancelled() const noexcept
@@ -469,7 +471,7 @@ public:
469
471
  co_composed_state(composed_io_executors<Executors>&& executors,
470
472
  H&& h, co_composed_on_suspend& on_suspend)
471
473
  : work_(std::move(executors)),
472
- handler_(std::forward<H>(h)),
474
+ handler_(static_cast<H&&>(h)),
473
475
  on_suspend_(&on_suspend)
474
476
  {
475
477
  this->reset_cancellation_state(enable_terminal_cancellation());
@@ -482,9 +484,9 @@ public:
482
484
 
483
485
  template <typename... Args>
484
486
  [[nodiscard]] co_composed_completion<Args...> complete(Args&&... args)
485
- requires requires { declval<Handler>()(std::forward<Args>(args)...); }
487
+ requires requires { declval<Handler>()(static_cast<Args&&>(args)...); }
486
488
  {
487
- return co_composed_completion<Args...>(std::forward<Args>(args)...);
489
+ return co_composed_completion<Args...>(static_cast<Args&&>(args)...);
488
490
  }
489
491
 
490
492
  const Handler& handler() const noexcept
@@ -593,7 +595,7 @@ public:
593
595
  template <typename... T>
594
596
  void operator()(T&&... args)
595
597
  {
596
- result_type result(std::forward<T>(args)...);
598
+ result_type result(static_cast<T&&>(args)...);
597
599
  this->resume(&result);
598
600
  }
599
601
 
@@ -625,7 +627,7 @@ public:
625
627
  template <typename... T>
626
628
  void operator()(const boost::system::error_code& ec, T&&... args)
627
629
  {
628
- result_type result(ec, args_type(std::forward<T>(args)...));
630
+ result_type result(ec, args_type(static_cast<T&&>(args)...));
629
631
  this->resume(&result);
630
632
  }
631
633
 
@@ -658,7 +660,7 @@ public:
658
660
  template <typename... T>
659
661
  void operator()(std::exception_ptr ex, T&&... args)
660
662
  {
661
- result_type result(std::move(ex), args_type(std::forward<T>(args)...));
663
+ result_type result(std::move(ex), args_type(static_cast<T&&>(args)...));
662
664
  this->resume(&result);
663
665
  }
664
666
 
@@ -864,7 +866,7 @@ public:
864
866
  # endif // defined(BOOST_ASIO_HAS_SOURCE_LOCATION)
865
867
  #endif // defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING)
866
868
  )
867
- : op_(std::forward<Op>(op)),
869
+ : op_(static_cast<Op&&>(op)),
868
870
  promise_(promise)
869
871
  #if defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING)
870
872
  # if defined(BOOST_ASIO_HAS_SOURCE_LOCATION)
@@ -895,7 +897,7 @@ public:
895
897
  static_cast<awaitable*>(p)->location_.function_name()));
896
898
  # endif // defined(BOOST_ASIO_HAS_SOURCE_LOCATION)
897
899
  #endif // defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING)
898
- std::forward<Op>(static_cast<awaitable*>(p)->op_)(
900
+ static_cast<Op&&>(static_cast<awaitable*>(p)->op_)(
899
901
  co_composed_handler<Executors, Handler,
900
902
  Return, completion_signature_of_t<Op>>(
901
903
  static_cast<awaitable*>(p)->promise_));
@@ -920,7 +922,7 @@ public:
920
922
  };
921
923
 
922
924
  state_.check_for_cancellation_on_transform();
923
- return awaitable{std::forward<Op>(op), *this
925
+ return awaitable{static_cast<Op&&>(op), *this
924
926
  #if defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING)
925
927
  # if defined(BOOST_ASIO_HAS_SOURCE_LOCATION)
926
928
  , location
@@ -961,7 +963,7 @@ public:
961
963
 
962
964
  Handler handler(std::move(a.promise_.state_.handler_));
963
965
  std::tuple<decay_t<Args>...> result(
964
- std::move(static_cast<std::tuple<Args&&...>>(a.result_)));
966
+ std::move(static_cast<std::tuple<Args&&...>&>(a.result_)));
965
967
 
966
968
  co_composed_handler_base<Executors, Handler,
967
969
  Return>(std::move(composed_handler));
@@ -1014,7 +1016,7 @@ public:
1014
1016
 
1015
1017
  template <typename I>
1016
1018
  initiate_co_composed(I&& impl, composed_io_executors<Executors>&& executors)
1017
- : implementation_(std::forward<I>(impl)),
1019
+ : implementation_(static_cast<I&&>(impl)),
1018
1020
  executors_(std::move(executors))
1019
1021
  {
1020
1022
  }
@@ -1032,8 +1034,8 @@ public:
1032
1034
  co_composed_on_suspend on_suspend{};
1033
1035
  implementation_(
1034
1036
  co_composed_state<Executors, handler_type, returns_type>(
1035
- executors_, std::forward<Handler>(handler), on_suspend),
1036
- std::forward<InitArgs>(init_args)...);
1037
+ executors_, static_cast<Handler&&>(handler), on_suspend),
1038
+ static_cast<InitArgs&&>(init_args)...);
1037
1039
  if (on_suspend.fn_)
1038
1040
  on_suspend.fn_(on_suspend.arg_);
1039
1041
  }
@@ -1046,8 +1048,8 @@ public:
1046
1048
  co_composed_on_suspend on_suspend{};
1047
1049
  std::move(implementation_)(
1048
1050
  co_composed_state<Executors, handler_type, returns_type>(
1049
- std::move(executors_), std::forward<Handler>(handler), on_suspend),
1050
- std::forward<InitArgs>(init_args)...);
1051
+ std::move(executors_), static_cast<Handler&&>(handler), on_suspend),
1052
+ static_cast<InitArgs&&>(init_args)...);
1051
1053
  if (on_suspend.fn_)
1052
1054
  on_suspend.fn_(on_suspend.arg_);
1053
1055
  }
@@ -1057,46 +1059,74 @@ private:
1057
1059
  composed_io_executors<Executors> executors_;
1058
1060
  };
1059
1061
 
1062
+ template <typename Implementation, typename... Signatures>
1063
+ class initiate_co_composed<Implementation, void(), Signatures...>
1064
+ {
1065
+ public:
1066
+ template <typename I>
1067
+ initiate_co_composed(I&& impl, composed_io_executors<void()>&&)
1068
+ : implementation_(static_cast<I&&>(impl))
1069
+ {
1070
+ }
1071
+
1072
+ template <typename Handler, typename... InitArgs>
1073
+ void operator()(Handler&& handler, InitArgs&&... init_args) const &
1074
+ {
1075
+ using handler_type = decay_t<Handler>;
1076
+ using returns_type = co_composed_returns<Signatures...>;
1077
+ co_composed_on_suspend on_suspend{};
1078
+ implementation_(
1079
+ co_composed_state<void(), handler_type, returns_type>(
1080
+ composed_io_executors<void()>(),
1081
+ static_cast<Handler&&>(handler), on_suspend),
1082
+ static_cast<InitArgs&&>(init_args)...);
1083
+ if (on_suspend.fn_)
1084
+ on_suspend.fn_(on_suspend.arg_);
1085
+ }
1086
+
1087
+ template <typename Handler, typename... InitArgs>
1088
+ void operator()(Handler&& handler, InitArgs&&... init_args) &&
1089
+ {
1090
+ using handler_type = decay_t<Handler>;
1091
+ using returns_type = co_composed_returns<Signatures...>;
1092
+ co_composed_on_suspend on_suspend{};
1093
+ std::move(implementation_)(
1094
+ co_composed_state<void(), handler_type, returns_type>(
1095
+ composed_io_executors<void()>(),
1096
+ static_cast<Handler&&>(handler), on_suspend),
1097
+ static_cast<InitArgs&&>(init_args)...);
1098
+ if (on_suspend.fn_)
1099
+ on_suspend.fn_(on_suspend.arg_);
1100
+ }
1101
+
1102
+ private:
1103
+ Implementation implementation_;
1104
+ };
1105
+
1060
1106
  template <typename... Signatures, typename Implementation, typename Executors>
1061
- inline initiate_co_composed<Implementation, Executors, Signatures...>
1107
+ inline initiate_co_composed<decay_t<Implementation>, Executors, Signatures...>
1062
1108
  make_initiate_co_composed(Implementation&& implementation,
1063
1109
  composed_io_executors<Executors>&& executors)
1064
1110
  {
1065
1111
  return initiate_co_composed<
1066
1112
  decay_t<Implementation>, Executors, Signatures...>(
1067
- std::forward<Implementation>(implementation), std::move(executors));
1113
+ static_cast<Implementation&&>(implementation), std::move(executors));
1068
1114
  }
1069
1115
 
1070
1116
  } // namespace detail
1071
1117
 
1072
- template <completion_signature... Signatures,
1073
- typename Implementation, typename... IoObjectsOrExecutors>
1074
- inline auto co_composed(Implementation&& implementation,
1075
- IoObjectsOrExecutors&&... io_objects_or_executors)
1076
- {
1077
- return detail::make_initiate_co_composed<Signatures...>(
1078
- std::forward<Implementation>(implementation),
1079
- detail::make_composed_io_executors(
1080
- detail::get_composed_io_executor(
1081
- std::forward<IoObjectsOrExecutors>(
1082
- io_objects_or_executors))...));
1083
- }
1084
-
1085
- } // namespace experimental
1086
-
1087
1118
  #if !defined(GENERATING_DOCUMENTATION)
1088
1119
 
1089
1120
  template <template <typename, typename> class Associator,
1090
1121
  typename Executors, typename Handler, typename Return,
1091
1122
  typename Signature, typename DefaultCandidate>
1092
1123
  struct associator<Associator,
1093
- experimental::detail::co_composed_handler<
1094
- Executors, Handler, Return, Signature>,
1124
+ detail::co_composed_handler<Executors, Handler, Return, Signature>,
1095
1125
  DefaultCandidate>
1096
1126
  : Associator<Handler, DefaultCandidate>
1097
1127
  {
1098
1128
  static typename Associator<Handler, DefaultCandidate>::type get(
1099
- const experimental::detail::co_composed_handler<
1129
+ const detail::co_composed_handler<
1100
1130
  Executors, Handler, Return, Signature>& h) noexcept
1101
1131
  {
1102
1132
  return Associator<Handler, DefaultCandidate>::get(
@@ -1104,7 +1134,7 @@ struct associator<Associator,
1104
1134
  }
1105
1135
 
1106
1136
  static auto get(
1107
- const experimental::detail::co_composed_handler<
1137
+ const detail::co_composed_handler<
1108
1138
  Executors, Handler, Return, Signature>& h,
1109
1139
  const DefaultCandidate& c) noexcept
1110
1140
  -> decltype(
@@ -1131,37 +1161,28 @@ namespace std { namespace experimental {
1131
1161
  template <typename C, typename Executors,
1132
1162
  typename Handler, typename Return, typename... Args>
1133
1163
  struct coroutine_traits<void, C&,
1134
- boost::asio::experimental::detail::co_composed_state<
1135
- Executors, Handler, Return>,
1136
- Args...>
1164
+ boost::asio::detail::co_composed_state<Executors, Handler, Return>, Args...>
1137
1165
  {
1138
1166
  using promise_type =
1139
- boost::asio::experimental::detail::co_composed_promise<
1140
- Executors, Handler, Return>;
1167
+ boost::asio::detail::co_composed_promise<Executors, Handler, Return>;
1141
1168
  };
1142
1169
 
1143
1170
  template <typename C, typename Executors,
1144
1171
  typename Handler, typename Return, typename... Args>
1145
1172
  struct coroutine_traits<void, C&&,
1146
- boost::asio::experimental::detail::co_composed_state<
1147
- Executors, Handler, Return>,
1148
- Args...>
1173
+ boost::asio::detail::co_composed_state<Executors, Handler, Return>, Args...>
1149
1174
  {
1150
1175
  using promise_type =
1151
- boost::asio::experimental::detail::co_composed_promise<
1152
- Executors, Handler, Return>;
1176
+ boost::asio::detail::co_composed_promise<Executors, Handler, Return>;
1153
1177
  };
1154
1178
 
1155
1179
  template <typename Executors, typename Handler,
1156
1180
  typename Return, typename... Args>
1157
1181
  struct coroutine_traits<void,
1158
- boost::asio::experimental::detail::co_composed_state<
1159
- Executors, Handler, Return>,
1160
- Args...>
1182
+ boost::asio::detail::co_composed_state<Executors, Handler, Return>, Args...>
1161
1183
  {
1162
1184
  using promise_type =
1163
- boost::asio::experimental::detail::co_composed_promise<
1164
- Executors, Handler, Return>;
1185
+ boost::asio::detail::co_composed_promise<Executors, Handler, Return>;
1165
1186
  };
1166
1187
 
1167
1188
  # if defined(BOOST_ASIO_HAS_STD_COROUTINE)
@@ -1171,6 +1192,132 @@ struct coroutine_traits<void,
1171
1192
  # endif // defined(BOOST_ASIO_HAS_STD_COROUTINE)
1172
1193
  #endif // !defined(GENERATING_DOCUMENTATION)
1173
1194
 
1195
+ namespace boost {
1196
+ namespace asio {
1197
+
1198
+ /// Creates an initiation function object that may be used to launch a
1199
+ /// coroutine-based composed asynchronous operation.
1200
+ /**
1201
+ * The co_composed utility simplifies the implementation of composed
1202
+ * asynchronous operations by automatically adapting a coroutine to be an
1203
+ * initiation function object for use with @c async_initiate. When awaiting
1204
+ * asynchronous operations, the coroutine automatically uses a conforming
1205
+ * intermediate completion handler.
1206
+ *
1207
+ * @param implementation A function object that contains the coroutine-based
1208
+ * implementation of the composed asynchronous operation. The first argument to
1209
+ * the function object represents the state of the operation, and may be used
1210
+ * to test for cancellation. The remaining arguments are those passed to @c
1211
+ * async_initiate after the completion token.
1212
+ *
1213
+ * @param io_objects_or_executors Zero or more I/O objects or I/O executors for
1214
+ * which outstanding work must be maintained while the operation is incomplete.
1215
+ *
1216
+ * @par Per-Operation Cancellation
1217
+ * By default, terminal per-operation cancellation is enabled for composed
1218
+ * operations that use co_composed. To disable cancellation for the composed
1219
+ * operation, or to alter its supported cancellation types, call the state's
1220
+ * @c reset_cancellation_state function.
1221
+ *
1222
+ * @par Examples
1223
+ * The following example illustrates manual error handling and explicit checks
1224
+ * for cancellation. The completion handler is invoked via a @c co_yield to the
1225
+ * state's @c complete function, which never returns.
1226
+ *
1227
+ * @code template <typename CompletionToken>
1228
+ * auto async_echo(tcp::socket& socket,
1229
+ * CompletionToken&& token)
1230
+ * {
1231
+ * return boost::asio::async_initiate<
1232
+ * CompletionToken, void(boost::system::error_code)>(
1233
+ * boost::asio::co_composed(
1234
+ * [](auto state, tcp::socket& socket) -> void
1235
+ * {
1236
+ * state.reset_cancellation_state(
1237
+ * boost::asio::enable_terminal_cancellation());
1238
+ *
1239
+ * while (!state.cancelled())
1240
+ * {
1241
+ * char data[1024];
1242
+ * auto [e1, n1] =
1243
+ * co_await socket.async_read_some(
1244
+ * boost::asio::buffer(data));
1245
+ *
1246
+ * if (e1)
1247
+ * co_yield state.complete(e1);
1248
+ *
1249
+ * if (!!state.cancelled())
1250
+ * co_yield state.complete(
1251
+ * make_error_code(boost::asio::error::operation_aborted));
1252
+ *
1253
+ * auto [e2, n2] =
1254
+ * co_await boost::asio::async_write(socket,
1255
+ * boost::asio::buffer(data, n1));
1256
+ *
1257
+ * if (e2)
1258
+ * co_yield state.complete(e2);
1259
+ * }
1260
+ * }, socket),
1261
+ * token, std::ref(socket));
1262
+ * } @endcode
1263
+ *
1264
+ * This next example shows exception-based error handling and implicit checks
1265
+ * for cancellation. The completion handler is invoked after returning from the
1266
+ * coroutine via @c co_return. Valid @c co_return values are specified using
1267
+ * completion signatures passed to the @c co_composed function.
1268
+ *
1269
+ * @code template <typename CompletionToken>
1270
+ * auto async_echo(tcp::socket& socket,
1271
+ * CompletionToken&& token)
1272
+ * {
1273
+ * return boost::asio::async_initiate<
1274
+ * CompletionToken, void(boost::system::error_code)>(
1275
+ * boost::asio::co_composed<
1276
+ * void(boost::system::error_code)>(
1277
+ * [](auto state, tcp::socket& socket) -> void
1278
+ * {
1279
+ * try
1280
+ * {
1281
+ * state.throw_if_cancelled(true);
1282
+ * state.reset_cancellation_state(
1283
+ * boost::asio::enable_terminal_cancellation());
1284
+ *
1285
+ * for (;;)
1286
+ * {
1287
+ * char data[1024];
1288
+ * std::size_t n = co_await socket.async_read_some(
1289
+ * boost::asio::buffer(data));
1290
+ *
1291
+ * co_await boost::asio::async_write(socket,
1292
+ * boost::asio::buffer(data, n));
1293
+ * }
1294
+ * }
1295
+ * catch (const boost::system::system_error& e)
1296
+ * {
1297
+ * co_return {e.code()};
1298
+ * }
1299
+ * }, socket),
1300
+ * token, std::ref(socket));
1301
+ * } @endcode
1302
+ */
1303
+ template <BOOST_ASIO_COMPLETION_SIGNATURE... Signatures,
1304
+ typename Implementation, typename... IoObjectsOrExecutors>
1305
+ inline auto co_composed(Implementation&& implementation,
1306
+ IoObjectsOrExecutors&&... io_objects_or_executors)
1307
+ {
1308
+ return detail::make_initiate_co_composed<Signatures...>(
1309
+ static_cast<Implementation&&>(implementation),
1310
+ detail::make_composed_io_executors(
1311
+ detail::get_composed_io_executor(
1312
+ static_cast<IoObjectsOrExecutors&&>(
1313
+ io_objects_or_executors))...));
1314
+ }
1315
+
1316
+ } // namespace asio
1317
+ } // namespace boost
1318
+
1174
1319
  #include <boost/asio/detail/pop_options.hpp>
1175
1320
 
1176
- #endif // BOOST_ASIO_IMPL_EXPERIMENTAL_CO_COMPOSED_HPP
1321
+ #endif // defined(BOOST_ASIO_HAS_CO_AWAIT) || defined(GENERATING_DOCUMENTATION)
1322
+
1323
+ #endif // BOOST_ASIO_CO_COMPOSED_HPP
@@ -17,6 +17,8 @@
17
17
 
18
18
  #include <boost/asio/detail/config.hpp>
19
19
  #include <cstddef>
20
+ #include <boost/asio/detail/type_traits.hpp>
21
+ #include <boost/system/error_code.hpp>
20
22
 
21
23
  #include <boost/asio/detail/push_options.hpp>
22
24
 
@@ -98,8 +100,55 @@ private:
98
100
  std::size_t size_;
99
101
  };
100
102
 
103
+ template <typename T, typename = void>
104
+ struct is_completion_condition_helper : false_type
105
+ {
106
+ };
107
+
108
+ template <typename T>
109
+ struct is_completion_condition_helper<T,
110
+ enable_if_t<
111
+ is_same<
112
+ result_of_t<T(boost::system::error_code, std::size_t)>,
113
+ bool
114
+ >::value
115
+ >
116
+ > : true_type
117
+ {
118
+ };
119
+
120
+ template <typename T>
121
+ struct is_completion_condition_helper<T,
122
+ enable_if_t<
123
+ is_same<
124
+ result_of_t<T(boost::system::error_code, std::size_t)>,
125
+ std::size_t
126
+ >::value
127
+ >
128
+ > : true_type
129
+ {
130
+ };
131
+
101
132
  } // namespace detail
102
133
 
134
+ #if defined(GENERATING_DOCUMENTATION)
135
+
136
+ /// Trait for determining whether a function object is a completion condition.
137
+ template <typename T>
138
+ struct is_completion_condition
139
+ {
140
+ static constexpr bool value = automatically_determined;
141
+ };
142
+
143
+ #else // defined(GENERATING_DOCUMENTATION)
144
+
145
+ template <typename T>
146
+ struct is_completion_condition : detail::is_completion_condition_helper<T>
147
+ {
148
+ };
149
+
150
+ #endif // defined(GENERATING_DOCUMENTATION)
151
+
103
152
  /**
104
153
  * @defgroup completion_condition Completion Condition Function Objects
105
154
  *