passenger 6.0.23 → 6.0.24

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

Potentially problematic release.


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

Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +26 -1
  3. data/Rakefile +7 -3
  4. data/bin/passenger-install-apache2-module +5 -0
  5. data/bin/passenger-install-nginx-module +17 -2
  6. data/build/apache2.rb +1 -1
  7. data/build/basics.rb +10 -4
  8. data/build/cxx_tests.rb +18 -7
  9. data/build/support/cxx_dependency_map.rb +40 -6
  10. data/build/test_basics.rb +4 -12
  11. data/package.json +1 -1
  12. data/passenger.gemspec +1 -1
  13. data/src/agent/Core/ApplicationPool/Group/InitializationAndShutdown.cpp +8 -0
  14. data/src/agent/Core/ApplicationPool/Group/InternalUtils.cpp +10 -2
  15. data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +8 -0
  16. data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +9 -0
  17. data/src/agent/Core/ApplicationPool/Group/OutOfBandWork.cpp +9 -0
  18. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +63 -50
  19. data/src/agent/Core/ApplicationPool/Group/SessionManagement.cpp +19 -9
  20. data/src/agent/Core/ApplicationPool/Group/SpawningAndRestarting.cpp +8 -0
  21. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +8 -0
  22. data/src/agent/Core/ApplicationPool/Group/Verification.cpp +8 -0
  23. data/src/agent/Core/ApplicationPool/Group.h +15 -5
  24. data/src/agent/Core/ApplicationPool/Pool/AnalyticsCollection.cpp +5 -0
  25. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +5 -0
  26. data/src/agent/Core/ApplicationPool/Pool/GeneralUtils.cpp +5 -0
  27. data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +5 -0
  28. data/src/agent/Core/ApplicationPool/Pool/InitializationAndShutdown.cpp +5 -0
  29. data/src/agent/Core/ApplicationPool/Pool/Miscellaneous.cpp +5 -0
  30. data/src/agent/Core/ApplicationPool/Pool/ProcessUtils.cpp +5 -0
  31. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +11 -1
  32. data/src/agent/Core/ApplicationPool/Pool.h +0 -2
  33. data/src/agent/Core/ApplicationPool/Process.h +22 -6
  34. data/src/agent/Core/ApplicationPool/Session.h +6 -1
  35. data/src/agent/Core/Config.h +7 -3
  36. data/src/agent/Core/Controller/Config.h +1 -1
  37. data/src/agent/Core/CoreMain.cpp +10 -17
  38. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -53
  39. data/src/agent/Core/SpawningKit/Handshake/Session.h +3 -0
  40. data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +5 -2
  41. data/src/agent/Core/SpawningKit/SmartSpawner.h +6 -2
  42. data/src/agent/Core/SpawningKit/Spawner.h +4 -0
  43. data/src/agent/Shared/Fundamentals/AbortHandler.cpp +88 -9
  44. data/src/agent/Shared/Fundamentals/AbortHandler.h +2 -0
  45. data/src/agent/Shared/Fundamentals/Initialization.cpp +9 -3
  46. data/src/agent/Shared/Fundamentals/Initialization.h +3 -3
  47. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +6 -7
  48. data/src/agent/Watchdog/Config.h +1 -1
  49. data/src/agent/Watchdog/WatchdogMain.cpp +4 -7
  50. data/src/apache2_module/ConfigGeneral/ManifestGeneration.h +5 -3
  51. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +3 -0
  52. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h.cxxcodebuilder +3 -0
  53. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +2 -1
  54. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h.cxxcodebuilder +2 -1
  55. data/src/cxx_supportlib/Constants.h +1 -1
  56. data/src/cxx_supportlib/DataStructures/StringMap.h +0 -1
  57. data/src/cxx_supportlib/FileTools/PathManip.cpp +1 -1
  58. data/src/cxx_supportlib/SafeLibev.h +1 -3
  59. data/src/cxx_supportlib/ServerKit/Hooks.h +2 -2
  60. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +0 -1
  61. data/src/cxx_supportlib/ServerKit/HttpServer.h +15 -10
  62. data/src/cxx_supportlib/ServerKit/Server.h +0 -6
  63. data/src/cxx_supportlib/Utils/AsyncSignalSafeUtils.h +2 -0
  64. data/src/cxx_supportlib/Utils/SpeedMeter.h +0 -3
  65. data/src/cxx_supportlib/oxt/implementation.cpp +11 -0
  66. data/src/cxx_supportlib/oxt/system_calls.cpp +10 -3
  67. data/src/cxx_supportlib/oxt/thread.hpp +1 -1
  68. data/src/cxx_supportlib/vendor-modified/boost/asio/as_tuple.hpp +35 -9
  69. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_immediate_executor.hpp +3 -2
  70. data/src/cxx_supportlib/vendor-modified/boost/asio/associator.hpp +1 -1
  71. data/src/cxx_supportlib/vendor-modified/boost/asio/async_result.hpp +74 -68
  72. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_datagram_socket.hpp +11 -11
  73. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_deadline_timer.hpp +2 -2
  74. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_random_access_file.hpp +2 -2
  75. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_raw_socket.hpp +10 -10
  76. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_readable_pipe.hpp +1 -1
  77. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_seq_packet_socket.hpp +3 -3
  78. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_serial_port.hpp +2 -2
  79. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_signal_set.hpp +1 -1
  80. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket.hpp +2 -2
  81. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_acceptor.hpp +9 -9
  82. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_file.hpp +2 -2
  83. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_socket.hpp +6 -6
  84. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_waitable_timer.hpp +2 -2
  85. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_writable_pipe.hpp +1 -1
  86. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_allocator.hpp +88 -22
  87. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_cancellation_slot.hpp +91 -22
  88. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_executor.hpp +105 -23
  89. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_immediate_executor.hpp +90 -23
  90. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +2 -2
  91. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer_registration.hpp +1 -1
  92. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_after.hpp +303 -0
  93. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_at.hpp +296 -0
  94. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/impl/co_composed.hpp → co_composed.hpp} +208 -61
  95. data/src/cxx_supportlib/vendor-modified/boost/asio/completion_condition.hpp +49 -0
  96. data/src/cxx_supportlib/vendor-modified/boost/asio/compose.hpp +10 -201
  97. data/src/cxx_supportlib/vendor-modified/boost/asio/composed.hpp +415 -0
  98. data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +214 -48
  99. data/src/cxx_supportlib/vendor-modified/boost/asio/coroutine.hpp +3 -4
  100. data/src/cxx_supportlib/vendor-modified/boost/asio/default_completion_token.hpp +91 -0
  101. data/src/cxx_supportlib/vendor-modified/boost/asio/deferred.hpp +9 -5
  102. data/src/cxx_supportlib/vendor-modified/boost/asio/detached.hpp +2 -2
  103. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffered_stream_storage.hpp +1 -1
  104. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_message.hpp → detail/completion_message.hpp} +14 -16
  105. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_payload.hpp → detail/completion_payload.hpp} +30 -32
  106. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_handler.hpp → detail/completion_payload_handler.hpp} +15 -13
  107. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +26 -32
  108. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/deadline_timer_service.hpp +5 -1
  109. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_alloc_helpers.hpp +14 -118
  110. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/descriptor_ops.ipp +36 -33
  111. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.ipp +1 -1
  112. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_descriptor_service.ipp +7 -5
  113. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_socket_service_base.ipp +6 -4
  114. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +44 -35
  115. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_select_interrupter.ipp +1 -1
  116. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/initiation_base.hpp +64 -0
  117. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/memory.hpp +0 -11
  118. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_descriptor_service.hpp +20 -16
  119. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_send_op.hpp +0 -1
  120. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service.hpp +4 -4
  121. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service_base.hpp +23 -18
  122. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/recycling_allocator.hpp +9 -0
  123. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_endpoint_op.hpp +1 -1
  124. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_query_op.hpp +1 -1
  125. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_info_base.hpp +11 -1
  126. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timed_cancel_op.hpp +363 -0
  127. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wrapped_handler.hpp +29 -51
  128. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/allocator.hpp +1 -1
  129. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking.hpp +1 -1
  130. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking_adaptation.hpp +1 -1
  131. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context.hpp +1 -1
  132. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/mapping.hpp +1 -1
  133. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/occupancy.hpp +1 -1
  134. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/outstanding_work.hpp +1 -1
  135. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/relationship.hpp +1 -1
  136. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_channel.hpp +2 -1
  137. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_concurrent_channel.hpp +2 -1
  138. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_composed.hpp +2 -114
  139. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_receive_op.hpp +2 -3
  140. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_functions.hpp +27 -19
  141. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_op.hpp +0 -1
  142. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_service.hpp +17 -15
  143. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_promise_allocator.hpp +2 -3
  144. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/impl/channel_service.hpp +4 -2
  145. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/partial_promise.hpp +3 -5
  146. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/as_single.hpp +12 -7
  147. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/coro.hpp +1 -1
  148. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/parallel_group.hpp +38 -40
  149. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/promise.hpp +3 -3
  150. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_coro.hpp +5 -5
  151. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_promise.hpp +1 -1
  152. data/src/cxx_supportlib/vendor-modified/boost/asio/immediate.hpp +144 -0
  153. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/append.hpp +14 -7
  154. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/as_tuple.hpp +45 -14
  155. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp +3 -3
  156. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_after.hpp +270 -0
  157. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_at.hpp +270 -0
  158. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/co_spawn.hpp +8 -0
  159. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect.hpp +60 -166
  160. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/consign.hpp +14 -7
  161. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/detached.hpp +2 -2
  162. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/prepend.hpp +14 -7
  163. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read.hpp +26 -177
  164. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_at.hpp +16 -82
  165. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +13 -286
  166. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/redirect_error.hpp +55 -18
  167. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/spawn.hpp +1 -1
  168. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write.hpp +26 -185
  169. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write_at.hpp +16 -87
  170. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context_strand.hpp +5 -5
  171. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +6 -6
  172. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/socket_option.hpp +1 -1
  173. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.ipp +1 -1
  174. data/src/cxx_supportlib/vendor-modified/boost/asio/placeholders.hpp +12 -6
  175. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_descriptor.hpp +1 -1
  176. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_stream_descriptor.hpp +2 -2
  177. data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +127 -28
  178. data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +70 -20
  179. data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +114 -36
  180. data/src/cxx_supportlib/vendor-modified/boost/asio/redirect_error.hpp +43 -3
  181. data/src/cxx_supportlib/vendor-modified/boost/asio/registered_buffer.hpp +2 -2
  182. data/src/cxx_supportlib/vendor-modified/boost/asio/spawn.hpp +0 -1
  183. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/openssl_init.ipp +2 -2
  184. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +10 -7
  185. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +5 -5
  186. data/src/cxx_supportlib/vendor-modified/boost/asio/this_coro.hpp +2 -2
  187. data/src/cxx_supportlib/vendor-modified/boost/asio/use_awaitable.hpp +2 -2
  188. data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +1 -1
  189. data/src/cxx_supportlib/vendor-modified/boost/asio/uses_executor.hpp +1 -1
  190. data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +1 -1
  191. data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +147 -35
  192. data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +74 -22
  193. data/src/cxx_supportlib/vendor-modified/boost/asio.hpp +6 -0
  194. data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +4 -1
  195. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/futex.hpp +42 -11
  196. data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +15 -37
  197. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +8 -8
  198. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +1 -1
  199. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +151 -10
  200. data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +11 -9
  201. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +611 -102
  202. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +1 -1
  203. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +47 -47
  204. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +25 -24
  205. data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocation_type.hpp +7 -7
  206. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_list.hpp +2 -2
  207. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_slist.hpp +2 -2
  208. data/src/cxx_supportlib/vendor-modified/boost/container/detail/construct_in_place.hpp +35 -1
  209. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +14 -14
  210. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +1 -1
  211. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +55 -23
  212. data/src/cxx_supportlib/vendor-modified/boost/container/detail/function_detector.hpp +1 -1
  213. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_container.hpp +2 -2
  214. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_contiguous_container.hpp +1 -1
  215. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_pair.hpp +4 -4
  216. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +8 -8
  217. data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +9 -9
  218. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +4 -4
  219. data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +96 -10
  220. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +19 -4
  221. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +1 -1
  222. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +17 -17
  223. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common.hpp +1 -1
  224. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +2 -2
  225. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_resource.hpp +4 -4
  226. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +86 -52
  227. data/src/cxx_supportlib/vendor-modified/boost/container/detail/version_type.hpp +4 -4
  228. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +12 -0
  229. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +145 -65
  230. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +105 -22
  231. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +2 -2
  232. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +30 -22
  233. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +19 -2
  234. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +1 -1
  235. data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +15 -8
  236. data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +6 -5
  237. data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +15 -15
  238. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +1 -1
  239. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +1 -1
  240. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +3 -3
  241. data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +1 -1
  242. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +2 -2
  243. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +31 -24
  244. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +45 -43
  245. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +45 -33
  246. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +5 -7
  247. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +55 -47
  248. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator.hpp +3 -3
  249. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +222 -73
  250. data/src/cxx_supportlib/vendor-modified/boost/core/detail/minstd_rand.hpp +58 -0
  251. data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +13 -13
  252. data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +53 -5
  253. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +1 -0
  254. data/src/cxx_supportlib/vendor-modified/boost/core/pointer_in_range.hpp +49 -0
  255. data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +2 -0
  256. data/src/cxx_supportlib/vendor-modified/boost/core/type_name.hpp +7 -2
  257. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +22 -34
  258. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +141 -38
  259. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/algorithm.hpp +8 -8
  260. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash.hpp +1 -1
  261. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +8 -6
  262. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_traits.hpp +18 -18
  263. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +22 -17
  264. data/src/cxx_supportlib/vendor-modified/boost/libs/random/src/random_device.cpp +3 -1
  265. data/src/cxx_supportlib/vendor-modified/boost/move/detail/config_begin.hpp +0 -1
  266. data/src/cxx_supportlib/vendor-modified/boost/move/detail/launder.hpp +53 -0
  267. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +9 -1
  268. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +6 -1
  269. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
  270. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/integral_wrapper.hpp +2 -1
  271. data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
  272. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/requires_cxx11.hpp +1 -1
  273. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp +4 -1
  274. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category_message.hpp +13 -1
  275. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +13 -1
  276. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map_fwd.hpp +15 -0
  277. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +13 -1
  278. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set_fwd.hpp +15 -0
  279. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +22 -6
  280. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +38 -10
  281. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +111 -2
  282. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/cumulative_stats.hpp +177 -0
  283. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +11 -1
  284. data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +33 -7
  285. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +12 -0
  286. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map_fwd.hpp +15 -0
  287. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +12 -0
  288. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set_fwd.hpp +14 -0
  289. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +19 -0
  290. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +12 -0
  291. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map_fwd.hpp +15 -0
  292. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +12 -0
  293. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set_fwd.hpp +14 -0
  294. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +17 -0
  295. data/src/cxx_supportlib/vendor-modified/boost/utility/detail/minstd_rand.hpp +1 -43
  296. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  297. data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +6 -2
  298. data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +10 -0
  299. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +12 -4
  300. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +32 -5
  301. data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +0 -4
  302. data/src/ruby_supportlib/phusion_passenger/utils/json.rb +5 -1
  303. data/src/ruby_supportlib/phusion_passenger/utils.rb +5 -15
  304. data/src/ruby_supportlib/phusion_passenger.rb +5 -5
  305. metadata +21 -8
