passenger 6.0.22 → 6.0.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (334) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +59 -1
  3. data/Rakefile +13 -2
  4. data/bin/passenger-install-apache2-module +5 -0
  5. data/bin/passenger-install-nginx-module +18 -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 +24 -13
  11. data/package.json +1 -1
  12. data/passenger.gemspec +4 -2
  13. data/resources/templates/standalone/server.erb +1 -0
  14. data/src/agent/Core/ApplicationPool/Group/InitializationAndShutdown.cpp +8 -0
  15. data/src/agent/Core/ApplicationPool/Group/InternalUtils.cpp +10 -2
  16. data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +8 -0
  17. data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +9 -0
  18. data/src/agent/Core/ApplicationPool/Group/OutOfBandWork.cpp +9 -0
  19. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +63 -50
  20. data/src/agent/Core/ApplicationPool/Group/SessionManagement.cpp +19 -9
  21. data/src/agent/Core/ApplicationPool/Group/SpawningAndRestarting.cpp +8 -0
  22. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +9 -1
  23. data/src/agent/Core/ApplicationPool/Group/Verification.cpp +8 -0
  24. data/src/agent/Core/ApplicationPool/Group.h +15 -5
  25. data/src/agent/Core/ApplicationPool/Pool/AnalyticsCollection.cpp +5 -0
  26. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +5 -0
  27. data/src/agent/Core/ApplicationPool/Pool/GeneralUtils.cpp +5 -0
  28. data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +5 -0
  29. data/src/agent/Core/ApplicationPool/Pool/InitializationAndShutdown.cpp +5 -0
  30. data/src/agent/Core/ApplicationPool/Pool/Miscellaneous.cpp +5 -0
  31. data/src/agent/Core/ApplicationPool/Pool/ProcessUtils.cpp +5 -0
  32. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +11 -4
  33. data/src/agent/Core/ApplicationPool/Pool.h +0 -2
  34. data/src/agent/Core/ApplicationPool/Process.h +22 -6
  35. data/src/agent/Core/ApplicationPool/Session.h +6 -1
  36. data/src/agent/Core/Config.h +8 -3
  37. data/src/agent/Core/Controller/CheckoutSession.cpp +24 -1
  38. data/src/agent/Core/Controller/Config.h +5 -1
  39. data/src/agent/Core/Controller.h +1 -0
  40. data/src/agent/Core/CoreMain.cpp +10 -17
  41. data/src/agent/Core/OptionParser.h +3 -0
  42. data/src/agent/Core/SpawningKit/ErrorRenderer.h +5 -0
  43. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -53
  44. data/src/agent/Core/SpawningKit/Handshake/Session.h +3 -0
  45. data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +5 -2
  46. data/src/agent/Core/SpawningKit/SmartSpawner.h +6 -2
  47. data/src/agent/Core/SpawningKit/Spawner.h +4 -0
  48. data/src/agent/Shared/Fundamentals/AbortHandler.cpp +88 -9
  49. data/src/agent/Shared/Fundamentals/AbortHandler.h +2 -0
  50. data/src/agent/Shared/Fundamentals/Initialization.cpp +9 -3
  51. data/src/agent/Shared/Fundamentals/Initialization.h +3 -3
  52. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +6 -7
  53. data/src/agent/Watchdog/Config.h +2 -1
  54. data/src/agent/Watchdog/WatchdogMain.cpp +4 -7
  55. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +5 -0
  56. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +15 -0
  57. data/src/apache2_module/ConfigGeneral/ManifestGeneration.h +5 -3
  58. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +5 -0
  59. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +3 -0
  60. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +13 -0
  61. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +7 -0
  62. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +16 -0
  63. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h.cxxcodebuilder +3 -0
  64. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +2 -1
  65. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h.cxxcodebuilder +2 -1
  66. data/src/cxx_supportlib/Constants.h +1 -1
  67. data/src/cxx_supportlib/DataStructures/LString.h +4 -0
  68. data/src/cxx_supportlib/DataStructures/StringMap.h +0 -1
  69. data/src/cxx_supportlib/FileTools/PathManip.cpp +1 -1
  70. data/src/cxx_supportlib/SafeLibev.h +1 -3
  71. data/src/cxx_supportlib/ServerKit/Hooks.h +2 -2
  72. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +0 -1
  73. data/src/cxx_supportlib/ServerKit/HttpServer.h +15 -10
  74. data/src/cxx_supportlib/ServerKit/Server.h +0 -6
  75. data/src/cxx_supportlib/Utils/AsyncSignalSafeUtils.h +2 -0
  76. data/src/cxx_supportlib/Utils/SpeedMeter.h +0 -3
  77. data/src/cxx_supportlib/oxt/implementation.cpp +11 -0
  78. data/src/cxx_supportlib/oxt/system_calls.cpp +10 -3
  79. data/src/cxx_supportlib/oxt/thread.hpp +1 -1
  80. data/src/cxx_supportlib/vendor-modified/boost/asio/as_tuple.hpp +35 -9
  81. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_immediate_executor.hpp +3 -2
  82. data/src/cxx_supportlib/vendor-modified/boost/asio/associator.hpp +1 -1
  83. data/src/cxx_supportlib/vendor-modified/boost/asio/async_result.hpp +74 -68
  84. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_datagram_socket.hpp +11 -11
  85. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_deadline_timer.hpp +2 -2
  86. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_random_access_file.hpp +2 -2
  87. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_raw_socket.hpp +10 -10
  88. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_readable_pipe.hpp +1 -1
  89. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_seq_packet_socket.hpp +3 -3
  90. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_serial_port.hpp +2 -2
  91. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_signal_set.hpp +1 -1
  92. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket.hpp +2 -2
  93. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_acceptor.hpp +9 -9
  94. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_file.hpp +2 -2
  95. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_socket.hpp +6 -6
  96. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_waitable_timer.hpp +2 -2
  97. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_writable_pipe.hpp +1 -1
  98. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_allocator.hpp +88 -22
  99. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_cancellation_slot.hpp +91 -22
  100. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_executor.hpp +105 -23
  101. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_immediate_executor.hpp +90 -23
  102. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +2 -2
  103. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer_registration.hpp +1 -1
  104. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_after.hpp +303 -0
  105. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_at.hpp +296 -0
  106. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/impl/co_composed.hpp → co_composed.hpp} +208 -61
  107. data/src/cxx_supportlib/vendor-modified/boost/asio/completion_condition.hpp +49 -0
  108. data/src/cxx_supportlib/vendor-modified/boost/asio/compose.hpp +10 -201
  109. data/src/cxx_supportlib/vendor-modified/boost/asio/composed.hpp +415 -0
  110. data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +214 -48
  111. data/src/cxx_supportlib/vendor-modified/boost/asio/coroutine.hpp +3 -4
  112. data/src/cxx_supportlib/vendor-modified/boost/asio/default_completion_token.hpp +91 -0
  113. data/src/cxx_supportlib/vendor-modified/boost/asio/deferred.hpp +9 -5
  114. data/src/cxx_supportlib/vendor-modified/boost/asio/detached.hpp +2 -2
  115. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffered_stream_storage.hpp +1 -1
  116. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_message.hpp → detail/completion_message.hpp} +14 -16
  117. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_payload.hpp → detail/completion_payload.hpp} +30 -32
  118. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_handler.hpp → detail/completion_payload_handler.hpp} +15 -13
  119. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +26 -32
  120. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/deadline_timer_service.hpp +5 -1
  121. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_alloc_helpers.hpp +14 -118
  122. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/descriptor_ops.ipp +36 -33
  123. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.ipp +1 -1
  124. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_descriptor_service.ipp +7 -5
  125. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_socket_service_base.ipp +6 -4
  126. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +44 -35
  127. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_select_interrupter.ipp +1 -1
  128. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/initiation_base.hpp +64 -0
  129. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/memory.hpp +0 -11
  130. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_descriptor_service.hpp +20 -16
  131. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_send_op.hpp +0 -1
  132. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service.hpp +4 -4
  133. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service_base.hpp +23 -18
  134. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/recycling_allocator.hpp +9 -0
  135. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_endpoint_op.hpp +1 -1
  136. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_query_op.hpp +1 -1
  137. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_info_base.hpp +11 -1
  138. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timed_cancel_op.hpp +363 -0
  139. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wrapped_handler.hpp +29 -51
  140. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/allocator.hpp +1 -1
  141. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking.hpp +1 -1
  142. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking_adaptation.hpp +1 -1
  143. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context.hpp +1 -1
  144. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/mapping.hpp +1 -1
  145. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/occupancy.hpp +1 -1
  146. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/outstanding_work.hpp +1 -1
  147. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/relationship.hpp +1 -1
  148. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_channel.hpp +2 -1
  149. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_concurrent_channel.hpp +2 -1
  150. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_composed.hpp +2 -114
  151. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_receive_op.hpp +2 -3
  152. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_functions.hpp +27 -19
  153. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_op.hpp +0 -1
  154. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_service.hpp +17 -15
  155. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_promise_allocator.hpp +2 -3
  156. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/impl/channel_service.hpp +4 -2
  157. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/partial_promise.hpp +3 -5
  158. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/as_single.hpp +12 -7
  159. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/coro.hpp +1 -1
  160. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/parallel_group.hpp +38 -40
  161. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/promise.hpp +3 -3
  162. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_coro.hpp +5 -5
  163. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_promise.hpp +1 -1
  164. data/src/cxx_supportlib/vendor-modified/boost/asio/immediate.hpp +144 -0
  165. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/append.hpp +14 -7
  166. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/as_tuple.hpp +45 -14
  167. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp +3 -3
  168. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_after.hpp +270 -0
  169. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_at.hpp +270 -0
  170. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/co_spawn.hpp +8 -0
  171. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect.hpp +60 -166
  172. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/consign.hpp +14 -7
  173. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/detached.hpp +2 -2
  174. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/prepend.hpp +14 -7
  175. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read.hpp +26 -177
  176. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_at.hpp +16 -82
  177. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +13 -286
  178. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/redirect_error.hpp +55 -18
  179. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/spawn.hpp +1 -1
  180. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write.hpp +26 -185
  181. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write_at.hpp +16 -87
  182. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context_strand.hpp +5 -5
  183. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +6 -6
  184. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/socket_option.hpp +1 -1
  185. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.ipp +1 -1
  186. data/src/cxx_supportlib/vendor-modified/boost/asio/placeholders.hpp +12 -6
  187. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_descriptor.hpp +1 -1
  188. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_stream_descriptor.hpp +2 -2
  189. data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +127 -28
  190. data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +70 -20
  191. data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +114 -36
  192. data/src/cxx_supportlib/vendor-modified/boost/asio/redirect_error.hpp +43 -3
  193. data/src/cxx_supportlib/vendor-modified/boost/asio/registered_buffer.hpp +2 -2
  194. data/src/cxx_supportlib/vendor-modified/boost/asio/spawn.hpp +0 -1
  195. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/openssl_init.ipp +2 -2
  196. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +10 -7
  197. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +5 -5
  198. data/src/cxx_supportlib/vendor-modified/boost/asio/this_coro.hpp +2 -2
  199. data/src/cxx_supportlib/vendor-modified/boost/asio/use_awaitable.hpp +2 -2
  200. data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +1 -1
  201. data/src/cxx_supportlib/vendor-modified/boost/asio/uses_executor.hpp +1 -1
  202. data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +1 -1
  203. data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +147 -35
  204. data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +74 -22
  205. data/src/cxx_supportlib/vendor-modified/boost/asio.hpp +6 -0
  206. data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +4 -1
  207. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/futex.hpp +42 -11
  208. data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +15 -37
  209. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +8 -8
  210. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +1 -1
  211. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +151 -10
  212. data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +11 -9
  213. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +611 -102
  214. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +1 -1
  215. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +47 -47
  216. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +25 -24
  217. data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocation_type.hpp +7 -7
  218. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_list.hpp +2 -2
  219. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_slist.hpp +2 -2
  220. data/src/cxx_supportlib/vendor-modified/boost/container/detail/construct_in_place.hpp +35 -1
  221. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +14 -14
  222. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +1 -1
  223. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +55 -23
  224. data/src/cxx_supportlib/vendor-modified/boost/container/detail/function_detector.hpp +1 -1
  225. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_container.hpp +2 -2
  226. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_contiguous_container.hpp +1 -1
  227. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_pair.hpp +4 -4
  228. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +8 -8
  229. data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +9 -9
  230. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +4 -4
  231. data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +96 -10
  232. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +19 -4
  233. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +1 -1
  234. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +17 -17
  235. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common.hpp +1 -1
  236. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +2 -2
  237. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_resource.hpp +4 -4
  238. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +86 -52
  239. data/src/cxx_supportlib/vendor-modified/boost/container/detail/version_type.hpp +4 -4
  240. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +12 -0
  241. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +145 -65
  242. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +105 -22
  243. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +2 -2
  244. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +30 -22
  245. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +19 -2
  246. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +1 -1
  247. data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +15 -8
  248. data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +6 -5
  249. data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +15 -15
  250. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +1 -1
  251. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +1 -1
  252. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +3 -3
  253. data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +1 -1
  254. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +2 -2
  255. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +31 -24
  256. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +45 -43
  257. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +45 -33
  258. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +5 -7
  259. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +55 -47
  260. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator.hpp +3 -3
  261. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +222 -73
  262. data/src/cxx_supportlib/vendor-modified/boost/core/detail/minstd_rand.hpp +58 -0
  263. data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +13 -13
  264. data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +53 -5
  265. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +1 -0
  266. data/src/cxx_supportlib/vendor-modified/boost/core/pointer_in_range.hpp +49 -0
  267. data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +2 -0
  268. data/src/cxx_supportlib/vendor-modified/boost/core/type_name.hpp +7 -2
  269. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +22 -34
  270. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +141 -38
  271. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/algorithm.hpp +8 -8
  272. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash.hpp +1 -1
  273. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +8 -6
  274. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_traits.hpp +18 -18
  275. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +22 -17
  276. data/src/cxx_supportlib/vendor-modified/boost/libs/random/src/random_device.cpp +3 -1
  277. data/src/cxx_supportlib/vendor-modified/boost/move/detail/config_begin.hpp +0 -1
  278. data/src/cxx_supportlib/vendor-modified/boost/move/detail/launder.hpp +53 -0
  279. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +9 -1
  280. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +6 -1
  281. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
  282. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/integral_wrapper.hpp +2 -1
  283. data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
  284. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/requires_cxx11.hpp +1 -1
  285. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp +4 -1
  286. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category_message.hpp +13 -1
  287. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +13 -1
  288. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map_fwd.hpp +15 -0
  289. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +13 -1
  290. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set_fwd.hpp +15 -0
  291. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +22 -6
  292. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +38 -10
  293. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +111 -2
  294. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/cumulative_stats.hpp +177 -0
  295. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +11 -1
  296. data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +33 -7
  297. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +12 -0
  298. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map_fwd.hpp +15 -0
  299. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +12 -0
  300. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set_fwd.hpp +14 -0
  301. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +19 -0
  302. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +12 -0
  303. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map_fwd.hpp +15 -0
  304. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +12 -0
  305. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set_fwd.hpp +14 -0
  306. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +17 -0
  307. data/src/cxx_supportlib/vendor-modified/boost/utility/detail/minstd_rand.hpp +1 -43
  308. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  309. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +8 -0
  310. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +12 -0
  311. data/src/nginx_module/Configuration.c +7 -2
  312. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +6 -0
  313. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +15 -0
  314. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +14 -0
  315. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +3 -0
  316. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +4 -0
  317. data/src/ruby_native_extension/passenger_native_support.c +1 -0
  318. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +5 -0
  319. data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +6 -2
  320. data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +10 -0
  321. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +12 -4
  322. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +5 -0
  323. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +32 -5
  324. data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -0
  325. data/src/ruby_supportlib/phusion_passenger/rack/handler.rb +73 -0
  326. data/src/ruby_supportlib/phusion_passenger/rack_handler.rb +30 -56
  327. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +5 -0
  328. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +1 -0
  329. data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +0 -4
  330. data/src/ruby_supportlib/phusion_passenger/utils/json.rb +7 -198
  331. data/src/ruby_supportlib/phusion_passenger/utils/strscan.rb +67 -0
  332. data/src/ruby_supportlib/phusion_passenger/utils.rb +5 -15
  333. data/src/ruby_supportlib/phusion_passenger.rb +5 -5
  334. metadata +39 -10
