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
@@ -40,6 +40,10 @@
40
40
  #include <type_traits>
41
41
  #include <utility>
42
42
 
43
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
44
+ #include <boost/unordered/detail/foa/cumulative_stats.hpp>
45
+ #endif
46
+
43
47
  #if !defined(BOOST_UNORDERED_DISABLE_SSE2)
44
48
  #if defined(BOOST_UNORDERED_ENABLE_SSE2)|| \
45
49
  defined(__SSE2__)|| \
@@ -864,6 +868,7 @@ struct pow2_quadratic_prober
864
868
  pow2_quadratic_prober(std::size_t pos_):pos{pos_}{}
865
869
 
866
870
  inline std::size_t get()const{return pos;}
871
+ inline std::size_t length()const{return step+1;}
867
872
 
868
873
  /* next returns false when the whole array has been traversed, which ends
869
874
  * probing (in practice, full-table probing will only happen with very small
@@ -1125,6 +1130,54 @@ struct table_arrays
1125
1130
  value_type_pointer elements_;
1126
1131
  };
1127
1132
 
1133
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
1134
+ /* stats support */
1135
+
1136
+ struct table_core_cumulative_stats
1137
+ {
1138
+ concurrent_cumulative_stats<1> insertion;
1139
+ concurrent_cumulative_stats<2> successful_lookup,
1140
+ unsuccessful_lookup;
1141
+ };
1142
+
1143
+ struct table_core_insertion_stats
1144
+ {
1145
+ std::size_t count;
1146
+ sequence_stats_summary probe_length;
1147
+ };
1148
+
1149
+ struct table_core_lookup_stats
1150
+ {
1151
+ std::size_t count;
1152
+ sequence_stats_summary probe_length;
1153
+ sequence_stats_summary num_comparisons;
1154
+ };
1155
+
1156
+ struct table_core_stats
1157
+ {
1158
+ table_core_insertion_stats insertion;
1159
+ table_core_lookup_stats successful_lookup,
1160
+ unsuccessful_lookup;
1161
+ };
1162
+
1163
+ #define BOOST_UNORDERED_ADD_STATS(stats,args) stats.add args
1164
+ #define BOOST_UNORDERED_SWAP_STATS(stats1,stats2) std::swap(stats1,stats2)
1165
+ #define BOOST_UNORDERED_COPY_STATS(stats1,stats2) stats1=stats2
1166
+ #define BOOST_UNORDERED_RESET_STATS_OF(x) x.reset_stats()
1167
+ #define BOOST_UNORDERED_STATS_COUNTER(name) std::size_t name=0
1168
+ #define BOOST_UNORDERED_INCREMENT_STATS_COUNTER(name) ++name
1169
+
1170
+ #else
1171
+
1172
+ #define BOOST_UNORDERED_ADD_STATS(stats,args) ((void)0)
1173
+ #define BOOST_UNORDERED_SWAP_STATS(stats1,stats2) ((void)0)
1174
+ #define BOOST_UNORDERED_COPY_STATS(stats1,stats2) ((void)0)
1175
+ #define BOOST_UNORDERED_RESET_STATS_OF(x) ((void)0)
1176
+ #define BOOST_UNORDERED_STATS_COUNTER(name) ((void)0)
1177
+ #define BOOST_UNORDERED_INCREMENT_STATS_COUNTER(name) ((void)0)
1178
+
1179
+ #endif
1180
+
1128
1181
  struct if_constexpr_void_else{void operator()()const{}};
1129
1182
 
1130
1183
  template<bool B,typename F,typename G=if_constexpr_void_else>
@@ -1395,6 +1448,11 @@ public:
1395
1448
  using locator=table_locator<group_type,element_type>;
1396
1449
  using arrays_holder_type=arrays_holder<arrays_type,Allocator>;
1397
1450
 
1451
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
1452
+ using cumulative_stats=table_core_cumulative_stats;
1453
+ using stats=table_core_stats;
1454
+ #endif
1455
+
1398
1456
  table_core(
1399
1457
  std::size_t n=default_bucket_count,const Hash& h_=Hash(),
1400
1458
  const Pred& pred_=Pred(),const Allocator& al_=Allocator()):