@@ -46,7 +46,6 @@
46
46
  #include <boost/move/utility_core.hpp>
47
47
  #include <boost/move/detail/to_raw_pointer.hpp>
48
48
  #include <boost/move/algo/detail/merge.hpp>
49
- #include <boost/move/detail/force_ptr.hpp>
50
49
 
51
50
  //std
52
51
  #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
@@ -148,7 +147,7 @@ class devector
148
147
  typedef typename get_devector_opt<Options, alloc_size_type>::type options_type;
149
148
  typedef typename options_type::growth_factor_type growth_factor_type;
150
149
  typedef typename options_type::stored_size_type stored_size_type;
151
- static const std::size_t devector_min_free_fraction =
150
+ BOOST_STATIC_CONSTEXPR std::size_t devector_min_free_fraction =
152
151
  options_type::free_fraction;
153
152
 
154
153
  #endif // ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
@@ -513,20 +512,21 @@ class devector
513
512
  const devector &x = rhs;
514
513
  if (this == &x) { return *this; } // skip self
515
514
 
516
- BOOST_IF_CONSTEXPR(allocator_traits_type::propagate_on_container_copy_assignment::value)
515
+ const bool do_propagate = allocator_traits_type::propagate_on_container_copy_assignment::value;
516
+ BOOST_IF_CONSTEXPR(do_propagate)
517
517
  {
518
- allocator_type &this_alloc = this->get_allocator_ref();
519
- const allocator_type &other_alloc = x.get_allocator_ref();
520
- if (this_alloc != other_alloc)
521
- {
522
- // new allocator cannot free existing storage
523
- this->clear();
524
- this->deallocate_buffer();
525
- m_.capacity = 0u;
526
- m_.buffer = pointer();
527
- }
528
-
529
- this_alloc = other_alloc;
518
+ allocator_type &this_alloc = this->get_allocator_ref();
519
+ const allocator_type &other_alloc = x.get_allocator_ref();
520
+ if (this_alloc != other_alloc)
521
+ {
522
+ // new allocator cannot free existing storage
523
+ this->clear();
524
+ this->deallocate_buffer();
525
+ m_.capacity = 0u;
526
+ m_.buffer = pointer();
527
+ }
528
+ dtl::bool_<do_propagate> flag;
529
+ dtl::assign_alloc(this_alloc, other_alloc, flag);
530
530
  }