@@ -54,7 +54,7 @@
54
54
  #include <boost/move/utility_core.hpp>
55
55
  #include <boost/move/iterator.hpp>
56
56
  #include <boost/move/adl_move_swap.hpp>
57
- #include <boost/move/detail/force_ptr.hpp>
57
+ #include <boost/move/detail/launder.hpp>
58
58
  // move/detail
59
59
  #include <boost/move/detail/move_helpers.hpp>
60
60
  #include <boost/move/detail/iterator_to_raw_pointer.hpp>
@@ -166,19 +166,19 @@ struct node
166
166
  # endif
167
167
 
168
168
  inline T &get_data()
169
- { return *boost::move_detail::force_ptr<T*>(this->m_storage.data); }
169
+ { return *boost::move_detail::launder_cast<T*>(&this->m_storage); }
170
170
 
171
171
  inline const T &get_data() const
172
- { return *boost::move_detail::force_ptr<const T*>(this->m_storage.data); }
172
+ { return *boost::move_detail::launder_cast<const T*>(&this->m_storage); }
173
173
 
174
174
  inline T *get_data_ptr()
175
- { return boost::move_detail::force_ptr<T*>(this->m_storage.data); }
175
+ { return boost::move_detail::launder_cast<T*>(&this->m_storage); }
176
176
 
