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
@@ -51,6 +51,7 @@
51
51
  #include <boost/move/iterator.hpp>
52
52
  #include <boost/move/traits.hpp>
53
53
  #include <boost/move/utility_core.hpp>
54
+ #include <boost/move/detail/launder.hpp>
54
55
  // move/detail
55
56
  #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
56
57
  #include <boost/move/detail/fwd_macros.hpp>
@@ -268,15 +269,15 @@ inline Pointer &get_ptr(vec_iterator<Pointer, IsConst> &it) BOOST_NOEXCEPT_OR_NO
268
269
  struct initial_capacity_t {};
269
270
 
270
271
  struct vector_uninitialized_size_t {};
271
- static const vector_uninitialized_size_t vector_uninitialized_size = vector_uninitialized_size_t();
272
+ BOOST_CONTAINER_CONSTANT_VAR vector_uninitialized_size_t vector_uninitialized_size = vector_uninitialized_size_t();
272
273
 
273
274
  struct maybe_initial_capacity_t {};
274
275
 
275
276
  template <class T>
276
277
  struct vector_value_traits_base
277
278
  {
278
- static const bool trivial_dctr = dtl::is_trivially_destructible<T>::value;
279
- static const bool trivial_dctr_after_move = has_trivial_destructor_after_move<T>::value;
279
+ BOOST_STATIC_CONSTEXPR bool trivial_dctr = dtl::is_trivially_destructible<T>::value;
280
+ BOOST_STATIC_CONSTEXPR bool trivial_dctr_after_move = has_trivial_destructor_after_move<T>::value;
280
281
  };
281
282
 
282
283
  template <class Allocator>
@@ -351,23 +352,23 @@ struct vector_alloc_holder
351
352
 
352
353
  public:
353
354
 
354
- inline
355
- static bool is_propagable_from(const allocator_type &from_alloc, pointer p, const allocator_type &to_alloc, bool const propagate_allocator)
355
+ template <bool PropagateAllocator>
356
+ inline static bool is_propagable_from(const allocator_type &from_alloc, pointer p, const allocator_type &to_alloc)
356
357
  {
357
- (void)propagate_allocator; (void)p; (void)to_alloc; (void)from_alloc;
358
+ (void)p; (void)to_alloc; (void)from_alloc;
358
359
  const bool all_storage_propagable = !allocator_traits_type::is_partially_propagable::value ||
359
360
  !allocator_traits_type::storage_is_unpropagable(from_alloc, p);
360
361
  return all_storage_propagable &&
361
- (propagate_allocator || allocator_traits_type::is_always_equal::value || allocator_traits_type::equal(from_alloc, to_alloc));
362
+ (PropagateAllocator || allocator_traits_type::is_always_equal::value || allocator_traits_type::equal(from_alloc, to_alloc));
362
363
  }
363
364
 
364
- inline
365
- static bool are_swap_propagable(const allocator_type &l_a, pointer l_p, const allocator_type &r_a, pointer r_p, bool const propagate_allocator)
365
+ template <bool PropagateAllocator>
366
+ inline static bool are_swap_propagable(const allocator_type &l_a, pointer l_p, const allocator_type &r_a, pointer r_p)
366
367
  {
367
- (void)propagate_allocator; (void)l_p; (void)r_p; (void)l_a; (void)r_a;
368
+ (void)l_p; (void)r_p; (void)l_a; (void)r_a;
368
369
  const bool all_storage_propagable = !allocator_traits_type::is_partially_propagable::value ||
369
370
  !(allocator_traits_type::storage_is_unpropagable(l_a, l_p) || allocator_traits_type::storage_is_unpropagable(r_a, r_p));
370
- return all_storage_propagable && (propagate_allocator || allocator_traits_type::equal(l_a, r_a));
371
+ return all_storage_propagable && (PropagateAllocator || allocator_traits_type::is_always_equal::value || allocator_traits_type::equal(l_a, r_a));
371
372
  }
372
373
 
373
374
  //Constructor, does not throw
@@ -545,7 +546,7 @@ struct vector_alloc_holder
545
546
  inline const allocator_type &alloc() const BOOST_NOEXCEPT_OR_NOTHROW
