passenger 6.0.23 → 6.0.24

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,53 @@
1
+ //////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost
4
+ // Software License, Version 1.0. (See accompanying file
5
+ // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
+ //
7
+ // See http://www.boost.org/libs/container for documentation.
8
+ //
9
+ //////////////////////////////////////////////////////////////////////////////
10
+ #ifndef BOOST_MOVE_DETAIL_LAUNDER_HPP
11
+ #define BOOST_MOVE_DETAIL_LAUNDER_HPP
12
+
13
+ #ifndef BOOST_CONFIG_HPP
14
+ # include <boost/config.hpp>
15
+ #endif
16
+
17
+ #if defined(BOOST_HAS_PRAGMA_ONCE)
18
+ # pragma once
19
+ #endif
20
+
21
+ #include <boost/move/detail/workaround.hpp>
22
+
23
+ namespace boost {
24
+ namespace move_detail {
25
+
26
+ #if defined(BOOST_MOVE_HAS_BUILTIN_LAUNDER)
27
+
28
+ template<class T>
29
+ BOOST_MOVE_FORCEINLINE T* launder(T* p)
30
+ {
31
+ return __builtin_launder( p );
32
+ }
33
+
34
+ #else
35
+
36
+ template<class T>
37
+ BOOST_MOVE_FORCEINLINE T* launder(T* p)
38
+ {
39
+ return p;
40
+ }
41
+
42
+ #endif
43
+
44
+ template<class T>
45
+ BOOST_MOVE_FORCEINLINE T launder_cast(const volatile void* p)
46
+ {
47
+ return (launder)((T)p);
48
+ }
49
+
50
+ } //namespace move_detail {
51
+ } //namespace boost {
52
+
53
+ #endif //#ifndef BOOST_MOVE_DETAIL_LAUNDER_HPP
@@ -1197,12 +1197,20 @@ struct aligned_struct;
1197
1197
  template <> struct aligned_struct<1> { char data; };
1198
1198
  template <> struct aligned_struct<2> { short data; };
1199
1199
  template <> struct aligned_struct<4> { int data; };
1200
- template <> struct aligned_struct<8> { double data; };
1200
+ //8 byte alignment does not propely work in x86 if attribute is not used.
1201
+ //If a user declares a variable with 8 byte alignment, such as a double
1202
+ //the compiler will not realign the stack.
1203
+ //
1204
+ //If _declspec(align) is used MSVC will realign the stack.
1205
+ //
1206
+ //Disabled specialization
1207
+ //template <> struct aligned_struct<8> { double data; };
1201
1208
 
1202
1209
  #define BOOST_MOVE_ALIGNED_STRUCT(x) \
1203
1210
  template <> struct aligned_struct<x> { \
1204
1211
  __declspec(align(x)) char data; \
1205
1212
  }
1213
+ BOOST_MOVE_ALIGNED_STRUCT(8);
1206
1214
  BOOST_MOVE_ALIGNED_STRUCT(16);
1207
1215
  BOOST_MOVE_ALIGNED_STRUCT(32);
1208
1216
  BOOST_MOVE_ALIGNED_STRUCT(64);
@@ -147,5 +147,10 @@ template<unsigned> struct static_assert_test {};
147
147
  #define BOOST_MOVE_INTRINSIC_CAST BOOST_MOVE_FORCEINLINE
148
148
  #endif
149
149
 
150
- #endif //#ifndef BOOST_MOVE_DETAIL_WORKAROUND_HPP
150
+ #if defined(__has_builtin)
151
+ #if __has_builtin(__builtin_launder)
152
+ #define BOOST_MOVE_HAS_BUILTIN_LAUNDER
153
+ #endif
154
+ #endif
151
155
 
156
+ #endif //#ifndef BOOST_MOVE_DETAIL_WORKAROUND_HPP
@@ -11,6 +11,6 @@
11
11
  // Same format as BOOST_VERSION:
12
12
  // major * 100000 + minor * 100 + patch
13
13
 
14
- #define BOOST_MP11_VERSION 108500
14
+ #define BOOST_MP11_VERSION 108600
15
15
 
16
16
  #endif // #ifndef BOOST_MP11_VERSION_HPP_INCLUDED
@@ -56,7 +56,8 @@ struct AUX_WRAPPER_NAME
56
56
  // have to #ifdef here: some compilers don't like the 'N + 1' form (MSVC),
57
57
  // while some other don't like 'value + 1' (Borland), and some don't like
58
58
  // either