177
177
  inline const T *get_data_ptr() const
178
- { return boost::move_detail::force_ptr<const T*>(this->m_storage.data); }
178
+ { return boost::move_detail::launder_cast<const T*>(&this->m_storage); }
179
179
 
180
180
  inline ~node()
181
- { boost::move_detail::force_ptr<T*>(this->m_storage.data)->~T(); }
181
+ { boost::move_detail::launder_cast<T*>(&this->m_storage)->~T(); }
182
182
 
183
183
  #if defined(BOOST_CONTAINER_DISABLE_ALIASING_WARNING)
184
184
  #pragma GCC diagnostic pop
@@ -214,7 +214,7 @@ struct index_traits
214
214
  typedef typename index_type::const_iterator const_index_iterator;
215
215
  typedef typename index_type::size_type size_type;
216
216
 
217
- static const size_type ExtraPointers = 3;
217
+ BOOST_STATIC_CONSTEXPR size_type ExtraPointers = 3;
218
218
  //Stable vector stores metadata at the end of the index (node_base_ptr vector) with additional 3 pointers:
219
219
  // back() is this->index.back() - ExtraPointers;
220
220
  // end node index is *(this->index.end() - 3)
@@ -598,7 +598,7 @@ class stable_vector
598
598
  #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
599
599
  private:
600
600
  BOOST_COPYABLE_AND_MOVABLE(stable_vector)
601
- static const size_type ExtraPointers = index_traits_type::ExtraPointers;
601
+ BOOST_STATIC_CONSTEXPR size_type ExtraPointers = index_traits_type::ExtraPointers;
602
602
 
603
603
  class insert_rollback;
604
604
  friend class insert_rollback;
@@ -872,31 +872,14 @@ class stable_vector
872
872
  BOOST_NOEXCEPT_IF(allocator_traits_type::propagate_on_container_move_assignment::value
873
873
  || allocator_traits_type::is_always_equal::value)
874
874
  {
875
- //for move constructor, no aliasing (&x != this) is assumed.
876
875
  if (BOOST_LIKELY(this != &x)) {
877
- node_allocator_type &this_alloc = this->priv_node_alloc();
878
- node_allocator_type &x_alloc = x.priv_node_alloc();
879
- const bool propagate_alloc = allocator_traits_type::
880
- propagate_on_container_move_assignment::value;
881
- dtl::bool_<propagate_alloc> flag;
882
- const bool allocators_equal = this_alloc == x_alloc; (void)allocators_equal;
883
- //Resources can be transferred if both allocators are
884
- //going to be equal after this function (either propagated or already equal)
885
- if(propagate_alloc || allocators_equal){
886
- BOOST_CONTAINER_STABLE_VECTOR_CHECK_INVARIANT
887
- //Destroy objects but retain memory in case x reuses it in the future
888
- this->clear();
889
- //Move allocator if needed
890
- dtl::move_alloc(this_alloc, x_alloc, flag);
891
- //Take resources
892
- this->index.swap(x.index);
893
- this->priv_swap_members(x);
894
- }
895
- //Else do a one by one move
896
- else{
897
- this->assign( boost::make_move_iterator(x.begin())
898
- , boost::make_move_iterator(x.end()));
899
- }
876
+ //We know resources can be transferred at comiple time if both allocators are
877
+ //always equal or the allocator is going to be propagated
878
+ const bool can_steal_resources_alloc
879
+ = allocator_traits_type::propagate_on_container_move_assignment::value
880
+ || allocator_traits_type::is_always_equal::value;
881
+ dtl::bool_<can_steal_resources_alloc> flag;
882
+ this->priv_move_assign(boost::move(x), flag);
900
883
  }
901
884
  return *this;
902
885
  }