531
531
 
532
532
  size_type n = x.size();
@@ -566,53 +566,16 @@ class devector
566
566
  BOOST_NOEXCEPT_IF(allocator_traits_type::propagate_on_container_move_assignment::value
567
567
  || allocator_traits_type::is_always_equal::value)
568
568
  {
569
- BOOST_CONSTEXPR_OR_CONST bool copy_alloc = allocator_traits_type::propagate_on_container_move_assignment::value;
570
-
571
- BOOST_IF_CONSTEXPR (copy_alloc || get_allocator_ref() == x.get_allocator_ref())
572
- {
573
- this->clear();
574
- this->deallocate_buffer();
575
-
576
- if (copy_alloc)
577
- {
578
- this->get_allocator_ref() = boost::move(x.get_allocator_ref());
579
- }
580
-
581
- m_.capacity = x.m_.capacity;
582
- m_.buffer = x.m_.buffer;
583
- m_.front_idx = x.m_.front_idx;
584
- m_.back_idx = x.m_.back_idx;
585
-
586
- // leave x in valid state
587
- x.m_.capacity = 0u;
588
- x.m_.buffer = pointer();
589
- x.m_.back_idx = x.m_.front_idx = 0;
569
+ if (BOOST_LIKELY(this != &x)) {
570
+ //We know resources can be transferred at comiple time if both allocators are
571
+ //always equal or the allocator is going to be propagated
572
+ const bool can_steal_resources_alloc
573
+ = allocator_traits_type::propagate_on_container_move_assignment::value
574
+ || allocator_traits_type::is_always_equal::value;
575
+ dtl::bool_<can_steal_resources_alloc> flag;
576
+ this->priv_move_assign(boost::move(x), flag);
590
577
  }
591
- else
592
- {
593
- // if the allocator shouldn't be copied and they do not compare equal
594
- // we can't steal memory.
595
-
596
- move_iterator<iterator> xbegin = boost::make_move_iterator(x.begin());
597
- move_iterator<iterator> xend = boost::make_move_iterator(x.end());
598
-
599
- if (copy_alloc)
600
- {
601
- get_allocator_ref() = boost::move(x.get_allocator_ref());
602
- }
603
-
604
- if (m_.capacity >= x.size())
605
- {
606
- overwrite_buffer(xbegin, xend);
607
- }
608
- else
609
- {
610
- allocate_and_copy_range(xbegin, xend);
611
- }
612
- }
613
-
614
578
  BOOST_ASSERT(invariants_ok());
615
-
616
579
  return *this;
617
580
  }
618
581
 
@@ -1310,6 +1273,78 @@ class devector
1310
1273
  return m_.buffer[m_.front_idx + n];
1311
1274
  }