@@ -1429,6 +1487,7 @@ public:
1429
1487
  x.arrays=ah.release();
1430
1488
  x.size_ctrl.ml=x.initial_max_load();
1431
1489
  x.size_ctrl.size=0;
1490
+ BOOST_UNORDERED_SWAP_STATS(cstats,x.cstats);
1432
1491
  }
1433
1492
 
1434
1493
  table_core(table_core&& x)
@@ -1454,11 +1513,13 @@ public:
1454
1513
  using std::swap;
1455
1514
  swap(arrays,x.arrays);
1456
1515
  swap(size_ctrl,x.size_ctrl);
1516
+ BOOST_UNORDERED_SWAP_STATS(cstats,x.cstats);
1457
1517
  }
1458
1518
  else{
1459
1519
  reserve(x.size());
1460
1520
  clear_on_exit c{x};
1461
1521
  (void)c; /* unused var warning */
1522
+ BOOST_UNORDERED_RESET_STATS_OF(x);
1462
1523
 
1463
1524
  /* This works because subsequent x.clear() does not depend on the
1464
1525
  * elements' values.
@@ -1574,9 +1635,11 @@ public:
1574
1635
  arrays=x.arrays;
1575
1636
  size_ctrl.ml=std::size_t(x.size_ctrl.ml);
1576
1637
  size_ctrl.size=std::size_t(x.size_ctrl.size);
1638
+ BOOST_UNORDERED_COPY_STATS(cstats,x.cstats);
1577
1639
  x.arrays=ah.release();
1578
1640
  x.size_ctrl.ml=x.initial_max_load();
1579
1641
  x.size_ctrl.size=0;
1642
+ BOOST_UNORDERED_RESET_STATS_OF(x);
1580
1643
  }
1581
1644
  else{
1582
1645
  swap(h(),x.h());
@@ -1586,6 +1649,7 @@ public:
1586
1649
  noshrink_reserve(x.size());
1587
1650
  clear_on_exit c{x};
1588
1651
  (void)c; /* unused var warning */
1652
+ BOOST_UNORDERED_RESET_STATS_OF(x);
1589
1653
 
1590
1654
  /* This works because subsequent x.clear() does not depend on the
1591
1655
  * elements' values.
@@ -1639,6 +1703,7 @@ public:
1639
1703
  BOOST_FORCEINLINE locator find(
1640
1704
  const Key& x,std::size_t pos0,std::size_t hash)const
1641
1705
  {
1706
+ BOOST_UNORDERED_STATS_COUNTER(num_cmps);
1642
1707
  prober pb(pos0);
1643
1708
  do{
1644
1709
  auto pos=pb.get();
@@ -1650,18 +1715,25 @@ public:
1650
1715
  auto p=elements+pos*N;
1651
1716
  BOOST_UNORDERED_PREFETCH_ELEMENTS(p,N);
1652
1717
  do{
1718
+ BOOST_UNORDERED_INCREMENT_STATS_COUNTER(num_cmps);
1653
1719
  auto n=unchecked_countr_zero(mask);
1654
1720
  if(BOOST_LIKELY(bool(pred()(x,key_from(p[n]))))){
1721
+ BOOST_UNORDERED_ADD_STATS(
1722
+ cstats.successful_lookup,(pb.length(),num_cmps));
1655
1723
  return {pg,n,p+n};
1656
1724
  }
1657
1725
  mask&=mask-1;
1658
1726
  }while(mask);
1659
1727
  }
1660
1728
  if(BOOST_LIKELY(pg->is_not_overflowed(hash))){
1729
+ BOOST_UNORDERED_ADD_STATS(
1730
+ cstats.unsuccessful_lookup,(pb.length(),num_cmps));
1661
1731
  return {};
1662
1732
  }
1663
1733
  }
1664
1734
  while(BOOST_LIKELY(pb.next(arrays.groups_size_mask)));
1735
+ BOOST_UNORDERED_ADD_STATS(
1736
+ cstats.unsuccessful_lookup,(pb.length(),num_cmps));
1665
1737
  return {};
1666
1738
  }
1667
1739
 
@@ -1746,6 +1818,38 @@ public:
1746
1818
  rehash(std::size_t(std::ceil(float(n)/mlf)));
1747
1819
  }
1748
1820
 
1821
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
1822
+ stats get_stats()const
1823
+ {
1824
+ auto insertion=cstats.insertion.get_summary();
1825
+ auto successful_lookup=cstats.successful_lookup.get_summary();
1826
+ auto unsuccessful_lookup=cstats.unsuccessful_lookup.get_summary();
1827
+ return{
1828
+ {
1829
+ insertion.count,
1830
+ insertion.sequence_summary[0]
1831
+ },
1832
+ {
1833
+ successful_lookup.count,
1834
+ successful_lookup.sequence_summary[0],
1835
+ successful_lookup.sequence_summary[1]
1836
+ },
1837
+ {
1838
+ unsuccessful_lookup.count,
1839
+ unsuccessful_lookup.sequence_summary[0],
1840
+ unsuccessful_lookup.sequence_summary[1]
1841
+ },
1842
+ };
1843
+ }
1844
+
1845
+ void reset_stats()noexcept
1846
+ {
1847
+ cstats.insertion.reset();
1848
+ cstats.successful_lookup.reset();
1849
+ cstats.unsuccessful_lookup.reset();
1850
+ }
1851
+ #endif
1852
+
1749
1853
  friend bool operator==(const table_core& x,const table_core& y)
1750
1854
  {
1751
1855
  return
@@ -1953,8 +2057,12 @@ public:
1953
2057
  return true;
1954
2058
  }
1955
2059
 
1956
- arrays_type arrays;
1957
- size_ctrl_type size_ctrl;
2060
+ arrays_type arrays;
2061
+ size_ctrl_type size_ctrl;
2062
+
2063
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
2064
+ mutable cumulative_stats cstats;
2065
+ #endif
1958
2066
 
1959
2067
  private:
1960
2068
  template<
@@ -2243,6 +2351,7 @@ private:
2243
2351
  auto p=arrays_.elements()+pos*N+n;
2244
2352
  construct_element(p,std::forward<Args>(args)...);
2245
2353
  pg->set(n,hash);
2354
+ BOOST_UNORDERED_ADD_STATS(cstats.insertion,(pb.length()));
2246
2355
  return {pg,n,p};
2247
2356
  }
2248
2357
  else pg->mark_overflow(hash);
@@ -0,0 +1,177 @@
1
+ /* Copyright 2024 Joaquin M Lopez Munoz.
2
+ * Distributed under the Boost Software License, Version 1.0.
3
+ * (See accompanying file LICENSE_1_0.txt or copy at
4
+ * http://www.boost.org/LICENSE_1_0.txt)
5
+ *
6
+ * See https://www.boost.org/libs/unordered for library home page.
7
+ */
8
+
9
+ #ifndef BOOST_UNORDERED_DETAIL_FOA_CUMULATIVE_STATS_HPP
10
+ #define BOOST_UNORDERED_DETAIL_FOA_CUMULATIVE_STATS_HPP
11
+
12
+ #include <array>
13
+ #include <boost/config.hpp>
14
+ #include <boost/mp11/tuple.hpp>
15
+ #include <cmath>
16
+ #include <cstddef>
17
+
18
+ #if defined(BOOST_HAS_THREADS)
19
+ #include <boost/unordered/detail/foa/rw_spinlock.hpp>
20
+ #include <mutex>
21
+ #endif
22
+
23
+ namespace boost{
24
+ namespace unordered{
25
+ namespace detail{
26
+ namespace foa{
27
+
28
+ /* Cumulative one-pass calculation of the average, variance and deviation of
29
+ * running sequences.
30
+ */
31
+
32
+ struct sequence_stats_data
33
+ {
34
+ double m=0.0;
35
+ double m_prior=0.0;
36
+ double s=0.0;
37
+ };
38
+
39
+ struct welfords_algorithm /* 0-based */
40
+ {
41
+ template<typename T>
42
+ int operator()(T&& x,sequence_stats_data& d)const noexcept
43
+ {
44
+ static_assert(
45
+ noexcept(static_cast<double>(x)),
46
+ "Argument conversion to double must not throw.");
47
+
48
+ d.m_prior=d.m;
49
+ d.m+=(static_cast<double>(x)-d.m)/static_cast<double>(n);
50
+ d.s+=(n!=1)*
51
+ (static_cast<double>(x)-d.m_prior)*(static_cast<double>(x)-d.m);
52
+
53
+ return 0; /* mp11::tuple_transform requires that return type not be void */
54
+ }
55
+
56
+ std::size_t n;
57
+ };
58
+
59
+ struct sequence_stats_summary
60
+ {
61
+ double average;
62
+ double variance;
63
+ double deviation;
64
+ };
65
+
66
+ /* Stats calculated jointly for N same-sized sequences to save the space
67
+ * for count.
68
+ */
69
+
70
+ template<std::size_t N>
71
+ class cumulative_stats
72
+ {
73
+ public:
74
+ struct summary
75
+ {
76
+ std::size_t count;
77
+ std::array<sequence_stats_summary,N> sequence_summary;
78
+ };
79
+
80
+ void reset()noexcept{*this=cumulative_stats();}
81
+
82
+ template<typename... Ts>
83
+ void add(Ts&&... xs)noexcept
84
+ {
85
+ static_assert(
86
+ sizeof...(Ts)==N,"A sample must be provided for each sequence.");
87
+
88
+ if(BOOST_UNLIKELY(++n==0)){ /* wraparound */
89
+ reset();
90
+ n=1;
91
+ }
92
+ mp11::tuple_transform(
93
+ welfords_algorithm{n},
94
+ std::forward_as_tuple(std::forward<Ts>(xs)...),
95
+ data);
96
+ }
97
+
98
+ summary get_summary()const noexcept
99
+ {
100
+ summary res;
101
+ res.count=n;
102
+ for(std::size_t i=0;i<N;++i){
103
+ double average=data[i].m,
104
+ variance=n!=0?data[i].s/static_cast<double>(n):0.0, /* biased */
105
+ deviation=std::sqrt(variance);
106
+ res.sequence_summary[i]={average,variance,deviation};
107
+ }
108
+ return res;
109
+ }
110
+
111
+ private:
112
+ std::size_t n=0;
113
+ std::array<sequence_stats_data,N> data;
114
+ };
115
+
116
+ #if defined(BOOST_HAS_THREADS)
117
+
118
+ template<std::size_t N>
119
+ class concurrent_cumulative_stats:cumulative_stats<N>
120
+ {
121
+ using super=cumulative_stats<N>;
122
+ using lock_guard=std::lock_guard<rw_spinlock>;
123
+
124
+ public:
125
+ using summary=typename super::summary;
126
+
127
+ concurrent_cumulative_stats()noexcept:super{}{}
128
+ concurrent_cumulative_stats(const concurrent_cumulative_stats& x)noexcept:
129
+ concurrent_cumulative_stats{x,lock_guard{x.mut}}{}
130
+
131
+ concurrent_cumulative_stats&
132
+ operator=(const concurrent_cumulative_stats& x)noexcept
133
+ {
134
+ auto x1=x;
135
+ lock_guard lck{mut};
136
+ static_cast<super&>(*this)=x1;
137
+ return *this;
138
+ }
139
+
140
+ void reset()noexcept
141
+ {
142
+ lock_guard lck{mut};
143
+ super::reset();
144
+ }
145
+
146
+ template<typename... Ts>
147
+ void add(Ts&&... xs)noexcept
148
+ {
149
+ lock_guard lck{mut};
150
+ super::add(std::forward<Ts>(xs)...);
151
+ }
152
+
153
+ summary get_summary()const noexcept
154
+ {
155
+ lock_guard lck{mut};
156
+ return super::get_summary();
157
+ }
158
+
159
+ private:
160
+ concurrent_cumulative_stats(const super& x,lock_guard&&):super{x}{}
161
+
162
+ mutable rw_spinlock mut;
163
+ };
164
+
165
+ #else
166
+
167
+ template<std::size_t N>
168
+ using concurrent_cumulative_stats=cumulative_stats<N>;
169
+
170
+ #endif
171
+
172
+ } /* namespace foa */
173
+ } /* namespace detail */
174
+ } /* namespace unordered */
175
+ } /* namespace boost */
176
+
177
+ #endif
@@ -1,6 +1,6 @@
1
1
  /* Fast open-addressing hash table.
2
2
  *
3
- * Copyright 2022-2023 Joaquin M Lopez Munoz.
3
+ * Copyright 2022-2024 Joaquin M Lopez Munoz.
4
4
  * Copyright 2023 Christian Mazakas.
5
5
  * Copyright 2024 Braden Ganetsky.
6
6
  * Distributed under the Boost Software License, Version 1.0.
@@ -361,6 +361,10 @@ public:
361
361
  const_iterator>::type;
362
362
  using erase_return_type=table_erase_return_type<iterator>;
363
363
 
364
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
365
+ using stats=typename super::stats;
366
+ #endif
367
+
364
368
  table(
365
369
  std::size_t n=default_bucket_count,const Hash& h_=Hash(),
366
370
  const Pred& pred_=Pred(),const Allocator& al_=Allocator()):
@@ -542,6 +546,11 @@ public:
542
546
  using super::rehash;
543
547
  using super::reserve;
544
548
 
549
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
550
+ using super::get_stats;
551
+ using super::reset_stats;
552
+ #endif
553
+
545
554
  template<typename Predicate>
546
555
  friend std::size_t erase_if(table& x,Predicate& pr)
547
556
  {
@@ -584,6 +593,7 @@ private:
584
593
  x.arrays=ah.release();
585
594
  x.size_ctrl.ml=x.initial_max_load();
586
595
  x.size_ctrl.size=0;
596
+ BOOST_UNORDERED_SWAP_STATS(this->cstats,x.cstats);
587
597
  }
588
598
 
589
599
  template<typename ExclusiveLockGuard>
@@ -1,6 +1,6 @@
1
1
  /* Hash function characterization.
2
2
  *
3
- * Copyright 2022 Joaquin M Lopez Munoz.
3
+ * Copyright 2022-2024 Joaquin M Lopez Munoz.
4
4
  * Distributed under the Boost Software License, Version 1.0.
5
5
  * (See accompanying file LICENSE_1_0.txt or copy at
6
6
  * http://www.boost.org/LICENSE_1_0.txt)
@@ -19,12 +19,34 @@ namespace unordered{
19
19
  namespace detail{
20
20
 
21
21
  template<typename Hash,typename=void>
22
- struct hash_is_avalanching_impl: std::false_type{};
22
+ struct hash_is_avalanching_impl:std::false_type{};
23
+
24
+ template<typename IsAvalanching>
25
+ struct avalanching_value
26
+ {
27
+ static constexpr bool value=IsAvalanching::value;
28
+ };
29
+
30
+ /* may be explicitly marked as BOOST_DEPRECATED in the future */
31
+ template<> struct avalanching_value<void>
32
+ {
33
+ static constexpr bool value=true;
34
+ };
35
+
36
+ template<typename Hash>
37
+ struct hash_is_avalanching_impl<
38
+ Hash,
39
+ boost::unordered::detail::void_t<typename Hash::is_avalanching>
40
+ >:std::integral_constant<
41
+ bool,
42
+ avalanching_value<typename Hash::is_avalanching>::value
43
+ >{};
23
44
 
24
45
  template<typename Hash>
25
- struct hash_is_avalanching_impl<Hash,
26
- boost::unordered::detail::void_t<typename Hash::is_avalanching> >:
27
- std::true_type{};
46
+ struct hash_is_avalanching_impl<
47
+ Hash,
48
+ typename std::enable_if<((void)Hash::is_avalanching,true)>::type
49
+ >{}; /* Hash::is_avalanching is not a type: compile error downstream */
28
50
 
29
51
  } /* namespace detail */