@@ -1852,6 +1835,35 @@ class stable_vector
1852
1835
  #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
1853
1836
  private:
1854
1837
 
1838
+ void priv_move_assign(BOOST_RV_REF(stable_vector) x, dtl::bool_<true> /*steal_resources*/)
1839
+ {
1840
+ //Resources can be transferred if both allocators are
1841
+ //going to be equal after this function (either propagated or already equal)
1842
+ BOOST_CONTAINER_STABLE_VECTOR_CHECK_INVARIANT
1843
+ //Destroy objects but retain memory in case x reuses it in the future
1844
+ this->clear();
1845
+ //Move allocator if needed
1846
+ dtl::bool_<allocator_traits_type::
1847
+ propagate_on_container_move_assignment::value> flag;
1848
+ dtl::move_alloc(this->priv_node_alloc(), x.priv_node_alloc(), flag);
1849
+
1850
+ //Take resources
1851
+ this->index = boost::move(x.index); //this also moves the vector's allocator if needed
1852
+ this->priv_swap_members(x);
1853
+ }
1854
+
1855
+ void priv_move_assign(BOOST_RV_REF(stable_vector) x, dtl::bool_<false> /*steal_resources*/)
1856
+ {
1857
+ //We can't guarantee a compile-time equal allocator or propagation so fallback to runtime
1858
+ //Resources can be transferred if both allocators are equal
1859
+ if (this->priv_node_alloc() == x.priv_node_alloc()) {
1860
+ this->priv_move_assign(boost::move(x), dtl::true_());
1861
+ }
1862
+ else {
1863
+ this->assign(boost::make_move_iterator(x.begin()), boost::make_move_iterator(x.end()));
1864
+ }
1865
+ }
1866
+
1855
1867
  bool priv_in_range(const_iterator pos) const
1856
1868
  {
1857
1869
  return (this->begin() <= pos) && (pos < this->end());
@@ -2243,7 +2255,7 @@ struct has_trivial_destructor_after_move<boost::container::stable_vector<T, Allo
2243
2255
  {
2244
2256
  typedef typename boost::container::stable_vector<T, Allocator>::allocator_type allocator_type;
2245
2257
  typedef typename ::boost::container::allocator_traits<allocator_type>::pointer pointer;
2246
- static const bool value = ::boost::has_trivial_destructor_after_move<allocator_type>::value &&
2258
+ BOOST_STATIC_CONSTEXPR bool value = ::boost::has_trivial_destructor_after_move<allocator_type>::value &&
2247
2259
  ::boost::has_trivial_destructor_after_move<pointer>::value;
2248
2260
  };
2249
2261
 
@@ -22,6 +22,7 @@
22
22
  #include <boost/container/detail/config_begin.hpp>
23
23
  #include <boost/container/detail/workaround.hpp>
24
24
  #include <boost/container/detail/type_traits.hpp>
25
+ #include <boost/move/detail/launder.hpp>
25
26
  #include <boost/container/vector.hpp>
26
27
 
27
28
  #include <cstddef>
@@ -63,12 +64,9 @@ class static_storage_allocator
63
64
  { return *this; }
64
65
 
65
66
  inline T* internal_storage() const BOOST_NOEXCEPT_OR_NOTHROW
66
- { return const_cast<T*>(static_cast<const T*>(static_cast<const void*>(storage.data))); }
67
+ { return move_detail::launder_cast<T*>(&storage); }
67
68
 
68
- inline T* internal_storage() BOOST_NOEXCEPT_OR_NOTHROW
69
- { return static_cast<T*>(static_cast<void*>(storage.data)); }
70
-
71
- static const std::size_t internal_capacity = N;
69
+ BOOST_STATIC_CONSTEXPR std::size_t internal_capacity = N;
72
70
 
73
71
  std::size_t max_size() const
74
72
  { return N; }
@@ -88,7 +86,7 @@ class static_storage_allocator
88
86
 
89
87
  private:
90
88
  BOOST_CONTAINER_STATIC_ASSERT_MSG(!InplaceAlignment || (InplaceAlignment & (InplaceAlignment-1)) == 0, "Alignment option must be zero or power of two");
91
- static const std::size_t final_alignment = InplaceAlignment ? InplaceAlignment : dtl::alignment_of<T>::value;
89
+ BOOST_STATIC_CONSTEXPR std::size_t final_alignment = InplaceAlignment ? InplaceAlignment : dtl::alignment_of<T>::value;
92
90
  typename dtl::aligned_storage<sizeof(T)*N, final_alignment>::type storage;
93
91
  };