59
- #if BOOST_WORKAROUND(__EDG_VERSION__, <= 243)
59
+ #if BOOST_WORKAROUND(__EDG_VERSION__, <= 243) \
60
+ || __cplusplus >= 201103L
60
61
  private:
61
62
  BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, next_value = BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N + 1)));
62
63
  BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, prior_value = BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N - 1)));
@@ -10,6 +10,6 @@ http://www.boost.org/LICENSE_1_0.txt)
10
10
 
11
11
  #include <boost/predef/version_number.h>
12
12
 
13
- #define BOOST_PREDEF_VERSION BOOST_VERSION_NUMBER(1,15,0)
13
+ #define BOOST_PREDEF_VERSION BOOST_VERSION_NUMBER(1,15,1)
14
14
 
15
15
  #endif
@@ -16,7 +16,7 @@
16
16
  defined(BOOST_NO_CXX11_NULLPTR) || \
17
17
  defined(BOOST_NO_CXX11_SMART_PTR)
18
18
 
19
- BOOST_PRAGMA_MESSAGE("C++03 support was deprecated in Boost.SmartPtr 1.82 and will be removed in Boost.SmartPtr 1.86.")
19
+ BOOST_PRAGMA_MESSAGE("C++03 support was deprecated in Boost.SmartPtr 1.82 and will be removed in Boost.SmartPtr 1.87.")
20
20
 
21
21
  #endif
22
22
 
@@ -17,8 +17,11 @@
17
17
  // Defines the BOOST_SP_HAS_GCC_INTRINSICS macro if the __atomic_*
18
18
  // intrinsics are available.
19
19
 
20
+ // Libraries (e.g. Kokkos) sometimes define the __ATOMIC_RELAXED macros,
21
+ // leading to errors under MSVC (https://github.com/boostorg/smart_ptr/pull/112)
20
22
 
21
- #if defined( __ATOMIC_RELAXED ) && defined( __ATOMIC_ACQUIRE ) && defined( __ATOMIC_RELEASE ) && defined( __ATOMIC_ACQ_REL )
23
+ #if defined( __ATOMIC_RELAXED ) && defined( __ATOMIC_ACQUIRE ) && defined( __ATOMIC_RELEASE ) && defined( __ATOMIC_ACQ_REL ) \
24
+ && !( defined(_MSC_VER) && !defined(__clang__) )
22
25
 
23
26
  # define BOOST_SP_HAS_GCC_INTRINSICS
24
27
 
@@ -39,7 +39,19 @@ inline char const * strerror_r_helper( int r, char const * buffer ) noexcept
39
39
 
40
40
  inline char const * generic_error_category_message( int ev, char * buffer, std::size_t len ) noexcept
41
41
  {
42
- return strerror_r_helper( strerror_r( ev, buffer, len ), buffer );
42
+ if( buffer != nullptr )
43
+ {
44
+ return strerror_r_helper( strerror_r( ev, buffer, len ), buffer );
45
+ }
46
+ else
47
+ {
48
+ // strerror_r requires non-null buffer pointer
49
+
50
+ char tmp[ 1 ] = {};
51
+ char const* r = strerror_r_helper( strerror_r( ev, tmp, 0 ), buffer );
52
+
53
+ return r == tmp? nullptr: r;
54
+ }
43
55
  }
44
56
 
45
57
  inline std::string generic_error_category_message( int ev )
