passenger 6.0.22 → 6.0.24
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +59 -1
- data/Rakefile +13 -2
- data/bin/passenger-install-apache2-module +5 -0
- data/bin/passenger-install-nginx-module +18 -2
- data/build/apache2.rb +1 -1
- data/build/basics.rb +10 -4
- data/build/cxx_tests.rb +18 -7
- data/build/support/cxx_dependency_map.rb +40 -6
- data/build/test_basics.rb +24 -13
- data/package.json +1 -1
- data/passenger.gemspec +4 -2
- data/resources/templates/standalone/server.erb +1 -0
- data/src/agent/Core/ApplicationPool/Group/InitializationAndShutdown.cpp +8 -0
- data/src/agent/Core/ApplicationPool/Group/InternalUtils.cpp +10 -2
- data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +8 -0
- data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +9 -0
- data/src/agent/Core/ApplicationPool/Group/OutOfBandWork.cpp +9 -0
- data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +63 -50
- data/src/agent/Core/ApplicationPool/Group/SessionManagement.cpp +19 -9
- data/src/agent/Core/ApplicationPool/Group/SpawningAndRestarting.cpp +8 -0
- data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +9 -1
- data/src/agent/Core/ApplicationPool/Group/Verification.cpp +8 -0
- data/src/agent/Core/ApplicationPool/Group.h +15 -5
- data/src/agent/Core/ApplicationPool/Pool/AnalyticsCollection.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/GeneralUtils.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/InitializationAndShutdown.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/Miscellaneous.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/ProcessUtils.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +11 -4
- data/src/agent/Core/ApplicationPool/Pool.h +0 -2
- data/src/agent/Core/ApplicationPool/Process.h +22 -6
- data/src/agent/Core/ApplicationPool/Session.h +6 -1
- data/src/agent/Core/Config.h +8 -3
- data/src/agent/Core/Controller/CheckoutSession.cpp +24 -1
- data/src/agent/Core/Controller/Config.h +5 -1
- data/src/agent/Core/Controller.h +1 -0
- data/src/agent/Core/CoreMain.cpp +10 -17
- data/src/agent/Core/OptionParser.h +3 -0
- data/src/agent/Core/SpawningKit/ErrorRenderer.h +5 -0
- data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -53
- data/src/agent/Core/SpawningKit/Handshake/Session.h +3 -0
- data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +5 -2
- data/src/agent/Core/SpawningKit/SmartSpawner.h +6 -2
- data/src/agent/Core/SpawningKit/Spawner.h +4 -0
- data/src/agent/Shared/Fundamentals/AbortHandler.cpp +88 -9
- data/src/agent/Shared/Fundamentals/AbortHandler.h +2 -0
- data/src/agent/Shared/Fundamentals/Initialization.cpp +9 -3
- data/src/agent/Shared/Fundamentals/Initialization.h +3 -3
- data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +6 -7
- data/src/agent/Watchdog/Config.h +2 -1
- data/src/agent/Watchdog/WatchdogMain.cpp +4 -7
- data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +5 -0
- data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +15 -0
- data/src/apache2_module/ConfigGeneral/ManifestGeneration.h +5 -3
- data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +5 -0
- data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +3 -0
- data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +13 -0
- data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +7 -0
- data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +16 -0
- data/src/apache2_module/DirConfig/AutoGeneratedStruct.h.cxxcodebuilder +3 -0
- data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +2 -1
- data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h.cxxcodebuilder +2 -1
- data/src/cxx_supportlib/Constants.h +1 -1
- data/src/cxx_supportlib/DataStructures/LString.h +4 -0
- data/src/cxx_supportlib/DataStructures/StringMap.h +0 -1
- data/src/cxx_supportlib/FileTools/PathManip.cpp +1 -1
- data/src/cxx_supportlib/SafeLibev.h +1 -3
- data/src/cxx_supportlib/ServerKit/Hooks.h +2 -2
- data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +0 -1
- data/src/cxx_supportlib/ServerKit/HttpServer.h +15 -10
- data/src/cxx_supportlib/ServerKit/Server.h +0 -6
- data/src/cxx_supportlib/Utils/AsyncSignalSafeUtils.h +2 -0
- data/src/cxx_supportlib/Utils/SpeedMeter.h +0 -3
- data/src/cxx_supportlib/oxt/implementation.cpp +11 -0
- data/src/cxx_supportlib/oxt/system_calls.cpp +10 -3
- data/src/cxx_supportlib/oxt/thread.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/as_tuple.hpp +35 -9
- data/src/cxx_supportlib/vendor-modified/boost/asio/associated_immediate_executor.hpp +3 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/associator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/async_result.hpp +74 -68
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_datagram_socket.hpp +11 -11
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_deadline_timer.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_random_access_file.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_raw_socket.hpp +10 -10
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_readable_pipe.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_seq_packet_socket.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_serial_port.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_signal_set.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_acceptor.hpp +9 -9
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_file.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_socket.hpp +6 -6
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_waitable_timer.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_writable_pipe.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/bind_allocator.hpp +88 -22
- data/src/cxx_supportlib/vendor-modified/boost/asio/bind_cancellation_slot.hpp +91 -22
- data/src/cxx_supportlib/vendor-modified/boost/asio/bind_executor.hpp +105 -23
- data/src/cxx_supportlib/vendor-modified/boost/asio/bind_immediate_executor.hpp +90 -23
- data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/buffer_registration.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_after.hpp +303 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_at.hpp +296 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/impl/co_composed.hpp → co_composed.hpp} +208 -61
- data/src/cxx_supportlib/vendor-modified/boost/asio/completion_condition.hpp +49 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/compose.hpp +10 -201
- data/src/cxx_supportlib/vendor-modified/boost/asio/composed.hpp +415 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +214 -48
- data/src/cxx_supportlib/vendor-modified/boost/asio/coroutine.hpp +3 -4
- data/src/cxx_supportlib/vendor-modified/boost/asio/default_completion_token.hpp +91 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/deferred.hpp +9 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/detached.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffered_stream_storage.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_message.hpp → detail/completion_message.hpp} +14 -16
- data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_payload.hpp → detail/completion_payload.hpp} +30 -32
- data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_handler.hpp → detail/completion_payload_handler.hpp} +15 -13
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +26 -32
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/deadline_timer_service.hpp +5 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_alloc_helpers.hpp +14 -118
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/descriptor_ops.ipp +36 -33
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.ipp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_descriptor_service.ipp +7 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_socket_service_base.ipp +6 -4
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +44 -35
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_select_interrupter.ipp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/initiation_base.hpp +64 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/memory.hpp +0 -11
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_descriptor_service.hpp +20 -16
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_send_op.hpp +0 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service_base.hpp +23 -18
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/recycling_allocator.hpp +9 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_endpoint_op.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_query_op.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_info_base.hpp +11 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timed_cancel_op.hpp +363 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wrapped_handler.hpp +29 -51
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/allocator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking_adaptation.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/mapping.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/occupancy.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/outstanding_work.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/relationship.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_channel.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_concurrent_channel.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_composed.hpp +2 -114
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_receive_op.hpp +2 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_functions.hpp +27 -19
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_op.hpp +0 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_service.hpp +17 -15
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_promise_allocator.hpp +2 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/impl/channel_service.hpp +4 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/partial_promise.hpp +3 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/as_single.hpp +12 -7
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/coro.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/parallel_group.hpp +38 -40
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/promise.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_coro.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_promise.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/immediate.hpp +144 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/append.hpp +14 -7
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/as_tuple.hpp +45 -14
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_after.hpp +270 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_at.hpp +270 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/co_spawn.hpp +8 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect.hpp +60 -166
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/consign.hpp +14 -7
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/detached.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/prepend.hpp +14 -7
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read.hpp +26 -177
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_at.hpp +16 -82
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +13 -286
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/redirect_error.hpp +55 -18
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/spawn.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write.hpp +26 -185
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write_at.hpp +16 -87
- data/src/cxx_supportlib/vendor-modified/boost/asio/io_context_strand.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +6 -6
- data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/socket_option.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.ipp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/placeholders.hpp +12 -6
- data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_descriptor.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_stream_descriptor.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +127 -28
- data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +70 -20
- data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +114 -36
- data/src/cxx_supportlib/vendor-modified/boost/asio/redirect_error.hpp +43 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/registered_buffer.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/spawn.hpp +0 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/openssl_init.ipp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +10 -7
- data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/this_coro.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/use_awaitable.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/uses_executor.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +147 -35
- data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +74 -22
- data/src/cxx_supportlib/vendor-modified/boost/asio.hpp +6 -0
- data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +4 -1
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/futex.hpp +42 -11
- data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +15 -37
- data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +8 -8
- data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +151 -10
- data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +11 -9
- data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +611 -102
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +47 -47
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +25 -24
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocation_type.hpp +7 -7
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_list.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_slist.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/construct_in_place.hpp +35 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +14 -14
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +55 -23
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/function_detector.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_container.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_contiguous_container.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_pair.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +8 -8
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +9 -9
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +96 -10
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +19 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +17 -17
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_resource.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +86 -52
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/version_type.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +12 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +145 -65
- data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +105 -22
- data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +30 -22
- data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +19 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +15 -8
- data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +6 -5
- data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +15 -15
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +31 -24
- data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +45 -43
- data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +45 -33
- data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +5 -7
- data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +55 -47
- data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +222 -73
- data/src/cxx_supportlib/vendor-modified/boost/core/detail/minstd_rand.hpp +58 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +13 -13
- data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +53 -5
- data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/pointer_in_range.hpp +49 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/type_name.hpp +7 -2
- data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +22 -34
- data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +141 -38
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/algorithm.hpp +8 -8
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +8 -6
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_traits.hpp +18 -18
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +22 -17
- data/src/cxx_supportlib/vendor-modified/boost/libs/random/src/random_device.cpp +3 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/config_begin.hpp +0 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/launder.hpp +53 -0
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +9 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +6 -1
- data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/integral_wrapper.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/requires_cxx11.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp +4 -1
- data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category_message.hpp +13 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +13 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map_fwd.hpp +15 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +13 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set_fwd.hpp +15 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +22 -6
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +38 -10
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +111 -2
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/cumulative_stats.hpp +177 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +11 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +33 -7
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +12 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map_fwd.hpp +15 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +12 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set_fwd.hpp +14 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +19 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +12 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map_fwd.hpp +15 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +12 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set_fwd.hpp +14 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +17 -0
- data/src/cxx_supportlib/vendor-modified/boost/utility/detail/minstd_rand.hpp +1 -43
- data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
- data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +8 -0
- data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +12 -0
- data/src/nginx_module/Configuration.c +7 -2
- data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +6 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +15 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +14 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +3 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +4 -0
- data/src/ruby_native_extension/passenger_native_support.c +1 -0
- data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +5 -0
- data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +6 -2
- data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +10 -0
- data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +12 -4
- data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +5 -0
- data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +32 -5
- data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -0
- data/src/ruby_supportlib/phusion_passenger/rack/handler.rb +73 -0
- data/src/ruby_supportlib/phusion_passenger/rack_handler.rb +30 -56
- data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +5 -0
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +1 -0
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +0 -4
- data/src/ruby_supportlib/phusion_passenger/utils/json.rb +7 -198
- data/src/ruby_supportlib/phusion_passenger/utils/strscan.rb +67 -0
- data/src/ruby_supportlib/phusion_passenger/utils.rb +5 -15
- data/src/ruby_supportlib/phusion_passenger.rb +5 -5
- 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
|
1957
|
-
size_ctrl_type
|
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-
|
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:
|
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<
|
26
|
-
|
27
|
-
|
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
|
36
|
-
* is present
|
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
|
|