94
92
 
@@ -190,7 +188,7 @@ public:
190
188
  typedef typename base_t::const_reverse_iterator const_reverse_iterator;
191
189
 
192
190
  //! @brief The capacity/max size of the container
193
- static const size_type static_capacity = Capacity;
191
+ BOOST_STATIC_CONSTEXPR size_type static_capacity = Capacity;
194
192
 
195
193
  //! @brief Constructs an empty static_vector.
196
194
  //!
@@ -43,7 +43,7 @@
43
43
  //intrusive
44
44
  #include <boost/intrusive/pointer_traits.hpp>
45
45
  #include <boost/intrusive/detail/hash_combine.hpp>
46
- #include <boost/move/detail/force_ptr.hpp>
46
+ #include <boost/move/detail/launder.hpp>
47
47
  //move
48
48
  #include <boost/move/utility_core.hpp>
49
49
  #include <boost/move/adl_move_swap.hpp>
@@ -192,13 +192,13 @@ class basic_string_base
192
192
  <sizeof(long_t), dtl::alignment_of<long_t>::value>::type long_raw_t;
193
193
 
194
194
  protected:
195
- static const size_type MinInternalBufferChars = 8;
196
- static const size_type AlignmentOfValueType =
195
+ BOOST_STATIC_CONSTEXPR size_type MinInternalBufferChars = 8;
196
+ BOOST_STATIC_CONSTEXPR size_type AlignmentOfValueType =
197
197
  alignment_of<value_type>::value;
198
- static const size_type ShortDataOffset = ((sizeof(short_header)-1)/AlignmentOfValueType+1)*AlignmentOfValueType;
199
- static const size_type ZeroCostInternalBufferChars =
198
+ BOOST_STATIC_CONSTEXPR size_type ShortDataOffset = ((sizeof(short_header)-1)/AlignmentOfValueType+1)*AlignmentOfValueType;
199
+ BOOST_STATIC_CONSTEXPR size_type ZeroCostInternalBufferChars =
200
200
  (sizeof(long_t) - ShortDataOffset)/sizeof(value_type);
201
- static const size_type UnalignedFinalInternalBufferChars =
201
+ BOOST_STATIC_CONSTEXPR size_type UnalignedFinalInternalBufferChars =
202
202
  (ZeroCostInternalBufferChars > MinInternalBufferChars) ?
203
203
  ZeroCostInternalBufferChars : MinInternalBufferChars;
204
204
 
@@ -226,7 +226,7 @@ class basic_string_base
226
226
  {
227
227
  inline void init()
228
228
  {
229
- short_t &s = *::new(this->m_repr.data) short_t;
229
+ short_t &s = *::new(&this->m_repr) short_t;
230
230
  s.h.is_short = 1;
231
231
  s.h.length = 0;
232
232
  }
@@ -241,16 +241,16 @@ class basic_string_base
241
241
  { this->init(); }
242
242
 
243
243
  inline const short_t *pshort_repr() const
244
- { return move_detail::force_ptr<const short_t*>(m_repr.data); }
244
+ { return move_detail::launder_cast<const short_t*>(&m_repr); }
245
245
 
246
246
  inline const long_t *plong_repr() const
247
- { return move_detail::force_ptr<const long_t*>(m_repr.data); }
247
+ { return move_detail::launder_cast<const long_t*>(&m_repr); }
248
248
 
249
249
  inline short_t *pshort_repr()
250
- { return move_detail::force_ptr<short_t*>(m_repr.data); }
250
+ { return move_detail::launder_cast<short_t*>(&m_repr); }
251
251
 
252
252
  inline long_t *plong_repr()
253
- { return move_detail::force_ptr<long_t*>(m_repr.data); }
253
+ { return move_detail::launder_cast<long_t*>(&m_repr); }
254
254
 
255
255
  repr_t m_repr;
256
256
  } members_;