546
547
  { return *this; }
547
548
 
548
- inline const pointer &start() const BOOST_NOEXCEPT_OR_NOTHROW
549
+ inline pointer start() const BOOST_NOEXCEPT_OR_NOTHROW
549
550
  { return m_start; }
550
551
  inline size_type capacity() const BOOST_NOEXCEPT_OR_NOTHROW
551
552
  { return m_capacity; }
@@ -837,14 +838,14 @@ private:
837
838
 
838
839
 
839
840
  protected:
840
- inline
841
- static bool is_propagable_from(const allocator_type &from_alloc, pointer p, const allocator_type &to_alloc, bool const propagate_allocator)
842
- { return alloc_holder_t::is_propagable_from(from_alloc, p, to_alloc, propagate_allocator); }
841
+ template <bool PropagateAllocator>
842
+ inline static bool is_propagable_from(const allocator_type &from_alloc, pointer p, const allocator_type &to_alloc)
843
+ { return alloc_holder_t::template is_propagable_from<PropagateAllocator>(from_alloc, p, to_alloc); }
843
844
 
844
- inline
845
- static bool are_swap_propagable( const allocator_type &l_a, pointer l_p
846
- , const allocator_type &r_a, pointer r_p, bool const propagate_allocator)
847
- { return alloc_holder_t::are_swap_propagable(l_a, l_p, r_a, r_p, propagate_allocator); }
845
+ template <bool PropagateAllocator>
846
+ inline static bool are_swap_propagable( const allocator_type &l_a, pointer l_p
847
+ , const allocator_type &r_a, pointer r_p)
848
+ { return alloc_holder_t::template are_swap_propagable<PropagateAllocator>(l_a, l_p, r_a, r_p); }
848
849
 
849
850
  #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
850
851
  #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
@@ -866,6 +867,25 @@ private:
866
867
  : m_holder(initial_capacity_t(), initial_memory, cap, ::boost::forward<AllocFwd>(a))
867
868
  {}
868
869
 
870
+ template<class AllocFwd>
871
+ inline vector(initial_capacity_t, pointer initial_memory, size_type cap, BOOST_FWD_REF(AllocFwd) a, vector &x)
872
+ : m_holder(initial_capacity_t(), initial_memory, cap, ::boost::forward<AllocFwd>(a))
873
+ {
874
+ allocator_type &this_al = this->get_stored_allocator();
875
+ if (this->template is_propagable_from<true>(x.get_stored_allocator(), x.data(), this_al)) {
876
+ this->steal_resources(x);
877
+ }
878
+ else {
879
+ const size_type sz = x.size();
880
+ ::boost::container::uninitialized_move_alloc_n_source
881
+ ( this_al, x.priv_raw_begin(), sz
882
+ //Use launder to stop false positives from -Warray-bounds
883
+ , boost::move_detail::launder(this->priv_raw_begin()));
884
+ this->protected_set_size(sz);
885
+ x.clear();
886
+ }
887
+ }
888
+
869
889
  inline vector(initial_capacity_t, pointer initial_memory, size_type cap)
870
890
  : m_holder(initial_capacity_t(), initial_memory, cap)
871
891
  {}
@@ -1163,11 +1183,11 @@ private:
1163
1183
  vector(BOOST_RV_REF(vector) x, const allocator_type &a)
1164
1184
  : m_holder( vector_uninitialized_size, a
1165
1185
  //In this allocator move constructor the allocator won't be propagated --v
1166
- , is_propagable_from(x.get_stored_allocator(), x.m_holder.start(), a, false) ? 0 : x.size()
1186
+ , is_propagable_from<false>(x.get_stored_allocator(), x.m_holder.start(), a) ? 0 : x.size()
1167
1187
  )