30
52
 
@@ -32,8 +54,12 @@ struct hash_is_avalanching_impl<Hash,
32
54
  * when actual characterization differs from default.
33
55
  */
34
56
 
35
- /* hash_is_avalanching<Hash>::value is true when the type Hash::is_avalanching
36
- * is present, false otherwise.
57
+ /* hash_is_avalanching<Hash>::value is:
58
+ * - false if Hash::is_avalanching is not present.
59
+ * - Hash::is_avalanching::value if this is present and constexpr-convertible
60
+ * to a bool.
61
+ * - true if Hash::is_avalanching is void (deprecated).
62
+ * - ill-formed otherwise.
37
63
  */
38
64
  template<typename Hash>
39
65
  struct hash_is_avalanching: detail::hash_is_avalanching_impl<Hash>::type{};
@@ -76,6 +76,10 @@ namespace boost {
76
76
  using iterator = typename table_type::iterator;
77
77
  using const_iterator = typename table_type::const_iterator;
78
78
 
79
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
80
+ using stats = typename table_type::stats;
81
+ #endif
82
+
79
83
  unordered_flat_map() : unordered_flat_map(0) {}
80
84
 
81
85
  explicit unordered_flat_map(size_type n, hasher const& h = hasher(),
@@ -654,6 +658,14 @@ namespace boost {
654
658
 
655
659
  void reserve(size_type n) { table_.reserve(n); }
656
660
 
661
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
662
+ /// Stats
663
+ ///
664
+ stats get_stats() const { return table_.get_stats(); }
665
+
666
+ void reset_stats() noexcept { table_.reset_stats(); }
667
+ #endif
668
+
657
669
  /// Observers
658
670
  ///
659
671
 
@@ -1,5 +1,6 @@
1
1
 
2
2
  // Copyright (C) 2022 Christian Mazakas
3
+ // Copyright (C) 2024 Braden Ganetsky
3
4
  // Distributed under the Boost Software License, Version 1.0. (See accompanying
4
5
  // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6
 
@@ -15,6 +16,10 @@
15
16
  #include <functional>
16
17
  #include <memory>
17
18
 
19
+ #ifndef BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
20
+ #include <memory_resource>
21
+ #endif
22
+
18
23
  namespace boost {
19
24
  namespace unordered {
20
25
  template <class Key, class T, class Hash = boost::hash<Key>,
@@ -36,6 +41,16 @@ namespace boost {
36
41
  void swap(unordered_flat_map<Key, T, Hash, KeyEqual, Allocator>& lhs,
37
42
  unordered_flat_map<Key, T, Hash, KeyEqual, Allocator>& rhs)
38
43
  noexcept(noexcept(lhs.swap(rhs)));
44
+
45
+ #ifndef BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
46
+ namespace pmr {
47
+ template <class Key, class T, class Hash = boost::hash<Key>,
48
+ class KeyEqual = std::equal_to<Key> >
49
+ using unordered_flat_map =
50
+ boost::unordered::unordered_flat_map<Key, T, Hash, KeyEqual,
51
+ std::pmr::polymorphic_allocator<std::pair<const Key, T> > >;
52
+ } // namespace pmr
53
+ #endif
39
54
  } // namespace unordered
40
55
 
41
56
  using boost::unordered::unordered_flat_map;
@@ -72,6 +72,10 @@ namespace boost {
72
72
  using iterator = typename table_type::iterator;
73
73
  using const_iterator = typename table_type::const_iterator;
74
74
 
75
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
76
+ using stats = typename table_type::stats;
77
+ #endif
78
+
75
79
  unordered_flat_set() : unordered_flat_set(0) {}
76
80
 
77
81
  explicit unordered_flat_set(size_type n, hasher const& h = hasher(),
@@ -474,6 +478,14 @@ namespace boost {
474
478
 
475
479
  void reserve(size_type n) { table_.reserve(n); }
476
480
 
481
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
482
+ /// Stats
483
+ ///
484
+ stats get_stats() const { return table_.get_stats(); }
485
+
486
+ void reset_stats() noexcept { table_.reset_stats(); }
487
+ #endif
488
+
477
489
  /// Observers
478
490
  ///
479
491
 
@@ -1,5 +1,6 @@
1
1
 
2
2
  // Copyright (C) 2022 Christian Mazakas
3
+ // Copyright (C) 2024 Braden Ganetsky
3
4
  // Distributed under the Boost Software License, Version 1.0. (See accompanying
4
5
  // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6
 
@@ -15,6 +16,10 @@
15
16
  #include <functional>
16
17
  #include <memory>
17
18
 
19
+ #ifndef BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
20
+ #include <memory_resource>
21
+ #endif
22
+
18
23
  namespace boost {
19
24
  namespace unordered {
20
25
  template <class Key, class Hash = boost::hash<Key>,
@@ -36,6 +41,15 @@ namespace boost {
36
41
  void swap(unordered_flat_set<Key, Hash, KeyEqual, Allocator>& lhs,
37
42
  unordered_flat_set<Key, Hash, KeyEqual, Allocator>& rhs)
38
43
  noexcept(noexcept(lhs.swap(rhs)));
44
+
45
+ #ifndef BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
46
+ namespace pmr {
47
+ template <class Key, class Hash = boost::hash<Key>,
48
+ class KeyEqual = std::equal_to<Key> >
49
+ using unordered_flat_set = boost::unordered::unordered_flat_set<Key, Hash,
50
+ KeyEqual, std::pmr::polymorphic_allocator<Key> >;
51
+ } // namespace pmr
52
+ #endif
39
53
  } // namespace unordered
40
54
 
41
55
  using boost::unordered::unordered_flat_set;
@@ -1,6 +1,7 @@
1
1
 
2
2
  // Copyright (C) 2008-2011 Daniel James.
3
3
  // Copyright (C) 2022-2023 Christian Mazakas
4
+ // Copyright (C) 2024 Braden Ganetsky
4
5
  // Distributed under the Boost Software License, Version 1.0. (See accompanying
5
6
  // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7
 
@@ -16,6 +17,10 @@
16
17
  #include <functional>
17
18
  #include <memory>
18
19
 
20
+ #ifndef BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
21
+ #include <memory_resource>
22
+ #endif
23
+
19
24
  namespace boost {
20
25
  namespace unordered {
21
26
  template <class K, class T, class H = boost::hash<K>,
@@ -58,6 +63,20 @@ namespace boost {
58
63
 
59
64
  template <class N, class K, class T, class A> class node_handle_map;
60
65
  template <class Iter, class NodeType> struct insert_return_type_map;
66
+
67
+ #ifndef BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
68
+ namespace pmr {
69
+ template <class K, class T, class H = boost::hash<K>,
70
+ class P = std::equal_to<K> >
71
+ using unordered_map = boost::unordered::unordered_map<K, T, H, P,
72
+ std::pmr::polymorphic_allocator<std::pair<const K, T> > >;
73
+
74
+ template <class K, class T, class H = boost::hash<K>,
75
+ class P = std::equal_to<K> >
76
+ using unordered_multimap = boost::unordered::unordered_multimap<K, T, H,
77
+ P, std::pmr::polymorphic_allocator<std::pair<const K, T> > >;
78
+ } // namespace pmr
79
+ #endif
61
80
  } // namespace unordered
62
81
 
63
82
  using boost::unordered::unordered_map;
@@ -115,6 +115,10 @@ namespace boost {
115
115
  using insert_return_type =
116
116
  detail::foa::insert_return_type<iterator, node_type>;
117
117
 
118
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
119
+ using stats = typename table_type::stats;
120
+ #endif
121
+
118
122
  unordered_node_map() : unordered_node_map(0) {}
119
123
 
120
124
  explicit unordered_node_map(size_type n, hasher const& h = hasher(),
@@ -749,6 +753,14 @@ namespace boost {
749
753
 
750
754
  void reserve(size_type n) { table_.reserve(n); }
751
755
 
756
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
757
+ /// Stats
758
+ ///
759
+ stats get_stats() const { return table_.get_stats(); }
760
+
761
+ void reset_stats() noexcept { table_.reset_stats(); }
762
+ #endif
763
+
752
764
  /// Observers
753
765
  ///
754
766