@@ -261,11 +261,11 @@ class basic_string_base
261
261
  inline allocator_type &alloc()
262
262
  { return members_; }
263
263
 
264
- static const size_type InternalBufferChars = (sizeof(repr_t) - ShortDataOffset)/sizeof(value_type);
264
+ BOOST_STATIC_CONSTEXPR size_type InternalBufferChars = (sizeof(repr_t) - ShortDataOffset)/sizeof(value_type);
265
265
 
266
266
  private:
267
267
 
268
- static const size_type MinAllocation = InternalBufferChars*2;
268
+ BOOST_STATIC_CONSTEXPR size_type MinAllocation = InternalBufferChars*2;
269
269
 
270
270
  protected:
271
271
  inline bool is_short() const
@@ -280,7 +280,7 @@ class basic_string_base
280
280
 
281
281
  inline short_t *construct_short()
282
282
  {
283
- short_t *ps = ::new(this->members_.m_repr.data) short_t;
283
+ short_t *ps = ::new(&this->members_.m_repr) short_t;
284
284
  ps->h.is_short = 1;
285
285
  return ps;
286
286
  }
@@ -302,7 +302,7 @@ class basic_string_base
302
302
 
303
303
  inline long_t *construct_long()
304
304
  {
305
- long_t *pl = ::new(this->members_.m_repr.data) long_t;
305
+ long_t *pl = ::new(&this->members_.m_repr) long_t;
306
306
  //is_short flag is written in the constructor
307
307
  return pl;
308
308
  }
@@ -469,7 +469,7 @@ class basic_string_base
469
469
  inline void priv_short_size(size_type sz)