@@ -1,7 +1,7 @@
1
1
  /* Fast open-addressing concurrent hashmap.
2
2
  *
3
3
  * Copyright 2023 Christian Mazakas.
4
- * Copyright 2023 Joaquin M Lopez Munoz.
4
+ * Copyright 2023-2024 Joaquin M Lopez Munoz.
5
5
  * Distributed under the Boost Software License, Version 1.0.
6
6
  * (See accompanying file LICENSE_1_0.txt or copy at
7
7
  * http://www.boost.org/LICENSE_1_0.txt)
@@ -75,6 +75,10 @@ namespace boost {
75
75
  typename boost::allocator_const_pointer<allocator_type>::type;
76
76
  static constexpr size_type bulk_visit_size = table_type::bulk_visit_size;
77
77
 
78
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
79
+ using stats = typename table_type::stats;
80
+ #endif
81
+
78
82
  concurrent_flat_map()
79
83
  : concurrent_flat_map(detail::foa::default_bucket_count)
80
84
  {
@@ -714,6 +718,14 @@ namespace boost {
714
718
  void rehash(size_type n) { table_.rehash(n); }
715
719
  void reserve(size_type n) { table_.reserve(n); }
716
720
 
721
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
722
+ /// Stats
723
+ ///
724
+ stats get_stats() const { return table_.get_stats(); }
725
+
726
+ void reset_stats() noexcept { table_.reset_stats(); }
727
+ #endif
728
+
717
729
  /// Observers
718
730
  ///
719
731
  allocator_type get_allocator() const noexcept
@@ -1,6 +1,7 @@
1
1
  /* Fast open-addressing concurrent hashmap.
2
2
  *
3
3
  * Copyright 2023 Christian Mazakas.
4
+ * Copyright 2024 Braden Ganetsky.
4
5
  * Distributed under the Boost Software License, Version 1.0.
5
6
  * (See accompanying file LICENSE_1_0.txt or copy at
6
7
  * http://www.boost.org/LICENSE_1_0.txt)
@@ -11,11 +12,16 @@
11
12
  #ifndef BOOST_UNORDERED_CONCURRENT_FLAT_MAP_FWD_HPP
12
13
  #define BOOST_UNORDERED_CONCURRENT_FLAT_MAP_FWD_HPP
13
14
 
15
+ #include <boost/config.hpp>
14
16
  #include <boost/container_hash/hash_fwd.hpp>
15
17
 
16
18
  #include <functional>
17
19
  #include <memory>
18
20
 
21
+ #ifndef BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
22
+ #include <memory_resource>
23
+ #endif
24
+
19
25
  namespace boost {
20
26
  namespace unordered {
21
27
 
@@ -43,6 +49,15 @@ namespace boost {
43
49
  typename concurrent_flat_map<K, T, H, P, A>::size_type erase_if(
44
50
  concurrent_flat_map<K, T, H, P, A>& c, Predicate pred);
45
51
 
52
+ #ifndef BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
53
+ namespace pmr {
54
+ template <class Key, class T, class Hash = boost::hash<Key>,
55
+ class Pred = std::equal_to<Key> >
56
+ using concurrent_flat_map = boost::unordered::concurrent_flat_map<Key, T,
57
+ Hash, Pred, std::pmr::polymorphic_allocator<std::pair<Key const, T> > >;
58
+ } // namespace pmr
59
+ #endif
60
+
46
61
  } // namespace unordered
47
62
 
48
63
  using boost::unordered::concurrent_flat_map;
@@ -1,7 +1,7 @@
1
1
  /* Fast open-addressing concurrent hashset.
2
2
  *
3
3
  * Copyright 2023 Christian Mazakas.
4
- * Copyright 2023 Joaquin M Lopez Munoz.
4
+ * Copyright 2023-2024 Joaquin M Lopez Munoz.
5
5
  * Distributed under the Boost Software License, Version 1.0.
6
6
  * (See accompanying file LICENSE_1_0.txt or copy at
7
7
  * http://www.boost.org/LICENSE_1_0.txt)
@@ -72,6 +72,10 @@ namespace boost {
72
72
  typename boost::allocator_const_pointer<allocator_type>::type;
73
73
  static constexpr size_type bulk_visit_size = table_type::bulk_visit_size;
74
74
 
75
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
76
+ using stats = typename table_type::stats;
77
+ #endif
78
+
75
79
  concurrent_flat_set()
76
80
  : concurrent_flat_set(detail::foa::default_bucket_count)
77
81
  {
@@ -582,6 +586,14 @@ namespace boost {
582
586
  void rehash(size_type n) { table_.rehash(n); }
583
587
  void reserve(size_type n) { table_.reserve(n); }
584
588
 
589
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
590
+ /// Stats
591
+ ///
592
+ stats get_stats() const { return table_.get_stats(); }
593
+
594
+ void reset_stats() noexcept { table_.reset_stats(); }
595
+ #endif
596
+
585
597
  /// Observers
586
598
  ///
587
599
  allocator_type get_allocator() const noexcept
@@ -2,6 +2,7 @@
2
2
  *
3
3
  * Copyright 2023 Christian Mazakas.
4
4
  * Copyright 2023 Joaquin M Lopez Munoz.
5
+ * Copyright 2024 Braden Ganetsky.
5
6
  * Distributed under the Boost Software License, Version 1.0.
6
7
  * (See accompanying file LICENSE_1_0.txt or copy at
7
8
  * http://www.boost.org/LICENSE_1_0.txt)
@@ -12,11 +13,16 @@
12
13
  #ifndef BOOST_UNORDERED_CONCURRENT_FLAT_SET_FWD_HPP
13
14
  #define BOOST_UNORDERED_CONCURRENT_FLAT_SET_FWD_HPP
14
15
 
16
+ #include <boost/config.hpp>
15
17
  #include <boost/container_hash/hash_fwd.hpp>
16
18
 
17
19
  #include <functional>
18
20
  #include <memory>
19
21
 
22
+ #ifndef BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
23
+ #include <memory_resource>
24
+ #endif
25
+
20
26
  namespace boost {
21
27
  namespace unordered {
22
28
 
@@ -44,6 +50,15 @@ namespace boost {
44
50
  typename concurrent_flat_set<K, H, P, A>::size_type erase_if(
45
51
  concurrent_flat_set<K, H, P, A>& c, Predicate pred);
46
52
 
53
+ #ifndef BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
54
+ namespace pmr {
55
+ template <class Key, class Hash = boost::hash<Key>,
56
+ class Pred = std::equal_to<Key> >
57
+ using concurrent_flat_set = boost::unordered::concurrent_flat_set<Key,
58
+ Hash, Pred, std::pmr::polymorphic_allocator<Key> >;
59
+ } // namespace pmr
60
+ #endif
61
+
47
62
  } // namespace unordered
48
63
 
49
64
  using boost::unordered::concurrent_flat_set;
@@ -659,12 +659,7 @@ namespace boost {
659
659
  std::swap(buckets, other.buckets);
660
660
  std::swap(groups, other.groups);
661
661
 
662
- bool b = boost::allocator_propagate_on_container_swap<
663
- allocator_type>::type::value;
664
- if (b) {
665
- boost::core::invoke_swap(
666
- get_node_allocator(), other.get_node_allocator());
667
- }
662
+ swap_allocator_if_pocs(other);
668
663
  }
669
664
 
670
665
  node_allocator_type const& get_node_allocator() const
@@ -876,6 +871,27 @@ namespace boost {
876
871
  pbg->prev->next = pbg->next;
877
872
  pbg->prev = pbg->next = group_pointer();
878
873
  }
874
+
875
+ void swap_allocator_if_pocs(grouped_bucket_array& other)
876
+ {
877
+ using allocator_pocs =
878
+ typename boost::allocator_propagate_on_container_swap<
879
+ allocator_type>::type;
880
+ swap_allocator_if_pocs(
881
+ other, std::integral_constant<bool, allocator_pocs::value>());
882
+ }
883
+
884
+ void swap_allocator_if_pocs(
885
+ grouped_bucket_array& other, std::true_type /* propagate */)
886
+ {
887
+ boost::core::invoke_swap(
888
+ get_node_allocator(), other.get_node_allocator());
889
+ }
890
+
891
+ void swap_allocator_if_pocs(
892
+ grouped_bucket_array&, std::false_type /* don't propagate */)
893
+ {
894
+ }
879
895
  };
