passenger 6.0.22 → 6.0.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (334) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +59 -1
  3. data/Rakefile +13 -2
  4. data/bin/passenger-install-apache2-module +5 -0
  5. data/bin/passenger-install-nginx-module +18 -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 +24 -13
  11. data/package.json +1 -1
  12. data/passenger.gemspec +4 -2
  13. data/resources/templates/standalone/server.erb +1 -0
  14. data/src/agent/Core/ApplicationPool/Group/InitializationAndShutdown.cpp +8 -0
  15. data/src/agent/Core/ApplicationPool/Group/InternalUtils.cpp +10 -2
  16. data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +8 -0
  17. data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +9 -0
  18. data/src/agent/Core/ApplicationPool/Group/OutOfBandWork.cpp +9 -0
  19. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +63 -50
  20. data/src/agent/Core/ApplicationPool/Group/SessionManagement.cpp +19 -9
  21. data/src/agent/Core/ApplicationPool/Group/SpawningAndRestarting.cpp +8 -0
  22. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +9 -1
  23. data/src/agent/Core/ApplicationPool/Group/Verification.cpp +8 -0
  24. data/src/agent/Core/ApplicationPool/Group.h +15 -5
  25. data/src/agent/Core/ApplicationPool/Pool/AnalyticsCollection.cpp +5 -0
  26. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +5 -0
  27. data/src/agent/Core/ApplicationPool/Pool/GeneralUtils.cpp +5 -0
  28. data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +5 -0
  29. data/src/agent/Core/ApplicationPool/Pool/InitializationAndShutdown.cpp +5 -0
  30. data/src/agent/Core/ApplicationPool/Pool/Miscellaneous.cpp +5 -0
  31. data/src/agent/Core/ApplicationPool/Pool/ProcessUtils.cpp +5 -0
  32. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +11 -4
  33. data/src/agent/Core/ApplicationPool/Pool.h +0 -2
  34. data/src/agent/Core/ApplicationPool/Process.h +22 -6
  35. data/src/agent/Core/ApplicationPool/Session.h +6 -1
  36. data/src/agent/Core/Config.h +8 -3
  37. data/src/agent/Core/Controller/CheckoutSession.cpp +24 -1
  38. data/src/agent/Core/Controller/Config.h +5 -1
  39. data/src/agent/Core/Controller.h +1 -0
  40. data/src/agent/Core/CoreMain.cpp +10 -17
  41. data/src/agent/Core/OptionParser.h +3 -0
  42. data/src/agent/Core/SpawningKit/ErrorRenderer.h +5 -0
  43. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -53
  44. data/src/agent/Core/SpawningKit/Handshake/Session.h +3 -0
  45. data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +5 -2
  46. data/src/agent/Core/SpawningKit/SmartSpawner.h +6 -2
  47. data/src/agent/Core/SpawningKit/Spawner.h +4 -0
  48. data/src/agent/Shared/Fundamentals/AbortHandler.cpp +88 -9
  49. data/src/agent/Shared/Fundamentals/AbortHandler.h +2 -0
  50. data/src/agent/Shared/Fundamentals/Initialization.cpp +9 -3
  51. data/src/agent/Shared/Fundamentals/Initialization.h +3 -3
  52. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +6 -7
  53. data/src/agent/Watchdog/Config.h +2 -1
  54. data/src/agent/Watchdog/WatchdogMain.cpp +4 -7
  55. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +5 -0
  56. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +15 -0
  57. data/src/apache2_module/ConfigGeneral/ManifestGeneration.h +5 -3
  58. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +5 -0
  59. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +3 -0
  60. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +13 -0
  61. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +7 -0
  62. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +16 -0
  63. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h.cxxcodebuilder +3 -0
  64. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +2 -1
  65. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h.cxxcodebuilder +2 -1
  66. data/src/cxx_supportlib/Constants.h +1 -1
  67. data/src/cxx_supportlib/DataStructures/LString.h +4 -0
  68. data/src/cxx_supportlib/DataStructures/StringMap.h +0 -1
  69. data/src/cxx_supportlib/FileTools/PathManip.cpp +1 -1
  70. data/src/cxx_supportlib/SafeLibev.h +1 -3
  71. data/src/cxx_supportlib/ServerKit/Hooks.h +2 -2
  72. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +0 -1
  73. data/src/cxx_supportlib/ServerKit/HttpServer.h +15 -10
  74. data/src/cxx_supportlib/ServerKit/Server.h +0 -6
  75. data/src/cxx_supportlib/Utils/AsyncSignalSafeUtils.h +2 -0
  76. data/src/cxx_supportlib/Utils/SpeedMeter.h +0 -3
  77. data/src/cxx_supportlib/oxt/implementation.cpp +11 -0
  78. data/src/cxx_supportlib/oxt/system_calls.cpp +10 -3
  79. data/src/cxx_supportlib/oxt/thread.hpp +1 -1
  80. data/src/cxx_supportlib/vendor-modified/boost/asio/as_tuple.hpp +35 -9
  81. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_immediate_executor.hpp +3 -2
  82. data/src/cxx_supportlib/vendor-modified/boost/asio/associator.hpp +1 -1
  83. data/src/cxx_supportlib/vendor-modified/boost/asio/async_result.hpp +74 -68
  84. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_datagram_socket.hpp +11 -11
  85. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_deadline_timer.hpp +2 -2
  86. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_random_access_file.hpp +2 -2
  87. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_raw_socket.hpp +10 -10
  88. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_readable_pipe.hpp +1 -1
  89. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_seq_packet_socket.hpp +3 -3
  90. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_serial_port.hpp +2 -2
  91. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_signal_set.hpp +1 -1
  92. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket.hpp +2 -2
  93. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_acceptor.hpp +9 -9
  94. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_file.hpp +2 -2
  95. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_socket.hpp +6 -6
  96. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_waitable_timer.hpp +2 -2
  97. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_writable_pipe.hpp +1 -1
  98. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_allocator.hpp +88 -22
  99. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_cancellation_slot.hpp +91 -22
  100. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_executor.hpp +105 -23
  101. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_immediate_executor.hpp +90 -23
  102. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +2 -2
  103. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer_registration.hpp +1 -1
  104. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_after.hpp +303 -0
  105. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_at.hpp +296 -0
  106. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/impl/co_composed.hpp → co_composed.hpp} +208 -61
  107. data/src/cxx_supportlib/vendor-modified/boost/asio/completion_condition.hpp +49 -0
  108. data/src/cxx_supportlib/vendor-modified/boost/asio/compose.hpp +10 -201
  109. data/src/cxx_supportlib/vendor-modified/boost/asio/composed.hpp +415 -0
  110. data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +214 -48
  111. data/src/cxx_supportlib/vendor-modified/boost/asio/coroutine.hpp +3 -4
  112. data/src/cxx_supportlib/vendor-modified/boost/asio/default_completion_token.hpp +91 -0
  113. data/src/cxx_supportlib/vendor-modified/boost/asio/deferred.hpp +9 -5
  114. data/src/cxx_supportlib/vendor-modified/boost/asio/detached.hpp +2 -2
  115. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffered_stream_storage.hpp +1 -1
  116. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_message.hpp → detail/completion_message.hpp} +14 -16
  117. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_payload.hpp → detail/completion_payload.hpp} +30 -32
  118. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_handler.hpp → detail/completion_payload_handler.hpp} +15 -13
  119. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +26 -32
  120. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/deadline_timer_service.hpp +5 -1
  121. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_alloc_helpers.hpp +14 -118
  122. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/descriptor_ops.ipp +36 -33
  123. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.ipp +1 -1
  124. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_descriptor_service.ipp +7 -5
  125. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_socket_service_base.ipp +6 -4
  126. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +44 -35
  127. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_select_interrupter.ipp +1 -1
  128. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/initiation_base.hpp +64 -0
  129. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/memory.hpp +0 -11
  130. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_descriptor_service.hpp +20 -16
  131. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_send_op.hpp +0 -1
  132. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service.hpp +4 -4
  133. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service_base.hpp +23 -18
  134. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/recycling_allocator.hpp +9 -0
  135. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_endpoint_op.hpp +1 -1
  136. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_query_op.hpp +1 -1
  137. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_info_base.hpp +11 -1
  138. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timed_cancel_op.hpp +363 -0
  139. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wrapped_handler.hpp +29 -51
  140. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/allocator.hpp +1 -1
  141. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking.hpp +1 -1
  142. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking_adaptation.hpp +1 -1
  143. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context.hpp +1 -1
  144. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/mapping.hpp +1 -1
  145. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/occupancy.hpp +1 -1
  146. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/outstanding_work.hpp +1 -1
  147. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/relationship.hpp +1 -1
  148. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_channel.hpp +2 -1
  149. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_concurrent_channel.hpp +2 -1
  150. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_composed.hpp +2 -114
  151. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_receive_op.hpp +2 -3
  152. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_functions.hpp +27 -19
  153. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_op.hpp +0 -1
  154. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_service.hpp +17 -15
  155. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_promise_allocator.hpp +2 -3
  156. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/impl/channel_service.hpp +4 -2
  157. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/partial_promise.hpp +3 -5
  158. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/as_single.hpp +12 -7
  159. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/coro.hpp +1 -1
  160. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/parallel_group.hpp +38 -40
  161. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/promise.hpp +3 -3
  162. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_coro.hpp +5 -5
  163. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_promise.hpp +1 -1
  164. data/src/cxx_supportlib/vendor-modified/boost/asio/immediate.hpp +144 -0
  165. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/append.hpp +14 -7
  166. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/as_tuple.hpp +45 -14
  167. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp +3 -3
  168. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_after.hpp +270 -0
  169. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_at.hpp +270 -0
  170. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/co_spawn.hpp +8 -0
  171. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect.hpp +60 -166
  172. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/consign.hpp +14 -7
  173. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/detached.hpp +2 -2
  174. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/prepend.hpp +14 -7
  175. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read.hpp +26 -177
  176. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_at.hpp +16 -82
  177. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +13 -286
  178. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/redirect_error.hpp +55 -18
  179. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/spawn.hpp +1 -1
  180. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write.hpp +26 -185
  181. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write_at.hpp +16 -87
  182. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context_strand.hpp +5 -5
  183. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +6 -6
  184. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/socket_option.hpp +1 -1
  185. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.ipp +1 -1
  186. data/src/cxx_supportlib/vendor-modified/boost/asio/placeholders.hpp +12 -6
  187. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_descriptor.hpp +1 -1
  188. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_stream_descriptor.hpp +2 -2
  189. data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +127 -28
  190. data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +70 -20
  191. data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +114 -36
  192. data/src/cxx_supportlib/vendor-modified/boost/asio/redirect_error.hpp +43 -3
  193. data/src/cxx_supportlib/vendor-modified/boost/asio/registered_buffer.hpp +2 -2
  194. data/src/cxx_supportlib/vendor-modified/boost/asio/spawn.hpp +0 -1
  195. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/openssl_init.ipp +2 -2
  196. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +10 -7
  197. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +5 -5
  198. data/src/cxx_supportlib/vendor-modified/boost/asio/this_coro.hpp +2 -2
  199. data/src/cxx_supportlib/vendor-modified/boost/asio/use_awaitable.hpp +2 -2
  200. data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +1 -1
  201. data/src/cxx_supportlib/vendor-modified/boost/asio/uses_executor.hpp +1 -1
  202. data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +1 -1
  203. data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +147 -35
  204. data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +74 -22
  205. data/src/cxx_supportlib/vendor-modified/boost/asio.hpp +6 -0
  206. data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +4 -1
  207. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/futex.hpp +42 -11
  208. data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +15 -37
  209. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +8 -8
  210. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +1 -1
  211. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +151 -10
  212. data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +11 -9
  213. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +611 -102
  214. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +1 -1
  215. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +47 -47
  216. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +25 -24
  217. data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocation_type.hpp +7 -7
  218. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_list.hpp +2 -2
  219. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_slist.hpp +2 -2
  220. data/src/cxx_supportlib/vendor-modified/boost/container/detail/construct_in_place.hpp +35 -1
  221. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +14 -14
  222. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +1 -1
  223. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +55 -23
  224. data/src/cxx_supportlib/vendor-modified/boost/container/detail/function_detector.hpp +1 -1
  225. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_container.hpp +2 -2
  226. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_contiguous_container.hpp +1 -1
  227. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_pair.hpp +4 -4
  228. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +8 -8
  229. data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +9 -9
  230. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +4 -4
  231. data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +96 -10
  232. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +19 -4
  233. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +1 -1
  234. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +17 -17
  235. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common.hpp +1 -1
  236. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +2 -2
  237. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_resource.hpp +4 -4
  238. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +86 -52
  239. data/src/cxx_supportlib/vendor-modified/boost/container/detail/version_type.hpp +4 -4
  240. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +12 -0
  241. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +145 -65
  242. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +105 -22
  243. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +2 -2
  244. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +30 -22
  245. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +19 -2
  246. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +1 -1
  247. data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +15 -8
  248. data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +6 -5
  249. data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +15 -15
  250. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +1 -1
  251. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +1 -1
  252. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +3 -3
  253. data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +1 -1
  254. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +2 -2
  255. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +31 -24
  256. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +45 -43
  257. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +45 -33
  258. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +5 -7
  259. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +55 -47
  260. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator.hpp +3 -3
  261. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +222 -73
  262. data/src/cxx_supportlib/vendor-modified/boost/core/detail/minstd_rand.hpp +58 -0
  263. data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +13 -13
  264. data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +53 -5
  265. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +1 -0
  266. data/src/cxx_supportlib/vendor-modified/boost/core/pointer_in_range.hpp +49 -0
  267. data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +2 -0
  268. data/src/cxx_supportlib/vendor-modified/boost/core/type_name.hpp +7 -2
  269. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +22 -34
  270. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +141 -38
  271. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/algorithm.hpp +8 -8
  272. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash.hpp +1 -1
  273. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +8 -6
  274. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_traits.hpp +18 -18
  275. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +22 -17
  276. data/src/cxx_supportlib/vendor-modified/boost/libs/random/src/random_device.cpp +3 -1
  277. data/src/cxx_supportlib/vendor-modified/boost/move/detail/config_begin.hpp +0 -1
  278. data/src/cxx_supportlib/vendor-modified/boost/move/detail/launder.hpp +53 -0
  279. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +9 -1
  280. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +6 -1
  281. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
  282. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/integral_wrapper.hpp +2 -1
  283. data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
  284. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/requires_cxx11.hpp +1 -1
  285. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp +4 -1
  286. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category_message.hpp +13 -1
  287. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +13 -1
  288. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map_fwd.hpp +15 -0
  289. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +13 -1
  290. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set_fwd.hpp +15 -0
  291. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +22 -6
  292. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +38 -10
  293. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +111 -2
  294. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/cumulative_stats.hpp +177 -0
  295. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +11 -1
  296. data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +33 -7
  297. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +12 -0
  298. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map_fwd.hpp +15 -0
  299. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +12 -0
  300. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set_fwd.hpp +14 -0
  301. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +19 -0
  302. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +12 -0
  303. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map_fwd.hpp +15 -0
  304. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +12 -0
  305. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set_fwd.hpp +14 -0
  306. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +17 -0
  307. data/src/cxx_supportlib/vendor-modified/boost/utility/detail/minstd_rand.hpp +1 -43
  308. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  309. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +8 -0
  310. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +12 -0
  311. data/src/nginx_module/Configuration.c +7 -2
  312. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +6 -0
  313. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +15 -0
  314. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +14 -0
  315. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +3 -0
  316. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +4 -0
  317. data/src/ruby_native_extension/passenger_native_support.c +1 -0
  318. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +5 -0
  319. data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +6 -2
  320. data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +10 -0
  321. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +12 -4
  322. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +5 -0
  323. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +32 -5
  324. data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -0
  325. data/src/ruby_supportlib/phusion_passenger/rack/handler.rb +73 -0
  326. data/src/ruby_supportlib/phusion_passenger/rack_handler.rb +30 -56
  327. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +5 -0
  328. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +1 -0
  329. data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +0 -4
  330. data/src/ruby_supportlib/phusion_passenger/utils/json.rb +7 -198
  331. data/src/ruby_supportlib/phusion_passenger/utils/strscan.rb +67 -0
  332. data/src/ruby_supportlib/phusion_passenger/utils.rb +5 -15
  333. data/src/ruby_supportlib/phusion_passenger.rb +5 -5
  334. metadata +39 -10
@@ -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