470
470
  {
471
471
  typedef unsigned char uchar_type;
472
- static const uchar_type mask = uchar_type(uchar_type(-1) >> 1U);
472
+ BOOST_STATIC_CONSTEXPR uchar_type mask = uchar_type(uchar_type(-1) >> 1U);
473
473
  BOOST_ASSERT( sz <= mask );
474
474
  //Make -Wconversion happy
475
475
  this->members_.pshort_repr()->h.length = uchar_type(uchar_type(sz) & mask);
@@ -477,7 +477,7 @@ class basic_string_base
477
477
 
478
478
  inline void priv_long_size(size_type sz)
479
479
  {
480
- static const size_type mask = size_type(-1) >> 1U;
480
+ BOOST_STATIC_CONSTEXPR size_type mask = size_type(-1) >> 1U;
481
481
  BOOST_ASSERT( sz <= mask );
482
482
  //Make -Wconversion happy
483
483
  this->members_.plong_repr()->length = sz & mask;
@@ -566,7 +566,7 @@ class basic_string
566
566
  BOOST_COPYABLE_AND_MOVABLE(basic_string)
567
567
  typedef dtl::basic_string_base<typename real_allocator<CharT, Allocator>::type> base_t;
568
568
  typedef typename base_t::allocator_traits_type allocator_traits_type;
569
- static const typename base_t::size_type InternalBufferChars = base_t::InternalBufferChars;
569
+ BOOST_STATIC_CONSTEXPR typename base_t::size_type InternalBufferChars = base_t::InternalBufferChars;
570
570
 
571
571
  protected:
572
572
  // Allocator helper class to use a char_traits as a function object.
@@ -624,7 +624,7 @@ class basic_string
624
624
  typedef BOOST_CONTAINER_IMPDEF(const_pointer) const_iterator;
625
625
  typedef BOOST_CONTAINER_IMPDEF(boost::container::reverse_iterator<iterator>) reverse_iterator;
626
626
  typedef BOOST_CONTAINER_IMPDEF(boost::container::reverse_iterator<const_iterator>) const_reverse_iterator;
627
- static const size_type npos = size_type(-1);
627
+ BOOST_STATIC_CONSTEXPR size_type npos = size_type(-1);
628
628
 
629
629
  #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
630
630
  private:
@@ -913,26 +913,13 @@ class basic_string
913
913
  || allocator_traits_type::is_always_equal::value)
914
914
  {
915
915
  if (BOOST_LIKELY(this != &x)) {
916
- allocator_type &this_alloc = this->alloc();
917
- allocator_type &x_alloc = x.alloc();
918
- const bool propagate_alloc = allocator_traits_type::
919
- propagate_on_container_move_assignment::value;
920
- dtl::bool_<propagate_alloc> flag;
921
- const bool allocators_equal = this_alloc == x_alloc; (void)allocators_equal;
922
- //Resources can be transferred if both allocators are
923
- //going to be equal after this function (either propagated or already equal)
924
- if(propagate_alloc || allocators_equal){
925
- //Destroy objects but retain memory in case x reuses it in the future
926
- this->clear();
927
- //Move allocator if needed
928
- dtl::move_alloc(this_alloc, x_alloc, flag);
929
- //Nothrow swap
930
- this->swap_data(x);
931
- }
932
- //Else do a one by one move
933
- else{
934
- this->assign( x.begin(), x.end());
935
- }
916
+ //We know resources can be transferred at comiple time if both allocators are
917
+ //always equal or the allocator is going to be propagated
918
+ const bool can_steal_resources_alloc
919
+ = allocator_traits_type::propagate_on_container_move_assignment::value
920
+ || allocator_traits_type::is_always_equal::value;
921
+ dtl::bool_<can_steal_resources_alloc> flag;
922
+ this->priv_move_assign(boost::move(x), flag);
936
923
  }
937
924
  return *this;
938
925
  }
@@ -2908,6 +2895,30 @@ class basic_string
2908
2895
 
2909
2896
  #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
2910
2897
  private:
2898
+ void priv_move_assign(BOOST_RV_REF(basic_string) x, dtl::bool_<true> /*steal_resources*/)
2899
+ {
2900
+ //Destroy objects but retain memory in case x reuses it in the future
2901
+ this->clear();
2902
+ //Move allocator if needed
2903
+ dtl::bool_<allocator_traits_type::
2904
+ propagate_on_container_move_assignment::value> flag;
2905
+ dtl::move_alloc(this->alloc(), x.alloc(), flag);
2906
+ //Nothrow swap
2907
+ this->swap_data(x);
2908
+ }
2909
+
2910
+ void priv_move_assign(BOOST_RV_REF(basic_string) x, dtl::bool_<false> /*steal_resources*/)
2911
+ {
2912
+ //We can't guarantee a compile-time equal allocator or propagation so fallback to runtime
2913
+ //Resources can be transferred if both allocators are equal
2914
+ if (this->alloc() == x.alloc()) {
2915
+ this->priv_move_assign(boost::move(x), dtl::true_());
2916
+ }
2917
+ else {
2918
+ this->assign(x.begin(), x.end());
2919
+ }
2920
+ }
2921
+
2911
2922
  bool priv_reserve_no_null_end(size_type res_arg)
2912
2923
  {
2913
2924
  if (res_arg > this->max_size()){
@@ -3074,20 +3085,16 @@ wstring;
3074
3085
 
3075
3086
  #else
3076
3087
 
3077
- template <class CharT, class Traits, class Allocator>
3078
- const typename basic_string<CharT,Traits,Allocator>::size_type
3079
- basic_string<CharT,Traits,Allocator>::npos;
3080
-
3081
3088
  template<class S>
3082
3089
  struct is_string
3083
3090
  {
3084
- static const bool value = false;
3091
+ BOOST_STATIC_CONSTEXPR bool value = false;
3085
3092
  };
3086
3093
 
3087
3094
  template<class C, class T, class A>
3088
3095
  struct is_string< basic_string<C, T, A> >
3089
3096
  {
3090
- static const bool value = true;
3097
+ BOOST_STATIC_CONSTEXPR bool value = true;
3091
3098
  };
3092
3099
 
3093
3100
  #endif
@@ -3572,8 +3579,9 @@ struct has_trivial_destructor_after_move<boost::container::basic_string<C, T, Al
3572
3579
  {
3573
3580
  typedef typename boost::container::basic_string<C, T, Allocator>::allocator_type allocator_type;
3574
3581
  typedef typename ::boost::container::allocator_traits<allocator_type>::pointer pointer;
3575
- static const bool value = ::boost::has_trivial_destructor_after_move<allocator_type>::value &&
3576
- ::boost::has_trivial_destructor_after_move<pointer>::value;
3582
+ BOOST_STATIC_CONSTEXPR bool value =
3583
+ ::boost::has_trivial_destructor_after_move<allocator_type>::value &&
3584
+ ::boost::has_trivial_destructor_after_move<pointer>::value;
3577
3585
  };
3578
3586
 
3579
3587
  }
@@ -58,7 +58,7 @@ namespace container {
58
58
  //! to detect if a type should be constructed with suffix or prefix allocator arguments.
59
59
  template <class T>
60
60
  struct constructible_with_allocator_suffix
61
- { static const bool value = false; };
61
+ { BOOST_STATIC_CONSTEXPR bool value = false; };
62
62
 
63
63
  //! <b>Remark</b>: if a specialization constructible_with_allocator_prefix<X>::value is true, indicates that T may be constructed
64
64
  //! with allocator_arg and T::allocator_type as its first two constructor arguments.
@@ -108,7 +108,7 @@ struct constructible_with_allocator_suffix
108
108
  //! to detect if a type should be constructed with suffix or prefix allocator arguments.
109
109
  template <class T>
110
110
  struct constructible_with_allocator_prefix
111
- { static const bool value = false; };
111
+ { BOOST_STATIC_CONSTEXPR bool value = false; };
112
112
 
113
113
  #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
114
114
 
@@ -142,7 +142,7 @@ struct uses_allocator_imp
142
142
  static Allocator alloc; // Declared but not defined
143
143
 
144
144
  public:
145
- static const bool value = sizeof(test<T>(alloc)) == sizeof(yes_type);
145
+ BOOST_STATIC_CONSTEXPR bool value = sizeof(test<T>(alloc)) == sizeof(yes_type);
146
146
  };
147
147
 
148
148
  } //namespace dtl {