passenger 6.0.23 → 6.0.24

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

Potentially problematic release.


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

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