880
896
  } // namespace detail
881
897
  } // namespace unordered
@@ -469,6 +469,10 @@ public:
469
469
  using size_type=typename super::size_type;
470
470
  static constexpr std::size_t bulk_visit_size=16;
471
471
 
472
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
473
+ using stats=typename super::stats;
474
+ #endif
475
+
472
476
  private:
473
477
  template<typename Value,typename T>
474
478
  using enable_if_is_value_type=typename std::enable_if<
@@ -510,6 +514,7 @@ public:
510
514
  x.arrays=ah.release();
511
515
  x.size_ctrl.ml=x.initial_max_load();
512
516
  x.size_ctrl.size=0;
517
+ BOOST_UNORDERED_SWAP_STATS(this->cstats,x.cstats);
513
518
  }
514
519
 
515
520
  concurrent_table(compatible_nonconcurrent_table&& x):
@@ -965,6 +970,13 @@ public:
965
970
  super::reserve(n);
966
971
  }
967
972
 
973
+ #if defined(BOOST_UNORDERED_ENABLE_STATS)
974
+ /* already thread safe */
975
+
976
+ using super::get_stats;
977
+ using super::reset_stats;
978
+ #endif
979
+
968
980
  template<typename Predicate>
969
981
  friend std::size_t erase_if(concurrent_table& x,Predicate&& pr)
970
982
  {
@@ -1186,6 +1198,7 @@ private:
1186
1198
  GroupAccessMode access_mode,
1187
1199
  const Key& x,std::size_t pos0,std::size_t hash,F&& f)const