1168
1188
  {
1169
1189
  //In this allocator move constructor the allocator won't be propagated ---v
1170
- if(is_propagable_from(x.get_stored_allocator(), x.m_holder.start(), a, false)){
1190
+ if(is_propagable_from<false>(x.get_stored_allocator(), x.m_holder.start(), a)){
1171
1191
  this->m_holder.steal_resources(x.m_holder);
1172
1192
  }
1173
1193
  else{
@@ -2228,7 +2248,7 @@ private:
2228
2248
 
2229
2249
  #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
2230
2250
 
2231
- //! <b>Effects</b>: Erases all the elements of the vector.
2251
+ //! <b>Effects</b>: Erases all the elements of the vector. Leaves the capacity() of the vector unchanged.
2232
2252
  //!
2233
2253
  //! <b>Throws</b>: Nothing.
2234
2254
  //!
@@ -2531,6 +2551,38 @@ private:
2531
2551
  x.clear();
2532
2552
  }
2533
2553
 
2554
+ template<class OtherA>
2555
+ void priv_move_assign_steal_or_assign(BOOST_RV_REF_BEG vector<T, OtherA, Options> BOOST_RV_REF_END x, dtl::true_type /*data_can_be_always_stolen*/)
2556
+ {
2557
+ this->clear();
2558
+ if (BOOST_LIKELY(!!this->m_holder.m_start))
2559
+ this->m_holder.deallocate(this->m_holder.m_start, this->m_holder.m_capacity);
2560
+ this->m_holder.steal_resources(x.m_holder);
2561
+ }
2562
+
2563
+ template<class OtherA>
2564
+ void priv_move_assign_steal_or_assign(BOOST_RV_REF_BEG vector<T, OtherA, Options> BOOST_RV_REF_END x, dtl::false_type /*data_can_be_always_stolen*/)
2565
+ {
2566
+ const bool propagate_alloc = allocator_traits_type::propagate_on_container_move_assignment::value;
2567
+ allocator_type& this_alloc = this->m_holder.alloc();
2568
+ allocator_type& x_alloc = x.m_holder.alloc();
2569
+
2570
+ //In this allocator move constructor the allocator might will be propagated, but to support small_vector-like
2571
+ //types, we need to check the currently owned buffers to know if they are propagable.
2572
+ const bool is_buffer_propagable_from_x = is_propagable_from<propagate_alloc>(x_alloc, x.m_holder.start(), this_alloc);
2573
+
2574
+ if (is_buffer_propagable_from_x) {
2575
+ this->priv_move_assign_steal_or_assign(boost::move(x), dtl::true_type());
2576
+ }
2577
+ //Else do a one by one move. Also, clear the source as users find confusing
2578
+ //elements are still alive in the source container.
2579
+ else {
2580
+ this->assign( boost::make_move_iterator(boost::movelib::iterator_to_raw_pointer(x.begin()))
2581
+ , boost::make_move_iterator(boost::movelib::iterator_to_raw_pointer(x.end())) );
2582
+ x.clear();
2583
+ }
2584
+ }
2585
+
2534
2586
  template<class OtherA>
2535
2587
  void priv_move_assign(BOOST_RV_REF_BEG vector<T, OtherA, Options> BOOST_RV_REF_END x
2536
2588
  , typename dtl::disable_if_or
@@ -2542,30 +2594,16 @@ private:
2542
2594
  //for move assignment, no aliasing (&x != this) is assumed.
2543
2595
  //x.size() == 0 is allowed for buggy std libraries.
2544
2596
  BOOST_ASSERT(this != &x || x.size() == 0);
2545
- allocator_type &this_alloc = this->m_holder.alloc();
2546
- allocator_type &x_alloc = x.m_holder.alloc();
2597
+ const bool alloc_is_always_equal = allocator_traits_type::is_always_equal::value;
2547
2598
  const bool propagate_alloc = allocator_traits_type::propagate_on_container_move_assignment::value;
2599
+ const bool partially_propagable_alloc = allocator_traits_type::is_partially_propagable::value;
2600
+ const bool data_can_be_always_be_stolen = alloc_is_always_equal || (propagate_alloc && !partially_propagable_alloc);
2548
2601
 
2549
- //In this allocator move constructor the allocator maybe will be propagated -----------------------v
2550
- const bool is_propagable_from_x = is_propagable_from(x_alloc, x.m_holder.start(), this_alloc, propagate_alloc);
2602
+ this->priv_move_assign_steal_or_assign(boost::move(x), dtl::bool_<data_can_be_always_be_stolen>());
2551
2603
 
2552
- //Resources can be transferred if both allocators are
2553
- //going to be equal after this function (either propagated or already equal)
2554
- if(is_propagable_from_x){
2555
- this->clear();
2556
- if(BOOST_LIKELY(!!this->m_holder.m_start))
2557
- this->m_holder.deallocate(this->m_holder.m_start, this->m_holder.m_capacity);
2558
- this->m_holder.steal_resources(x.m_holder);
2559
- }
2560
- //Else do a one by one move. Also, clear the source as users find confusing
2561
- //elements are still alive in the source container.
2562
- else{
2563
- this->assign( boost::make_move_iterator(boost::movelib::iterator_to_raw_pointer(x.begin()))
2564
- , boost::make_move_iterator(boost::movelib::iterator_to_raw_pointer(x.end() ))
2565
- );
2566
- x.clear();
2567
- }
2568
2604
  //Move allocator if needed
2605
+ allocator_type& this_alloc = this->m_holder.alloc();
2606
+ allocator_type& x_alloc = x.m_holder.alloc();
2569
2607
  dtl::move_alloc(this_alloc, x_alloc, dtl::bool_<propagate_alloc>());
2570
2608
  }
2571
2609
 
@@ -2613,46 +2651,115 @@ private:
2613
2651
  template<class Vector> //Template it to avoid it in explicit instantiations
2614
2652
  void priv_swap(Vector &x, dtl::false_type) //version_N
2615
2653
  {
2616
- const bool propagate_alloc = allocator_traits_type::propagate_on_container_swap::value;
2654
+ BOOST_ASSERT(allocator_traits_type::propagate_on_container_swap::value ||
2655
+ allocator_traits_type::is_always_equal::value ||
2656
+ this->get_stored_allocator() == x.get_stored_allocator());
2657
+
2658
+ if (BOOST_UNLIKELY(&x == this)) {
2659
+ return;
2660
+ }
2661
+
2662
+ //Just swap internals
2663
+ this->m_holder.swap_resources(x.m_holder);
2664
+ //And now swap the allocator
2665
+ dtl::bool_<allocator_traits_type::propagate_on_container_swap::value> flag;
2666
+ dtl::swap_alloc(this->m_holder.alloc(), x.m_holder.alloc(), flag);
2667
+ }
2668
+
2669
+ protected:
2670
+ template<class Vector> //Template it to avoid it in explicit instantiations
2671
+ void prot_swap_small(Vector &x, std::size_t internal_capacity) //version_N
2672
+ {
2617
2673
  if (BOOST_UNLIKELY(&x == this)){
2618
2674
  return;
2619
2675
  }
2620
- else if(are_swap_propagable( this->get_stored_allocator(), this->m_holder.start()
2621
- , x.get_stored_allocator(), x.m_holder.start(), propagate_alloc)){
2622
- //Just swap internals
2623
- this->m_holder.swap_resources(x.m_holder);
2676
+
2677
+ const bool propagate_alloc = allocator_traits_type::propagate_on_container_swap::value;
2678
+ if(are_swap_propagable<propagate_alloc>
2679
+ ( this->get_stored_allocator(), this->m_holder.start(), x.get_stored_allocator(), x.m_holder.start())){
2680
+ this->priv_swap(x, dtl::false_());
2681
+ return;
2624
2682
  }
2625
- else{
2626
- //Else swap element by element...
2683
+
2684
+ allocator_type &th_al = this->get_stored_allocator();
2685
+ allocator_type &ot_al = x.get_stored_allocator();
2686
+
2687
+ const bool is_this_data_propagable = is_propagable_from<propagate_alloc>(th_al, this->data(), ot_al);
2688
+ const bool is_that_data_propagable = is_propagable_from<propagate_alloc>(ot_al, x.data(), th_al);
2689
+
2690
+ if(internal_capacity && (is_this_data_propagable || is_that_data_propagable)) {
2691
+ //steal memory from src to dst, but move elements from dst to src
2692
+ vector& extmem = is_this_data_propagable ? *this : x;
2693
+ vector& intmem = is_this_data_propagable ? x : *this;
2694
+
2695
+ //Reset extmem to the internal storage and backup data
2696
+ pointer const orig_extdata = extmem.data();
2697
+ const size_type orig_extmem_size = extmem.size();
2698
+ const size_type orig_extmem_cap = extmem.capacity();
2699
+
2700
+ //New safe state for extmem -> empty, internal storage
2701
+ extmem.m_holder.m_start = extmem.get_stored_allocator().internal_storage();
2702
+ extmem.m_holder.set_stored_size(0u);
2703
+ extmem.m_holder.set_stored_capacity(internal_capacity);
2704
+
2705
+ {
2706
+ //Deallocate on exception
2707
+ typename value_traits::ArrayDeallocator new_buffer_deallocator(orig_extdata, extmem.get_stored_allocator(), orig_extmem_cap);
2708
+ typename value_traits::ArrayDestructor new_values_destroyer(orig_extdata, extmem.get_stored_allocator(), orig_extmem_size);
2709
+
2710
+ //Move internal memory data to the internal memory data of the target, this can throw
2711
+ BOOST_ASSERT(extmem.capacity() >= intmem.size());
2712
+ ::boost::container::uninitialized_move_alloc_n
2713
+ (intmem.get_stored_allocator(), this->priv_raw_begin(), intmem.size(), extmem.priv_raw_begin());
2714
+
2715
+ //Exception not thrown, commit new state
2716
+ extmem.m_holder.set_stored_size(intmem.size());
2717
+ //Throwing part passed, disable rollback
2718
+ new_buffer_deallocator.release();
2719
+ new_values_destroyer.release();
2720
+ }
2721
+
2722
+ //Destroy moved elements from intmem
2723
+ boost::container::destroy_alloc_n
2724
+ ( intmem.get_stored_allocator(), this->priv_raw_begin()
2725
+ , intmem.size());
2726
+
2727
+ //Adopt dynamic buffer
2728
+ intmem.m_holder.m_start = orig_extdata;
2729
+ intmem.m_holder.set_stored_size(orig_extmem_size);
2730
+ intmem.m_holder.set_stored_capacity(orig_extmem_cap);
2731
+
2732
+ //And now swap the allocator
2733
+ dtl::swap_alloc(this->m_holder.alloc(), x.m_holder.alloc(), dtl::bool_<propagate_alloc>());
2734
+ }
2735
+ else { //swap element by element and insert rest
2627
2736
  bool const t_smaller = this->size() < x.size();
2628
2737
  vector &sml = t_smaller ? *this : x;
2629
2738
  vector &big = t_smaller ? x : *this;
2630
2739
 
2631
- //For empty containers, maybe storage can be moved from the other (just like in the move constructor)
2632
- if(sml.empty() && is_propagable_from(big.get_stored_allocator(), big.data(), sml.get_allocator(), propagate_alloc)){
2633
- if(BOOST_LIKELY(0u != sml.capacity()))
2634
- sml.m_holder.deallocate(sml.m_holder.m_start, sml.m_holder.m_capacity);
2635
- sml.steal_resources(big);
2636
- }
2637
- else {
2638
- //Else swap element by element...
2639
- size_type const common_elements = sml.size();
2640
- for(size_type i = 0; i != common_elements; ++i){
2641
- boost::adl_move_swap(sml[i], big[i]);
2642
- }
2643
- //... and move-insert the remaining range
2644
- sml.insert( sml.cend()
2645
- , boost::make_move_iterator(boost::movelib::iterator_to_raw_pointer(big.nth(common_elements)))
2646
- , boost::make_move_iterator(boost::movelib::iterator_to_raw_pointer(big.end()))
2647
- );
2648
- //Destroy remaining elements
2649
- big.erase(big.nth(common_elements), big.cend());
2740
+ //swap element by element until common size
2741
+ size_type const common_elements = sml.size();
2742
+ for(size_type i = 0; i != common_elements; ++i){
2743
+ boost::adl_move_swap(sml[i], big[i]);
2650
2744
  }
2745
+
2746
+ //And now swap the allocator to be able to construct new elements in sml with the proper allocator
2747
+ dtl::swap_alloc(this->m_holder.alloc(), x.m_holder.alloc(), dtl::bool_<propagate_alloc>());
2748
+
2749
+ //move-insert the remaining range
2750
+ T *const raw_big_nth = boost::movelib::iterator_to_raw_pointer(big.nth(common_elements));
2751
+ sml.insert(sml.cend()
2752
+ , boost::make_move_iterator(raw_big_nth)
2753
+ , boost::make_move_iterator(boost::movelib::iterator_to_raw_pointer(big.end())));
2754
+
2755
+ //Destroy remaining, moved, elements with their original allocator
2756
+ boost::container::destroy_alloc_n
2757
+ ( sml.get_stored_allocator(), raw_big_nth
2758
+ , std::size_t(big.m_holder.m_size - common_elements));
2759
+ big.m_holder.set_stored_size(common_elements);
2651
2760
  }
2652
- //And now swap the allocator
2653
- dtl::swap_alloc(this->m_holder.alloc(), x.m_holder.alloc(), dtl::bool_<propagate_alloc>());
2654
2761
  }
2655
-
2762
+ private:
2656
2763
  inline void priv_move_to_new_buffer(size_type, version_0)
2657
2764
  { alloc_holder_t::on_capacity_overflow(); }
2658
2765
 
@@ -2762,6 +2869,41 @@ private:
2762
2869
  inline dtl::insert_value_initialized_n_proxy<allocator_type> priv_resize_proxy(value_init_t)
2763
2870
  { return dtl::insert_value_initialized_n_proxy<allocator_type>(); }
2764
2871
 
2872
+ protected:
2873
+ void prot_shrink_to_fit_small(pointer const small_buffer, const size_type small_capacity)
2874
+ {
2875
+ const size_type cp = this->m_holder.capacity();
2876
+ if (cp && this->m_holder.m_start != small_buffer) { //Do something only if a dynamic buffer is used
2877
+ const size_type sz = this->size();
2878
+ if (!sz) {
2879
+ if (BOOST_LIKELY(!!this->m_holder.m_start))
2880
+ this->m_holder.deallocate(this->m_holder.m_start, cp);
2881
+ this->m_holder.m_start = small_buffer;
2882
+ this->m_holder.set_stored_capacity(small_capacity);
2883
+ }
2884
+ else if(sz <= small_capacity) {
2885
+ T *const oldbuf = boost::movelib::to_raw_pointer(this->m_holder.m_start);
2886
+ ::boost::container::uninitialized_move_alloc_n
2887
+ ( this->get_stored_allocator()
2888
+ , oldbuf
2889
+ , sz
2890
+ , boost::movelib::to_raw_pointer(small_buffer)
2891
+ );
2892
+ boost::container::destroy_alloc_n(this->get_stored_allocator(), oldbuf, sz);
2893
+
2894
+ if (BOOST_LIKELY(!!this->m_holder.m_start))
2895
+ this->m_holder.deallocate(this->m_holder.m_start, cp);
2896
+
2897
+ this->m_holder.m_start = small_buffer;
2898
+ this->m_holder.set_stored_capacity(small_capacity);
2899
+ }
2900
+ else if (sz < cp) {
2901
+ this->priv_move_to_new_buffer(sz, alloc_version());
2902
+ }
2903
+ }
2904
+ }
2905
+
2906
+ private:
2765
2907
  inline void priv_shrink_to_fit(version_0) BOOST_NOEXCEPT_OR_NOTHROW
2766
2908
  {}
2767
2909
 
@@ -2807,12 +2949,19 @@ private:
2807
2949
  }
2808
2950
  }
2809
2951
 
2952
+ #ifdef _MSC_VER
2953
+ #pragma warning (push)
2954
+ #pragma warning(disable: 4702) //Disable unreachable code warning
2955
+ #endif
2810
2956
  template <class InsertionProxy>
2811
2957
  inline iterator priv_insert_forward_range_no_capacity
2812
2958
  (T * const, const size_type, const InsertionProxy , version_0)
2813
2959
  {
2814
2960
  return alloc_holder_t::on_capacity_overflow(), iterator();
2815
2961
  }
2962
+ #ifdef _MSC_VER
2963
+ #pragma warning (pop)
2964
+ #endif
2816
2965
 
2817
2966
  template <class InsertionProxy>
2818
2967
  BOOST_CONTAINER_NOINLINE iterator priv_insert_forward_range_no_capacity
@@ -3161,8 +3310,8 @@ struct has_trivial_destructor_after_move<boost::container::vector<T, Allocator,
3161
3310
  {
3162
3311
  typedef typename boost::container::vector<T, Allocator, Options>::allocator_type allocator_type;
3163
3312
  typedef typename ::boost::container::allocator_traits<allocator_type>::pointer pointer;
3164
- static const bool value = ::boost::has_trivial_destructor_after_move<allocator_type>::value &&
3165
- ::boost::has_trivial_destructor_after_move<pointer>::value;
3313
+ BOOST_STATIC_CONSTEXPR bool value = ::boost::has_trivial_destructor_after_move<allocator_type>::value &&
3314
+ ::boost::has_trivial_destructor_after_move<pointer>::value;
3166
3315
  };
3167
3316
 
3168
3317
  }
@@ -0,0 +1,58 @@
1
+ #ifndef BOOST_CORE_DETAIL_MINSTD_RAND_HPP_INCLUDED
2
+ #define BOOST_CORE_DETAIL_MINSTD_RAND_HPP_INCLUDED
3
+
4
+ // Copyright 2017 Peter Dimov
5
+ //
6
+ // Distributed under the Boost Software License, Version 1.0.
7
+ //
8
+ // See accompanying file LICENSE_1_0.txt or copy at
9
+ // http://www.boost.org/LICENSE_1_0.txt
10
+ //
11
+ // An implementation of minstd_rand that does not require
12
+ // the Random library
13
+
14
+ #include <boost/cstdint.hpp>
15
+
16
+ namespace boost
17
+ {
18
+ namespace detail
19
+ {
20
+
21
+ class minstd_rand
22
+ {
23
+ private:
24
+
25
+ boost::uint_least32_t x_;
26
+
27
+ enum { a = 48271, m = 2147483647 };
28
+
29
+ public:
30
+
31
+ minstd_rand(): x_( 1 )
32
+ {
33
+ }
34
+
35
+ explicit minstd_rand( boost::uint_least32_t x ): x_( x % m )
36
+ {
37
+ if( x_ == 0 )
38
+ {
39
+ x_ = 1;
40
+ }
41
+ }
42
+
43
+ boost::uint_least32_t operator()()
44
+ {
45
+ boost::uint_least64_t y = x_;
46
+
47
+ y = ( a * y ) % m;
48
+
49
+ x_ = static_cast<boost::uint_least32_t>( y );
50
+
51
+ return x_;
52
+ }
53
+ };
54
+
55
+ } // namespace detail
56
+ } // namespace boost
57
+
58
+ #endif // #ifndef BOOST_CORE_DETAIL_MINSTD_RAND_HPP_INCLUDED
@@ -74,7 +74,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_first_of( Ch const* p_
74
74
 
75
75
  for( std::size_t j = 0; j < n; ++j )
76
76
  {
77
- UCh ch = s[ j ];
77
+ UCh ch = static_cast<UCh>( s[ j ] );
78
78
 
79
79
  if( ch >= 0 && ch < 256 )
80
80
  {
@@ -91,7 +91,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_first_of( Ch const* p_
91
91
  {
92
92
  for( std::size_t i = pos; i < n_; ++i )
93
93
  {
94
- UCh ch = p_[ i ];
94
+ UCh ch = static_cast<UCh>( p_[ i ] );
95
95
  if( ch >= 0 && ch < 256 && table[ ch ] ) return i;
96
96
  }
97
97
  }
@@ -129,7 +129,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_last_of( Ch const* p_,
129
129
 
130
130
  for( std::size_t j = 0; j < n; ++j )
131
131
  {
132
- UCh ch = s[ j ];
132
+ UCh ch = static_cast<UCh>( s[ j ] );
133
133
 
134
134
  if( ch >= 0 && ch < 256 )
135
135
  {
@@ -150,7 +150,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_last_of( Ch const* p_,
150
150
  {
151
151
  do
152
152
  {
153
- UCh ch = p_[ i ];
153
+ UCh ch = static_cast<UCh>( p_[ i ] );
154
154
 
155
155
  if( ch >= 0 && ch < 256 && table[ ch ] ) return i;
156
156
 
@@ -199,7 +199,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_first_not_of( Ch const
199
199
 
200
200
  for( std::size_t j = 0; j < n; ++j )
201
201
  {
202
- UCh ch = s[ j ];
202
+ UCh ch = static_cast<UCh>( s[ j ] );
203
203
 
204
204
  if( ch >= 0 && ch < 256 )
205
205
  {
@@ -216,7 +216,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_first_not_of( Ch const
216
216
  {
217
217
  for( std::size_t i = pos; i < n_; ++i )
218
218
  {
219
- UCh ch = p_[ i ];
219
+ UCh ch = static_cast<UCh>( p_[ i ] );
220
220
  if( !( ch >= 0 && ch < 256 && table[ ch ] ) ) return i;
221
221
  }
222
222
  }
@@ -262,7 +262,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_last_not_of( Ch const*
262
262
 
263
263
  for( std::size_t j = 0; j < n; ++j )
264
264
  {
265
- UCh ch = s[ j ];
265
+ UCh ch = static_cast<UCh>( s[ j ] );
266
266
 
267
267
  if( ch >= 0 && ch < 256 )
268
268
  {
@@ -283,7 +283,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_last_not_of( Ch const*
283
283
  {
284
284
  do
285
285
  {
286
- UCh ch = p_[ i ];
286
+ UCh ch = static_cast<UCh>( p_[ i ] );
287
287
 
288
288
  if( !( ch >= 0 && ch < 256 && table[ ch ] ) ) return i;
289
289
 
@@ -381,7 +381,7 @@ public:
381
381
  }
382
382
 
383
383
  template<class End> BOOST_CXX14_CONSTEXPR basic_string_view( Ch const* first, End last,
384
- typename boost::enable_if<boost::core::detail::is_same<End, Ch const*> >::type* = 0 ) BOOST_NOEXCEPT: p_( first ), n_( last - first )
384
+ typename boost::enable_if<boost::core::detail::is_same<End, Ch const*> >::type* = 0 ) BOOST_NOEXCEPT: p_( first ), n_( static_cast<size_type>( last - first ) )
385
385
  {
386
386
  BOOST_ASSERT( last - first >= 0 );
387
387
  }
@@ -681,7 +681,7 @@ public:
681
681
 
682
682
  Ch const* r = traits_type::find( data() + pos, size() - pos, c );
683
683
 
684
- return r? r - data(): npos;
684
+ return r? static_cast<size_type>( r - data() ): npos;
685
685
  }
686
686
 
687
687
  BOOST_CXX14_CONSTEXPR size_type find( Ch const* s, size_type pos, size_type n ) const BOOST_NOEXCEPT
@@ -696,11 +696,11 @@ public:
696
696
 
697
697
  for( ;; )
698
698
  {
699
- p = traits_type::find( p, last - p, s[0] );
699
+ p = traits_type::find( p, static_cast<size_type>( last - p ), s[0] );
700
700
 
701
701
  if( p == 0 ) break;
702
702
 
703
- if( traits_type::compare( p + 1, s + 1, n - 1 ) == 0 ) return p - data();
703
+ if( traits_type::compare( p + 1, s + 1, n - 1 ) == 0 ) return static_cast<size_type>( p - data() );
704
704
 
705
705
  ++p;
706
706
  }
@@ -1193,7 +1193,7 @@ public:
1193
1193
  template<class Ch> std::basic_ostream<Ch>& operator<<( std::basic_ostream<Ch>& os, basic_string_view<Ch> str )
1194
1194
  {
1195
1195
  Ch const* p = str.data();
1196
- std::streamsize n = str.size();
1196
+ std::streamsize n = static_cast<std::streamsize>( str.size() );
1197
1197
 
1198
1198
  std::streamsize m = os.width();
1199
1199