1312
1275
 
1276
+ //! <b>Requires</b>: size() >= n.
1277
+ //!
1278
+ //! <b>Effects</b>: Returns an iterator to the nth element
1279
+ //! from the beginning of the container. Returns end()
1280
+ //! if n == size().
1281
+ //!
1282
+ //! <b>Throws</b>: Nothing.
1283
+ //!
1284
+ //! <b>Complexity</b>: Constant.
1285
+ //!
1286
+ //! <b>Note</b>: Non-standard extension
1287
+ BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1288
+ iterator nth(size_type n) BOOST_NOEXCEPT_OR_NOTHROW
1289
+ {
1290
+ BOOST_ASSERT(n <= size());
1291
+ return iterator(m_.buffer + (m_.front_idx + n));
1292
+ }
1293
+
1294
+ //! <b>Requires</b>: size() >= n.
1295
+ //!
1296
+ //! <b>Effects</b>: Returns a const_iterator to the nth element
1297
+ //! from the beginning of the container. Returns end()
1298
+ //! if n == size().
1299
+ //!
1300
+ //! <b>Throws</b>: Nothing.
1301
+ //!
1302
+ //! <b>Complexity</b>: Constant.
1303
+ //!
1304
+ //! <b>Note</b>: Non-standard extension
1305
+ BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1306
+ const_iterator nth(size_type n) const BOOST_NOEXCEPT_OR_NOTHROW
1307
+ {
1308
+ BOOST_ASSERT(n <= size());
1309
+ return const_iterator(m_.buffer + (m_.front_idx + n));
1310
+ }
1311
+
1312
+ //! <b>Requires</b>: begin() <= p <= end().
1313
+ //!
1314
+ //! <b>Effects</b>: Returns the index of the element pointed by p
1315
+ //! and size() if p == end().
1316
+ //!
1317
+ //! <b>Throws</b>: Nothing.
1318
+ //!
1319
+ //! <b>Complexity</b>: Constant.
1320
+ //!
1321
+ //! <b>Note</b>: Non-standard extension
1322
+ BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1323
+ size_type index_of(iterator p) BOOST_NOEXCEPT_OR_NOTHROW
1324
+ {
1325
+ BOOST_ASSERT(p >= begin());
1326
+ BOOST_ASSERT(p <= end());
1327
+ return static_cast<size_type>(p - this->begin());
1328
+ }
1329
+
1330
+ //! <b>Requires</b>: begin() <= p <= end().
1331
+ //!
1332
+ //! <b>Effects</b>: Returns the index of the element pointed by p
1333
+ //! and size() if p == end().
1334
+ //!
1335
+ //! <b>Throws</b>: Nothing.
1336
+ //!
1337
+ //! <b>Complexity</b>: Constant.
1338
+ //!
1339
+ //! <b>Note</b>: Non-standard extension
1340
+ BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1341
+ size_type index_of(const_iterator p) const BOOST_NOEXCEPT_OR_NOTHROW
1342
+ {
1343
+ BOOST_ASSERT(p >= cbegin());
1344
+ BOOST_ASSERT(p <= cend());
1345
+ return static_cast<size_type>(p - this->cbegin());
1346
+ }
1347
+
1313
1348
  /**
1314
1349
  * **Returns**: A reference to the `n`th element in the devector.
1315
1350
  *
@@ -2137,6 +2172,53 @@ class devector
2137
2172
 
2138
2173
  private:
2139
2174
 
2175
+ void priv_move_assign(BOOST_RV_REF(devector) x, dtl::bool_<true> /*steal_resources*/)
2176
+ {
2177
+ this->clear();
2178
+ this->deallocate_buffer();
2179
+
2180
+ //Move allocator if needed
2181
+ dtl::bool_<allocator_traits_type::
2182
+ propagate_on_container_move_assignment::value> flag;
2183
+ dtl::move_alloc(this->get_allocator_ref(), x.get_allocator_ref(), flag);
2184
+
2185
+ m_.capacity = x.m_.capacity;
2186
+ m_.buffer = x.m_.buffer;
2187
+ m_.front_idx = x.m_.front_idx;
2188
+ m_.back_idx = x.m_.back_idx;
2189
+
2190
+ // leave x in valid state
2191
+ x.m_.capacity = 0u;
2192
+ x.m_.buffer = pointer();
2193
+ x.m_.back_idx = x.m_.front_idx = 0;
2194
+ }
2195
+
2196
+ void priv_move_assign(BOOST_RV_REF(devector) x, dtl::bool_<false> /*steal_resources*/)
2197
+ {
2198
+ //We can't guarantee a compile-time equal allocator or propagation so fallback to runtime
2199
+ //Resources can be transferred if both allocators are equal
2200
+ if (get_allocator_ref() == x.get_allocator_ref()) {
2201
+ this->priv_move_assign(boost::move(x), dtl::true_());
2202
+ }
2203
+ else {
2204
+ // We can't steal memory.
2205
+ move_iterator<iterator> xbegin = boost::make_move_iterator(x.begin());
2206
+ move_iterator<iterator> xend = boost::make_move_iterator(x.end());
2207
+
2208
+ //Move allocator if needed
2209
+ dtl::bool_<allocator_traits_type::
2210
+ propagate_on_container_move_assignment::value> flag;
2211
+ dtl::move_alloc(this->get_allocator_ref(), x.get_allocator_ref(), flag);
2212
+
2213
+ if (m_.capacity >= x.size()) {
2214
+ overwrite_buffer(xbegin, xend);
2215
+ }
2216
+ else {
2217
+ allocate_and_copy_range(xbegin, xend);
2218
+ }
2219
+ }
2220
+ }
2221
+
2140
2222
  BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2141