1188
1200
  {
1201
+ BOOST_UNORDERED_STATS_COUNTER(num_cmps);
1189
1202
  prober pb(pos0);
1190
1203
  do{
1191
1204
  auto pos=pb.get();
@@ -1197,19 +1210,27 @@ private:
1197
1210
  auto lck=access(access_mode,pos);
1198
1211
  do{
1199
1212
  auto n=unchecked_countr_zero(mask);
1200
- if(BOOST_LIKELY(
1201
- pg->is_occupied(n)&&bool(this->pred()(x,this->key_from(p[n]))))){
1202
- f(pg,n,p+n);
1203
- return 1;
1213
+ if(BOOST_LIKELY(pg->is_occupied(n))){
1214
+ BOOST_UNORDERED_INCREMENT_STATS_COUNTER(num_cmps);
1215
+ if(BOOST_LIKELY(bool(this->pred()(x,this->key_from(p[n]))))){
1216
+ f(pg,n,p+n);
1217
+ BOOST_UNORDERED_ADD_STATS(
1218
+ this->cstats.successful_lookup,(pb.length(),num_cmps));
1219
+ return 1;
1220
+ }
1204
1221
  }
1205
1222
  mask&=mask-1;
1206
1223
  }while(mask);
1207
1224
  }
1208
1225
  if(BOOST_LIKELY(pg->is_not_overflowed(hash))){
1226
+ BOOST_UNORDERED_ADD_STATS(
1227
+ this->cstats.unsuccessful_lookup,(pb.length(),num_cmps));
1209
1228
  return 0;
1210
1229
  }
1211
1230
  }
1212
1231
  while(BOOST_LIKELY(pb.next(this->arrays.groups_size_mask)));
1232
+ BOOST_UNORDERED_ADD_STATS(
1233
+ this->cstats.unsuccessful_lookup,(pb.length(),num_cmps));
1213
1234
  return 0;
1214
1235
  }
1215
1236
 
@@ -1244,6 +1265,7 @@ private:
1244
1265
 
1245
1266
  it=first;
1246
1267
  for(auto i=m;i--;++it){
1268
+ BOOST_UNORDERED_STATS_COUNTER(num_cmps);
1247
1269
  auto pos=positions[i];
1248
1270
  prober pb(pos);
1249
1271
  auto pg=this->arrays.groups()+pos;
@@ -1256,12 +1278,15 @@ private:
1256
1278
  auto lck=access(access_mode,pos);
1257
1279
  do{
1258
1280
  auto n=unchecked_countr_zero(mask);
1259
- if(BOOST_LIKELY(
1260
- pg->is_occupied(n)&&
1261
- bool(this->pred()(*it,this->key_from(p[n]))))){
1262
- f(cast_for(access_mode,type_policy::value_from(p[n])));
1263
- ++res;
1264
- goto next_key;
1281
+ if(BOOST_LIKELY(pg->is_occupied(n))){
1282
+ BOOST_UNORDERED_INCREMENT_STATS_COUNTER(num_cmps);
1283
+ if(bool(this->pred()(*it,this->key_from(p[n])))){
1284
+ f(cast_for(access_mode,type_policy::value_from(p[n])));
1285
+ ++res;
1286
+ BOOST_UNORDERED_ADD_STATS(
1287
+ this->cstats.successful_lookup,(pb.length(),num_cmps));
1288
+ goto next_key;
1289
+ }
1265
1290
  }
1266
1291
  mask&=mask-1;
1267
1292
  }while(mask);
@@ -1270,6 +1295,8 @@ private:
1270
1295
  do{
1271
1296
  if(BOOST_LIKELY(pg->is_not_overflowed(hashes[i]))||
1272
1297
  BOOST_UNLIKELY(!pb.next(this->arrays.groups_size_mask))){
1298
+ BOOST_UNORDERED_ADD_STATS(
1299
+ this->cstats.unsuccessful_lookup,(pb.length(),num_cmps));
1273
1300
  goto next_key;
1274
1301
  }
1275
1302
  pos=pb.get();
@@ -1490,6 +1517,7 @@ private:
1490
1517
  this->construct_element(p,std::forward<Args>(args)...);
1491
1518
  rslot.commit();
1492
1519
  rsize.commit();
1520
+ BOOST_UNORDERED_ADD_STATS(this->cstats.insertion,(pb.length()));
1493
1521
  return 1;
1494
1522
  }
1495
1523
  pg->mark_overflow(hash);