2223
  size_type pos_to_index(const_iterator i) const
2142
2224
  {
@@ -2653,10 +2735,7 @@ class devector
2653
2735
  size_type const cap = m_.capacity;
2654
2736
  //Test if enough free memory would be left
2655
2737
  if (free_cap >= n && (free_cap - n) >= cap/devector_min_free_fraction) {
2656
- //Make sure relocation is happening because there was no enough space
2657
2738
  size_type const old_size = this->size();
2658
- BOOST_ASSERT(should_move_back(p) ? (back_free_cap < n) : (front_free_cap < n));
2659
-
2660
2739
  T* const raw_pos = const_cast<T*>(boost::movelib::to_raw_pointer(p));
2661
2740
  size_type const new_size = old_size + n;
2662
2741
  size_type const new_front_idx = (cap - new_size) / 2u;
@@ -2948,8 +3027,9 @@ struct has_trivial_destructor_after_move<boost::container::devector<T, Allocator
2948
3027
  {
2949
3028
  typedef typename boost::container::devector<T, Allocator, Options>::allocator_type allocator_type;
2950
3029
  typedef typename ::boost::container::allocator_traits<allocator_type>::pointer pointer;
2951
- static const bool value = ::boost::has_trivial_destructor_after_move<allocator_type>::value &&
2952
- ::boost::has_trivial_destructor_after_move<pointer>::value;
3030
+ BOOST_STATIC_CONSTEXPR bool value =
3031
+ ::boost::has_trivial_destructor_after_move<allocator_type>::value &&
3032
+ ::boost::has_trivial_destructor_after_move<pointer>::value;
2953
3033
  };
2954
3034
 
2955
3035
  }
@@ -31,6 +31,7 @@
31
31
  #include <boost/container/detail/mpl.hpp>
32
32
  #include <boost/container/detail/algorithm.hpp> //equal()
33
33
  #include <boost/container/detail/container_or_allocator_rebind.hpp>
34
+ #include <boost/container/detail/pair.hpp>
34
35
  // move
35
36
  #include <boost/move/utility_core.hpp>
36
37
  #include <boost/move/traits.hpp>
@@ -44,10 +45,22 @@
44
45
  #include <boost/intrusive/detail/minimal_pair_header.hpp> //pair
45
46
  #include <boost/intrusive/detail/minimal_less_equal_header.hpp>//less, equal
46
47
 
48
+
47
49
  #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
48
50
  #include <initializer_list>
49
51
  #endif
50
52
 
53
+ #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
54
+ #define BOOST_CONTAINER_STD_PAIR_IS_MOVABLE
55
+ #endif
56
+
57
+ //for C++03 compilers, were type-puning is the only option for std::pair
58
+ //disable strict aliasing to reduce problems.
59
+ #if defined(BOOST_GCC) && (BOOST_GCC >= 100000) && !defined(BOOST_CONTAINER_STD_PAIR_IS_MOVABLE)
60
+ #pragma GCC push_options
61
+ #pragma GCC optimize("no-strict-aliasing")
62
+ #endif
63
+
51
64
  namespace boost {
52
65
  namespace container {
53
66
 
@@ -58,21 +71,37 @@ class flat_multimap;
58
71
 
59
72
  namespace dtl{
60
73
 
74
+ #if defined(BOOST_CONTAINER_STD_PAIR_IS_MOVABLE)
61
75
  template<class D, class S>
62
76
  BOOST_CONTAINER_FORCEINLINE static D &force(S &s)
63
- { return *move_detail::force_ptr<D*>(&s); }
77
+ { return s; }
64
78
 
65
79
  template<class D, class S>
66
80
  BOOST_CONTAINER_FORCEINLINE static const D &force(const S &s)
67
- { return *move_detail::force_ptr<const D*>(&s); }
81
+ { return s; }
82
+
83
+ template<class D>
84
+ BOOST_CONTAINER_FORCEINLINE static D force_copy(D s)
85
+ { return s; }
86
+
87
+ #else //!BOOST_CONTAINER_DOXYGEN_INVOKED
88
+
89
+ template<class D, class S>
90
+ BOOST_CONTAINER_FORCEINLINE static D &force(S &s)
91
+ { return *move_detail::launder_cast<D*>(&s); }
92
+
93
+ template<class D, class S>
94
+ BOOST_CONTAINER_FORCEINLINE static const D &force(const S &s)
95
+ { return *move_detail::launder_cast<const D*>(&s); }
68
96
 
69
97
  template<class D, class S>
70
98
  BOOST_CONTAINER_FORCEINLINE static D force_copy(const S &s)
71
99
  {
72
- const D *const vp = move_detail::force_ptr<const D *>(&s);
100
+ const D *const vp = move_detail::launder_cast<const D *>(&s);
73
101
  D ret_val(*vp);
74
102
  return ret_val;
75
103
  }
104
+ #endif //BOOST_CONTAINER_DOXYGEN_INVOKED
76
105
 
77
106
  } //namespace dtl{
78
107
 
@@ -118,18 +147,27 @@ class flat_map
118
147
  private:
119
148
  BOOST_COPYABLE_AND_MOVABLE(flat_map)
120
149
  //This is the tree that we should store if pair was movable
150
+ typedef std::pair<Key, T> std_pair_t;
121
151
  typedef dtl::flat_tree<
122
- std::pair<Key, T>,
152
+ std_pair_t,
123
153
  dtl::select1st<Key>,
124
154
  Compare,
125
155
  AllocatorOrContainer> tree_t;
126
156
 
127
157
  //This is the real tree stored here. It's based on a movable pair
158
+ typedef dtl::pair<Key, T> dtl_pair_t;
159
+
160
+ #ifdef BOOST_CONTAINER_STD_PAIR_IS_MOVABLE
161
+ typedef std_pair_t impl_pair_t;
162
+ #else
163
+ typedef dtl_pair_t impl_pair_t;
164
+ #endif
165
+
128
166
  typedef dtl::flat_tree<
129
- dtl::pair<Key, T>,
167
+ impl_pair_t,
130
168
  dtl::select1st<Key>,
131
169
  Compare,
132
- typename dtl::container_or_allocator_rebind<AllocatorOrContainer, dtl::pair<Key, T> >::type
170
+ typename dtl::container_or_allocator_rebind<AllocatorOrContainer, impl_pair_t >::type
133
171
  > impl_tree_t;
134
172
  impl_tree_t m_flat_tree; // flat tree representing flat_map
135
173
 
@@ -851,7 +889,7 @@ class flat_map
851
889
  //! @copydoc ::boost::container::flat_set::nth(size_type) const
852
890
  BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
853
891
  const_iterator nth(size_type n) const BOOST_NOEXCEPT_OR_NOTHROW
854
- { return dtl::force_copy<iterator>(m_flat_tree.nth(n)); }
892
+ { return dtl::force_copy<const_iterator>(m_flat_tree.nth(n)); }
855
893
 
856
894
  //! @copydoc ::boost::container::flat_set::index_of(iterator)
857
895
  BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
@@ -1099,7 +1137,7 @@ class flat_map
1099
1137
  template <class Pair>
1100
1138
  inline BOOST_CONTAINER_DOC1ST
1101
1139
  ( std::pair<iterator BOOST_MOVE_I bool>
1102
- , typename dtl::enable_if_c<dtl::is_convertible<Pair BOOST_MOVE_I impl_value_type>::value
1140
+ , typename dtl::enable_if_c<dtl::is_convertible<Pair BOOST_MOVE_I dtl_pair_t>::value
1103
1141
  BOOST_MOVE_I std::pair<iterator BOOST_MOVE_I bool> >::type)
1104
1142
  insert(BOOST_FWD_REF(Pair) x)
1105
1143
  {
@@ -1153,7 +1191,7 @@ class flat_map
1153
1191
  template <class Pair>
1154
1192
  inline BOOST_CONTAINER_DOC1ST
1155
1193
  ( iterator
1156
- , typename dtl::enable_if_c<dtl::is_convertible<Pair BOOST_MOVE_I impl_value_type>::value
1194
+ , typename dtl::enable_if_c<dtl::is_convertible<Pair BOOST_MOVE_I dtl_pair_t>::value
1157
1195
  BOOST_MOVE_I iterator>::type)
1158
1196
  insert(const_iterator p, BOOST_FWD_REF(Pair) x)
1159
1197
  {
@@ -1277,6 +1315,23 @@ class flat_map
1277
1315
  inline size_type erase(const key_type& x)
1278
1316
  { return m_flat_tree.erase_unique(x); }
1279
1317
 
1318
+ //! <b>Requires</b>: This overload is available only if
1319
+ //! key_compare::is_transparent exists.
1320
+ //!
1321
+ //! <b>Effects</b>: If present, erases the element in the container with key equivalent to x.
1322
+ //!
1323
+ //! <b>Returns</b>: Returns the number of erased elements (0/1).
1324
+ template <class K>
1325
+ inline BOOST_CONTAINER_DOC1ST
1326
+ (size_type
1327
+ , typename dtl::enable_if_c<
1328
+ dtl::is_transparent<key_compare>::value && //transparent
1329
+ !dtl::is_convertible<K BOOST_MOVE_I iterator>::value && //not convertible to iterator
1330
+ !dtl::is_convertible<K BOOST_MOVE_I const_iterator>::value //not convertible to const_iterator
1331
+ BOOST_MOVE_I size_type>::type)
1332
+ erase(const K& x)
1333
+ { return m_flat_tree.erase_unique(x); }
1334
+
1280
1335
  //! <b>Effects</b>: Erases all the elements in the range [first, last).
1281
1336
  //!
1282
1337
  //! <b>Returns</b>: Returns last.
@@ -1637,7 +1692,7 @@ class flat_map
1637
1692
  if (i == end() || key_comp()(k, (*i).first)){
1638
1693
  dtl::value_init<mapped_type> m;
1639
1694
  impl_value_type v(k, ::boost::move(m.m_t));
1640
- i = this->insert(i, ::boost::move(v));
1695
+ i = dtl::force_copy<iterator>(this->m_flat_tree.insert_equal(::boost::move(v)));
1641
1696
  }
1642
1697
  return (*i).second;
1643
1698
  }
@@ -1646,10 +1701,10 @@ class flat_map
1646
1701
  key_type &k = mk;
1647
1702
  iterator i = this->lower_bound(k);
1648
1703
  // i->first is greater than or equivalent to k.
1649
- if (i == end() || key_comp()(k, (*i).first)){
1704
+ if (i == end() || key_comp()(k, (*i).first)) {
1650
1705
  dtl::value_init<mapped_type> m;
1651
1706
  impl_value_type v(::boost::move(k), ::boost::move(m.m_t));
1652
- i = this->insert(i, ::boost::move(v));
1707
+ i = dtl::force_copy<iterator>(this->m_flat_tree.insert_equal(::boost::move(v)));
1653
1708
  }
1654
1709
  return (*i).second;
1655
1710
  }
@@ -1729,10 +1784,10 @@ flat_map(ordered_unique_range_t, InputIterator, InputIterator, Compare const&, A
1729
1784
  template <class Key, class T, class Compare, class AllocatorOrContainer>
1730
1785
  struct has_trivial_destructor_after_move<boost::container::flat_map<Key, T, Compare, AllocatorOrContainer> >
1731
1786
  {
1732
- typedef ::boost::container::dtl::pair<Key, T> value_t;
1787
+ typedef typename boost::container::flat_map<Key, T, Compare, AllocatorOrContainer>::value_type value_t;
1733
1788
  typedef typename ::boost::container::dtl::container_or_allocator_rebind<AllocatorOrContainer, value_t>::type alloc_or_cont_t;
1734
1789
  typedef ::boost::container::dtl::flat_tree<value_t,::boost::container::dtl::select1st<Key>, Compare, alloc_or_cont_t> tree;
1735
- static const bool value = ::boost::has_trivial_destructor_after_move<tree>::value;
1790
+ BOOST_STATIC_CONSTEXPR bool value = ::boost::has_trivial_destructor_after_move<tree>::value;
1736
1791
  };
1737
1792
 
1738
1793
  namespace container {
@@ -1777,17 +1832,24 @@ class flat_multimap
1777
1832
  #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
1778
1833
  private:
1779
1834
  BOOST_COPYABLE_AND_MOVABLE(flat_multimap)
1835
+ typedef std::pair<Key, T> std_pair_t;
1780
1836
  typedef dtl::flat_tree<
1781
- std::pair<Key, T>,
1837
+ std_pair_t,
1782
1838
  dtl::select1st<Key>,
1783
1839
  Compare,
1784
1840
  AllocatorOrContainer> tree_t;
1785
1841
  //This is the real tree stored here. It's based on a movable pair
1842
+ typedef dtl::pair<Key, T> dtl_pair_t;
1843
+ #ifdef BOOST_CONTAINER_STD_PAIR_IS_MOVABLE
1844
+ typedef std_pair_t impl_pair_t;
1845
+ #else
1846
+ typedef dtl_pair_t impl_pair_t;
1847
+ #endif
1786
1848
  typedef dtl::flat_tree<
1787
- dtl::pair<Key, T>,
1849
+ impl_pair_t,
1788
1850
  dtl::select1st<Key>,
1789
1851
  Compare,
1790
- typename dtl::container_or_allocator_rebind<AllocatorOrContainer, dtl::pair<Key, T> >::type
1852
+ typename dtl::container_or_allocator_rebind<AllocatorOrContainer, impl_pair_t >::type
1791
1853
  > impl_tree_t;
1792
1854
  impl_tree_t m_flat_tree; // flat tree representing flat_map
1793
1855
 
@@ -2388,7 +2450,7 @@ class flat_multimap
2388
2450
  //! @copydoc ::boost::container::flat_set::nth(size_type) const
2389
2451
  BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2390
2452
  const_iterator nth(size_type n) const BOOST_NOEXCEPT_OR_NOTHROW
2391
- { return dtl::force_copy<iterator>(m_flat_tree.nth(n)); }
2453
+ { return dtl::force_copy<const_iterator>(m_flat_tree.nth(n)); }
2392
2454
 
2393
2455
  //! @copydoc ::boost::container::flat_set::index_of(iterator)
2394
2456
  BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
@@ -2477,7 +2539,7 @@ class flat_multimap
2477
2539
  template<class Pair>
2478
2540
  inline BOOST_CONTAINER_DOC1ST
2479
2541
  ( iterator
2480
- , typename dtl::enable_if_c<dtl::is_convertible<Pair BOOST_MOVE_I impl_value_type>::value
2542
+ , typename dtl::enable_if_c<dtl::is_convertible<Pair BOOST_MOVE_I dtl_pair_t>::value
2481
2543
  BOOST_MOVE_I iterator >::type)
2482
2544
  insert(BOOST_FWD_REF(Pair) x)
2483
2545
  { return dtl::force_copy<iterator>(m_flat_tree.emplace_equal(boost::forward<Pair>(x))); }
@@ -2514,7 +2576,7 @@ class flat_multimap
2514
2576
  template<class Pair>
2515
2577
  inline BOOST_CONTAINER_DOC1ST
2516
2578
  ( iterator
2517
- , typename dtl::enable_if_c<dtl::is_convertible<Pair BOOST_MOVE_I impl_value_type>::value
2579
+ , typename dtl::enable_if_c<dtl::is_convertible<Pair BOOST_MOVE_I dtl_pair_t>::value
2518
2580
  BOOST_MOVE_I iterator>::type)
2519
2581
  insert(const_iterator p, BOOST_FWD_REF(Pair) x)
2520
2582
  {
@@ -2633,6 +2695,23 @@ class flat_multimap
2633
2695
  inline size_type erase(const key_type& x)
2634
2696
  { return m_flat_tree.erase(x); }
2635
2697
 
2698
+ //! <b>Requires</b>: This overload is available only if
2699
+ //! key_compare::is_transparent exists.
2700
+ //!
2701
+ //! <b>Effects</b>: Erases all elements in the container with key equivalent to x.
2702
+ //!
2703
+ //! <b>Returns</b>: Returns the number of erased elements.
2704
+ template <class K>
2705
+ inline BOOST_CONTAINER_DOC1ST
2706
+ (size_type
2707
+ , typename dtl::enable_if_c<
2708
+ dtl::is_transparent<key_compare>::value && //transparent
2709
+ !dtl::is_convertible<K BOOST_MOVE_I iterator>::value && //not convertible to iterator
2710
+ !dtl::is_convertible<K BOOST_MOVE_I const_iterator>::value //not convertible to const_iterator
2711
+ BOOST_MOVE_I size_type>::type)
2712
+ erase(const K& x)
2713
+ { return m_flat_tree.erase(x); }
2714
+
2636
2715
  //! <b>Effects</b>: Erases all the elements in the range [first, last).
2637
2716
  //!
2638
2717
  //! <b>Returns</b>: Returns last.
@@ -2977,6 +3056,10 @@ class flat_multimap
2977
3056
  { x.swap(y); }
2978
3057
  };
2979
3058
 
3059
+ #if defined(BOOST_GCC) && (BOOST_GCC >= 100000) && !defined(BOOST_CONTAINER_STD_PAIR_IS_MOVABLE)
3060
+ #pragma GCC pop_options
3061
+ #endif
3062
+
2980
3063
  #ifndef BOOST_CONTAINER_NO_CXX17_CTAD
2981
3064
 
2982
3065
  template <typename InputIterator>
@@ -3052,10 +3135,10 @@ namespace boost {
3052
3135
  template <class Key, class T, class Compare, class AllocatorOrContainer>
3053
3136
  struct has_trivial_destructor_after_move< boost::container::flat_multimap<Key, T, Compare, AllocatorOrContainer> >
3054
3137
  {
3055
- typedef ::boost::container::dtl::pair<Key, T> value_t;
3138
+ typedef typename boost::container::flat_multimap<Key, T, Compare, AllocatorOrContainer>::value_type value_t;
3056
3139
  typedef typename ::boost::container::dtl::container_or_allocator_rebind<AllocatorOrContainer, value_t>::type alloc_or_cont_t;
3057
3140
  typedef ::boost::container::dtl::flat_tree<value_t,::boost::container::dtl::select1st<Key>, Compare, alloc_or_cont_t> tree;
3058
- static const bool value = ::boost::has_trivial_destructor_after_move<tree>::value;
3141
+ BOOST_STATIC_CONSTEXPR bool value = ::boost::has_trivial_destructor_after_move<tree>::value;
3059
3142
  };
3060
3143
 
3061
3144
  } //namespace boost {
@@ -1201,7 +1201,7 @@ template <class Key, class Compare, class AllocatorOrContainer>
1201
1201
  struct has_trivial_destructor_after_move<boost::container::flat_set<Key, Compare, AllocatorOrContainer> >
1202
1202
  {
1203
1203
  typedef ::boost::container::dtl::flat_tree<Key, ::boost::container::dtl::identity<Key>, Compare, AllocatorOrContainer> tree;
1204
- static const bool value = ::boost::has_trivial_destructor_after_move<tree>::value;
1204
+ BOOST_STATIC_CONSTEXPR bool value = ::boost::has_trivial_destructor_after_move<tree>::value;
1205
1205
  };
1206
1206
 
1207
1207
  namespace container {
@@ -1932,7 +1932,7 @@ template <class Key, class Compare, class AllocatorOrContainer>
1932
1932
  struct has_trivial_destructor_after_move<boost::container::flat_multiset<Key, Compare, AllocatorOrContainer> >
1933
1933
  {
1934
1934
  typedef ::boost::container::dtl::flat_tree<Key, ::boost::container::dtl::identity<Key>, Compare, AllocatorOrContainer> tree;
1935
- static const bool value = ::boost::has_trivial_destructor_after_move<tree>::value;
1935
+ BOOST_STATIC_CONSTEXPR bool value = ::boost::has_trivial_destructor_after_move<tree>::value;
1936
1936
  };
1937
1937
 
1938
1938
  namespace container {
@@ -43,7 +43,6 @@
43
43
  # include <boost/move/detail/fwd_macros.hpp>
44
44
  #endif
45
45
  #include <boost/move/detail/move_helpers.hpp>
46
- #include <boost/move/detail/force_ptr.hpp>
47
46
 
48
47
  // intrusive
49
48
  #include <boost/intrusive/pointer_traits.hpp>
@@ -344,26 +343,13 @@ class list
344
343
  || allocator_traits_type::is_always_equal::value)
345
344
  {
346
345
  if (BOOST_LIKELY(this != &x)) {
347
- NodeAlloc &this_alloc = this->node_alloc();
348
- NodeAlloc &x_alloc = x.node_alloc();
349
- const bool propagate_alloc = allocator_traits_type::
350
- propagate_on_container_move_assignment::value;
351
- const bool allocators_equal = this_alloc == x_alloc; (void)allocators_equal;
352
- //Resources can be transferred if both allocators are
353
- //going to be equal after this function (either propagated or already equal)
354
- if(propagate_alloc || allocators_equal){
355
- //Destroy
356
- this->clear();
357
- //Move allocator if needed
358
- this->AllocHolder::move_assign_alloc(x);
359
- //Obtain resources
360
- this->icont() = boost::move(x.icont());
361
- }
362
- //Else do a one by one move
363
- else{
364
- this->assign( boost::make_move_iterator(x.begin())
365
- , boost::make_move_iterator(x.end()));
366
- }
346
+ //We know resources can be transferred at comiple time if both allocators are
347
+ //always equal or the allocator is going to be propagated
348
+ const bool can_steal_resources_alloc
349
+ = allocator_traits_type::propagate_on_container_move_assignment::value
350
+ || allocator_traits_type::is_always_equal::value;
351
+ dtl::bool_<can_steal_resources_alloc> flag;
352
+ this->priv_move_assign(boost::move(x), flag);
367
353
  }
368
354
  return *this;
369
355
  }
@@ -1392,6 +1378,28 @@ class list
1392
1378
  #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
1393
1379
  private:
1394
1380
 
1381
+ void priv_move_assign(BOOST_RV_REF(list) x, dtl::bool_<true> /*steal_resources*/)
1382
+ {
1383
+ //Destroy objects but retain memory in case x reuses it in the future
1384
+ this->clear();
1385
+ //Move allocator if needed
1386
+ this->AllocHolder::move_assign_alloc(x);
1387
+ //Obtain resources
1388
+ this->icont() = boost::move(x.icont());
1389
+ }
1390
+
1391
+ void priv_move_assign(BOOST_RV_REF(list) x, dtl::bool_<false> /*steal_resources*/)
1392
+ {
1393
+ //We can't guarantee a compile-time equal allocator or propagation so fallback to runtime
1394
+ //Resources can be transferred if both allocators are equal
1395
+ if (this->node_alloc() == x.node_alloc()) {
1396
+ this->priv_move_assign(boost::move(x), dtl::true_());
1397
+ }
1398
+ else {
1399
+ this->assign(boost::make_move_iterator(x.begin()), boost::make_move_iterator(x.end()));
1400
+ }
1401
+ }
1402
+
1395
1403
  static bool priv_is_linked(const_iterator const position)
1396
1404
  {
1397
1405
  const_iterator cur(position);
@@ -1496,7 +1504,7 @@ struct has_trivial_destructor_after_move<boost::container::list<T, Allocator> >
1496
1504
  {
1497
1505
  typedef typename boost::container::list<T, Allocator>::allocator_type allocator_type;
1498
1506
  typedef typename ::boost::container::allocator_traits<allocator_type>::pointer pointer;
1499
- static const bool value = ::boost::has_trivial_destructor_after_move<allocator_type>::value &&
1507
+ BOOST_STATIC_CONSTEXPR bool value = ::boost::has_trivial_destructor_after_move<allocator_type>::value &&
1500
1508
  ::boost::has_trivial_destructor_after_move<pointer>::value;
1501
1509
  };
1502
1510