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
@@ -23,6 +23,13 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+
27
+ #ifndef _PASSENGER_APPLICATION_POOL_GROUP_MISCELLANEOUS_CPP_
28
+ #define _PASSENGER_APPLICATION_POOL_GROUP_MISCELLANEOUS_CPP_
29
+
30
+ #ifdef INTELLISENSE
31
+ #include <Core/ApplicationPool/Pool.h>
32
+ #endif
26
33
  #include <Core/ApplicationPool/Group.h>
27
34
 
28
35
  /*************************************************************************
@@ -65,3 +72,5 @@ Group::authorizeByApiKey(const ApiKey &key) const {
65
72
 
66
73
  } // namespace ApplicationPool2
67
74
  } // namespace Passenger
75
+
76
+ #endif // _PASSENGER_APPLICATION_POOL_GROUP_MISCELLANEOUS_CPP_
@@ -23,6 +23,13 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+
27
+ #ifndef _PASSENGER_APPLICATION_POOL_GROUP_OUT_OF_BAND_WORK_CPP_
28
+ #define _PASSENGER_APPLICATION_POOL_GROUP_OUT_OF_BAND_WORK_CPP_
29
+
30
+ #ifdef INTELLISENSE
31
+ #include <Core/ApplicationPool/Pool.h>
32
+ #endif
26
33
  #include <Core/ApplicationPool/Group.h>
27
34
  #include <IOTools/MessageSerialization.h>
28
35
 
@@ -322,3 +329,5 @@ Group::requestOOBW(const ProcessPtr &process) {
322
329
 
323
330
  } // namespace ApplicationPool2
324
331
  } // namespace Passenger
332
+
333
+ #endif // _PASSENGER_APPLICATION_POOL_GROUP_OUT_OF_BAND_WORK_CPP_
@@ -23,6 +23,12 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_GROUP_PROCESS_LIST_MANAGEMENT_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_GROUP_PROCESS_LIST_MANAGEMENT_CPP_
28
+
29
+ #ifdef INTELLISENSE
30
+ #include <Core/ApplicationPool/Pool.h>
31
+ #endif
26
32
  #include <Core/ApplicationPool/Group.h>
27
33
 
28
34
  /*************************************************************************
@@ -57,72 +63,75 @@ Group::findProcessWithStickySessionId(unsigned int id) const {
57
63
  return NULL;
58
64
  }
59
65
 
66
+ /**
67
+ * Return the process with the given sticky session ID if it exists.
68
+ * If not, then find the "best" enabled process to route a request to,
69
+ * according to the same criteria documented for findBestProcess().
70
+ *
71
+ * - If the process with the given sticky session ID exists, then always
72
+ * returns that process. Meaning that this process could be `!canBeRoutedTo()`.
73
+ * - If there is no process that can be routed to, then returns nullptr.
74
+ */
60
75
  Process *
61
- Group::findProcessWithStickySessionIdOrLowestBusyness(unsigned int id) const {
62
- int leastBusyProcessIndex = -1;
63
- int lowestBusyness = 0;
64
- unsigned int i, size = enabledProcessBusynessLevels.size();
65
- const int *enabledProcessBusynessLevels = &this->enabledProcessBusynessLevels[0];
66
-
67
- for (i = 0; i < size; i++) {
68
- Process *process = enabledProcesses[i].get();
76
+ Group::findBestProcessPreferringStickySessionId(unsigned int id) const {
77
+ Process *bestProcess = nullptr;
78
+ ProcessList::const_iterator it;
79
+ ProcessList::const_iterator end = enabledProcesses.end();
80
+
81
+ for (it = enabledProcesses.begin(); it != end; it++) {
82
+ Process *process = it->get();
69
83
  if (process->getStickySessionId() == id) {
70
84
  return process;
71
- } else if (leastBusyProcessIndex == -1 || enabledProcessBusynessLevels[i] < lowestBusyness) {
72
- leastBusyProcessIndex = i;
73
- lowestBusyness = enabledProcessBusynessLevels[i];
85
+ } else if (!process->isTotallyBusy()
86
+ && (
87
+ bestProcess == nullptr
88
+ || process->generation > bestProcess->generation
89
+ || (process->generation == bestProcess->generation && process->spawnStartTime < bestProcess->spawnStartTime)
90
+ || (process->generation == bestProcess->generation && process->spawnStartTime == bestProcess->spawnStartTime && process->busyness() < bestProcess->busyness())
91
+ )
92
+ ) {
93
+ bestProcess = process;
74
94
  }
75
95
  }
76
96
 
77
- if (leastBusyProcessIndex == -1) {
78
- return NULL;
79
- } else {
80
- return enabledProcesses[leastBusyProcessIndex].get();
81
- }
97
+ return bestProcess;
82
98
  }
83
99
 
100
+ /**
101
+ * Given a ProcessList, find the "best" process to route a request to.
102
+ * At the moment, "best" is defined as the process with the highest generation,
103
+ * lowest start time, and lowest busyness, in that order of priority.
104
+ *
105
+ * If there is no process that can be routed to, then returns nullptr.
106
+ *
107
+ * @post result != nullptr || result.canBeRoutedTo()
108
+ */
84
109
  Process *
85
- Group::findProcessWithLowestBusyness(const ProcessList &processes) const {
110
+ Group::findBestProcess(const ProcessList &processes) const {
86
111
  if (processes.empty()) {
87
- return NULL;
112
+ return nullptr;
88
113
  }
89
114
 
90
- int lowestBusyness = -1;
91
- Process *leastBusyProcess = NULL;
115
+ Process *bestProcess = nullptr;
92
116
  ProcessList::const_iterator it;
93
117
  ProcessList::const_iterator end = processes.end();
94
- for (it = processes.begin(); it != end; it++) {
95
- Process *process = (*it).get();
96
- int busyness = process->busyness();
97
- if (lowestBusyness == -1 || lowestBusyness > busyness) {
98
- lowestBusyness = busyness;
99
- leastBusyProcess = process;
100
- }
101
- }
102
- return leastBusyProcess;
103
- }
104
118
 
105
- /**
106
- * Cache-optimized version of findProcessWithLowestBusyness() for the common case.
107
- */
108
- Process *
109
- Group::findEnabledProcessWithLowestBusyness() const {
110
- if (enabledProcesses.empty()) {
111
- return NULL;
112
- }
113
-
114
- int leastBusyProcessIndex = -1;
115
- int lowestBusyness = 0;
116
- unsigned int i, size = enabledProcessBusynessLevels.size();
117
- const int *enabledProcessBusynessLevels = &this->enabledProcessBusynessLevels[0];
119
+ for (it = processes.begin(); it != end; it++) {
120
+ Process *process = it->get();
118
121
 
119
- for (i = 0; i < size; i++) {
120
- if (leastBusyProcessIndex == -1 || enabledProcessBusynessLevels[i] < lowestBusyness) {
121
- leastBusyProcessIndex = i;
122
- lowestBusyness = enabledProcessBusynessLevels[i];
122
+ if (!process->isTotallyBusy()
123
+ && (
124
+ bestProcess == nullptr
125
+ || process->generation > bestProcess->generation
126
+ || (process->generation == bestProcess->generation && process->spawnStartTime < bestProcess->spawnStartTime)
127
+ || (process->generation == bestProcess->generation && process->spawnStartTime == bestProcess->spawnStartTime && process->busyness() < bestProcess->busyness())
128
+ )
129
+ ) {
130
+ bestProcess = process;
123
131
  }
124
132
  }
125
- return enabledProcesses[leastBusyProcessIndex].get();
133
+
134
+ return bestProcess;
126
135
  }
127
136
 
128
137
  /**
@@ -222,6 +231,7 @@ void
222
231
  Group::removeFromDisableWaitlist(const ProcessPtr &p, DisableResult result,
223
232
  boost::container::vector<Callback> &postLockActions)
224
233
  {
234
+ const deque<DisableWaiter> &disableWaitlist = this->disableWaitlist;
225
235
  deque<DisableWaiter>::const_iterator it, end = disableWaitlist.end();
226
236
  deque<DisableWaiter> newList;
227
237
  for (it = disableWaitlist.begin(); it != end; it++) {
@@ -233,7 +243,7 @@ Group::removeFromDisableWaitlist(const ProcessPtr &p, DisableResult result,
233
243
  newList.push_back(waiter);
234
244
  }
235
245
  }
236
- disableWaitlist = newList;
246
+ this->disableWaitlist = newList;
237
247
  }
238
248
 
239
249
  void
@@ -428,6 +438,7 @@ Group::attach(const ProcessPtr &process,
428
438
  /* Now that there are enough resources, relevant processes in
429
439
  * 'disableWaitlist' can be disabled.
430
440
  */
441
+ const deque<DisableWaiter> &disableWaitlist = this->disableWaitlist;
431
442
  deque<DisableWaiter>::const_iterator it, end = disableWaitlist.end();
432
443
  deque<DisableWaiter> newDisableWaitlist;
433
444
  for (it = disableWaitlist.begin(); it != end; it++) {
@@ -451,7 +462,7 @@ Group::attach(const ProcessPtr &process,
451
462
  newDisableWaitlist.push_back(waiter);
452
463
  }
453
464
  }
454
- disableWaitlist = newDisableWaitlist;
465
+ this->disableWaitlist = newDisableWaitlist;
455
466
 
456
467
  // Update GC sleep timer.
457
468
  wakeUpGarbageCollector();
@@ -616,3 +627,5 @@ Group::disable(const ProcessPtr &process, const DisableCallback &callback) {
616
627
 
617
628
  } // namespace ApplicationPool2
618
629
  } // namespace Passenger
630
+
631
+ #endif // _PASSENGER_APPLICATION_POOL_GROUP_PROCESS_LIST_MANAGEMENT_CPP_
@@ -23,7 +23,14 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_GROUP_SESSION_MANAGEMENT_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_GROUP_SESSION_MANAGEMENT_CPP_
28
+
29
+ #ifdef INTELLISENSE
30
+ #include <Core/ApplicationPool/Pool.h>
31
+ #endif
26
32
  #include <Core/ApplicationPool/Group.h>
33
+ #include <cassert>
27
34
 
28
35
  /*************************************************************************
29
36
  *
@@ -58,16 +65,17 @@ Group::RouteResult
58
65
  Group::route(const Options &options) const {
59
66
  if (OXT_LIKELY(enabledCount > 0)) {
60
67
  if (options.stickySessionId == 0) {
61
- Process *process = findEnabledProcessWithLowestBusyness();
62
- if (process->canBeRoutedTo()) {
68
+ Process *process = findBestProcess(enabledProcesses);
69
+ if (process != nullptr) {
70
+ assert(process->canBeRoutedTo());
63
71
  return RouteResult(process);
64
72
  } else {
65
73
  return RouteResult(NULL, true);
66
74
  }
67
75
  } else {
68
- Process *process = findProcessWithStickySessionIdOrLowestBusyness(
76
+ Process *process = findBestProcessPreferringStickySessionId(
69
77
  options.stickySessionId);
70
- if (process != NULL) {
78
+ if (process != nullptr) {
71
79
  if (process->canBeRoutedTo()) {
72
80
  return RouteResult(process);
73
81
  } else {
@@ -78,8 +86,9 @@ Group::route(const Options &options) const {
78
86
  }
79
87
  }
80
88
  } else {
81
- Process *process = findProcessWithLowestBusyness(disablingProcesses);
82
- if (process->canBeRoutedTo()) {
89
+ Process *process = findBestProcess(disablingProcesses);
90
+ if (process != nullptr) {
91
+ assert(process->canBeRoutedTo());
83
92
  return RouteResult(process);
84
93
  } else {
85
94
  return RouteResult(NULL, true);
@@ -304,9 +313,8 @@ Group::get(const Options &newOptions, const GetCallback &callback,
304
313
  assert(m_spawning || restarting() || poolAtFullCapacity());
305
314
 
306
315
  if (disablingCount > 0 && !restarting()) {
307
- Process *process = findProcessWithLowestBusyness(disablingProcesses);
308
- assert(process != NULL);
309
- if (!process->isTotallyBusy()) {
316
+ Process *process = findBestProcess(disablingProcesses);
317
+ if (process != nullptr && !process->isTotallyBusy()) {
310
318
  return newSession(process, newOptions.currentTime);
311
319
  }
312
320
  }
@@ -336,3 +344,5 @@ Group::get(const Options &newOptions, const GetCallback &callback,
336
344
 
337
345
  } // namespace ApplicationPool2
338
346
  } // namespace Passenger
347
+
348
+ #endif // _PASSENGER_APPLICATION_POOL_GROUP_SESSION_MANAGEMENT_CPP_
@@ -23,6 +23,12 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_GROUP_SPAWNING_AND_RESTARTING_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_GROUP_SPAWNING_AND_RESTARTING_CPP_
28
+
29
+ #ifdef INTELLISENSE
30
+ #include <Core/ApplicationPool/Pool.h>
31
+ #endif
26
32
  #include <Core/ApplicationPool/Group.h>
27
33
 
28
34
  /*************************************************************************
@@ -485,3 +491,5 @@ Group::allowSpawn() const {
485
491
 
486
492
  } // namespace ApplicationPool2
487
493
  } // namespace Passenger
494
+
495
+ #endif // _PASSENGER_APPLICATION_POOL_GROUP_SPAWNING_AND_RESTARTING_CPP_
@@ -23,6 +23,12 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_GROUP_STATE_INSPECTION_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_GROUP_STATE_INSPECTION_CPP_
28
+
29
+ #ifdef INTELLISENSE
30
+ #include <Core/ApplicationPool/Pool.h>
31
+ #endif
26
32
  #include <Core/ApplicationPool/Group.h>
27
33
  #include <FileTools/PathManip.h>
28
34
  #include <cassert>
@@ -303,3 +309,5 @@ Group::inspectConfigInAdminPanelFormat(Json::Value &result) const {
303
309
 
304
310
  } // namespace ApplicationPool2
305
311
  } // namespace Passenger
312
+
313
+ #endif // _PASSENGER_APPLICATION_POOL_GROUP_STATE_INSPECTION_CPP_
@@ -23,6 +23,12 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_GROUP_VERIFICATION_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_GROUP_VERIFICATION_CPP_
28
+
29
+ #ifdef INTELLISENSE
30
+ #include <Core/ApplicationPool/Pool.h>
31
+ #endif
26
32
  #include <Core/ApplicationPool/Group.h>
27
33
 
28
34
  /*************************************************************************
@@ -158,3 +164,5 @@ Group::verifyNoRequestsOnGetWaitlistAreRoutable() const {
158
164
 
159
165
  } // namespace ApplicationPool2
160
166
  } // namespace Passenger
167
+
168
+ #endif // _PASSENGER_APPLICATION_POOL_GROUP_VERIFICATION_CPP_
@@ -92,8 +92,18 @@ public:
92
92
  };
93
93
 
94
94
  struct RouteResult {
95
- Process *process;
96
- bool finished;
95
+ /** The Process to route the request to, or nullptr if no process can be routed to. */
96
+ Process * const process;
97
+ /**
98
+ * If `process` is nullptr, then `finished` indicates whether another `Group::route()`
99
+ * call on a different request *could* succeed, meaning that the caller should continue
100
+ * calling `Group::route()` if there are more queued requests that need to be processed.
101
+ *
102
+ * Usually `finished` is false because all processes are totally busy. But in some cases,
103
+ * for example when using sticky sessions, it could be true because other requests can
104
+ * potentially be routed to other processes.
105
+ */
106
+ const bool finished;
97
107
 
98
108
  RouteResult(Process *p, bool _finished = false)
99
109
  : process(p),
@@ -223,9 +233,9 @@ public:
223
233
  /****** Process list management ******/
224
234
 
225
235
  Process *findProcessWithStickySessionId(unsigned int id) const;
226
- Process *findProcessWithStickySessionIdOrLowestBusyness(unsigned int id) const;
227
- Process *findProcessWithLowestBusyness(const ProcessList &processes) const;
228
- Process *findEnabledProcessWithLowestBusyness() const;
236
+ Process *findBestProcessPreferringStickySessionId(unsigned int id) const;
237
+ Process *findBestProcess(const ProcessList &processes) const;
238
+ Process *findBestEnabledProcess() const;
229
239
 
230
240
  void addProcessToList(const ProcessPtr &process, ProcessList &destination);
231
241
  void removeProcessFromList(const ProcessPtr &process, ProcessList &source);
@@ -23,6 +23,9 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_POOL_ANALYTICS_COLLECTION_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_POOL_ANALYTICS_COLLECTION_CPP_
28
+
26
29
  #include <Core/ApplicationPool/Pool.h>
27
30
 
28
31
  /*************************************************************************
@@ -191,3 +194,5 @@ Pool::realCollectAnalytics() {
191
194
 
192
195
  } // namespace ApplicationPool2
193
196
  } // namespace Passenger
197
+
198
+ #endif // _PASSENGER_APPLICATION_POOL_POOL_ANALYTICS_COLLECTION_CPP_
@@ -23,6 +23,9 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_POOL_GARBAGE_COLLECTION_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_POOL_GARBAGE_COLLECTION_CPP_
28
+
26
29
  #include <Core/ApplicationPool/Pool.h>
27
30
 
28
31
  /*************************************************************************
@@ -199,3 +202,5 @@ Pool::wakeupGarbageCollector() {
199
202
 
200
203
  } // namespace ApplicationPool2
201
204
  } // namespace Passenger
205
+
206
+ #endif // _PASSENGER_APPLICATION_POOL_POOL_GARBAGE_COLLECTION_CPP_
@@ -23,6 +23,9 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_POOL_GENERAL_UTILS_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_POOL_GENERAL_UTILS_CPP_
28
+
26
29
  #include <Core/ApplicationPool/Pool.h>
27
30
 
28
31
  /*************************************************************************
@@ -237,3 +240,5 @@ Pool::getRandomGenerator() const {
237
240
 
238
241
  } // namespace ApplicationPool2
239
242
  } // namespace Passenger
243
+
244
+ #endif // _PASSENGER_APPLICATION_POOL_POOL_GENERAL_UTILS_CPP_
@@ -23,6 +23,9 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_POOL_GROUP_UTILS_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_POOL_GROUP_UTILS_CPP_
28
+
26
29
  #include <Core/ApplicationPool/Pool.h>
27
30
 
28
31
  /*************************************************************************
@@ -288,3 +291,5 @@ Pool::restartGroupsByAppRoot(const StaticString &appRoot, const RestartOptions &
288
291
 
289
292
  } // namespace ApplicationPool2
290
293
  } // namespace Passenger
294
+
295
+ #endif // _PASSENGER_APPLICATION_POOL_POOL_GROUP_UTILS_CPP_
@@ -23,6 +23,9 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_POOL_INITIALIZATION_AND_SHUTDOWN_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_POOL_INITIALIZATION_AND_SHUTDOWN_CPP_
28
+
26
29
  #include <Core/ApplicationPool/Pool.h>
27
30
 
28
31
  /*************************************************************************
@@ -140,3 +143,5 @@ Pool::destroy() {
140
143
 
141
144
  } // namespace ApplicationPool2
142
145
  } // namespace Passenger
146
+
147
+ #endif // _PASSENGER_APPLICATION_POOL_POOL_INITIALIZATION_AND_SHUTDOWN_CPP_
@@ -23,6 +23,9 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_POOL_MISCELLANEOUS_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_POOL_MISCELLANEOUS_CPP_
28
+
26
29
  #include <Core/ApplicationPool/Pool.h>
27
30
 
28
31
  /*************************************************************************
@@ -250,3 +253,5 @@ Pool::authorizeByUid(uid_t uid, bool lock) const {
250
253
 
251
254
  } // namespace ApplicationPool2
252
255
  } // namespace Passenger
256
+
257
+ #endif // _PASSENGER_APPLICATION_POOL_POOL_MISCELLANEOUS_CPP_
@@ -23,6 +23,9 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_POOL_PROCESS_UTILS_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_POOL_PROCESS_UTILS_CPP_
28
+
26
29
  #include <Core/ApplicationPool/Pool.h>
27
30
 
28
31
  /*************************************************************************
@@ -329,3 +332,5 @@ Pool::disableProcess(const StaticString &gupid) {
329
332
 
330
333
  } // namespace ApplicationPool2
331
334
  } // namespace Passenger
335
+
336
+ #endif // _PASSENGER_APPLICATION_POOL_POOL_PROCESS_UTILS_CPP_
@@ -23,6 +23,9 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #ifndef _PASSENGER_APPLICATION_POOL_POOL_STATE_INSPECTION_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_POOL_STATE_INSPECTION_CPP_
28
+
26
29
  #include <Core/ApplicationPool/Pool.h>
27
30
 
28
31
  /*************************************************************************
@@ -81,12 +84,17 @@ Pool::inspectProcessList(const InspectOptions &options, stringstream &result,
81
84
 
82
85
  if (process->metrics.isValid()) {
83
86
  snprintf(cpubuf, sizeof(cpubuf), "%d%%", (int) process->metrics.cpu);
87
+ #ifndef __clang__
84
88
  #pragma GCC diagnostic push
85
89
  #pragma GCC diagnostic ignored "-Wformat-truncation"
86
- //don't worry about format-truncation here, no one has 9.3PB RAM
90
+ #endif
91
+ // GCC warns about format-truncation here, but no one has 9.3PB RAM
92
+ // So we can safely ignore this warning.
87
93
  snprintf(membuf, sizeof(membuf), "%ldM",
88
94
  (unsigned long) (process->metrics.realMemory() / 1024));
95
+ #ifndef __clang__
89
96
  #pragma GCC diagnostic pop
97
+ #endif
90
98
  } else {
91
99
  snprintf(cpubuf, sizeof(cpubuf), "0%%");
92
100
  snprintf(membuf, sizeof(membuf), "0M");
@@ -431,3 +439,5 @@ Pool::getGroupCount() const {
431
439
 
432
440
  } // namespace ApplicationPool2
433
441
  } // namespace Passenger
442
+
443
+ #endif // _PASSENGER_APPLICATION_POOL_POOL_STATE_INSPECTION_CPP_
@@ -28,10 +28,8 @@
28
28
 
29
29
  #include <string>
30
30
  #include <vector>
31
- #include <algorithm>
32
31
  #include <utility>
33
32
  #include <sstream>
34
- #include <iomanip>
35
33
  #include <boost/thread.hpp>
36
34
  #include <boost/bind/bind.hpp>
37
35
  #include <boost/shared_ptr.hpp>
@@ -28,7 +28,6 @@
28
28
 
29
29
  #include <string>
30
30
  #include <vector>
31
- #include <algorithm>
32
31
  #include <boost/intrusive_ptr.hpp>
33
32
  #include <boost/move/core.hpp>
34
33
  #include <boost/container/vector.hpp>
@@ -54,6 +53,10 @@
54
53
  #include <Core/SpawningKit/Result.h>
55
54
  #include <Shared/ApplicationPoolApiKey.h>
56
55
 
56
+ namespace tut {
57
+ template<class Data> class test_object;
58
+ }
59
+
57
60
  namespace Passenger {
58
61
  namespace ApplicationPool2 {
59
62
 
@@ -100,6 +103,9 @@ typedef boost::container::vector<ProcessPtr> ProcessList;
100
103
  */
101
104
  class Process {
102
105
  public:
106
+ friend class Group;
107
+ template<class Data> friend class tut::test_object;
108
+
103
109
  static const unsigned int MAX_SOCKETS_ACCEPTING_HTTP_REQUESTS = 3;
104
110
 
105
111
  private:
@@ -337,9 +343,14 @@ private:
337
343
  }
338
344
 
339
345
  void destroySelf() const {
346
+ Context *context = getContext();
347
+ Process *storagePointer = const_cast<Process *>(this);
340
348
  this->~Process();
341
- LockGuard l(getContext()->memoryManagementSyncher);
342
- getContext()->processObjectPool.free(const_cast<Process *>(this));
349
+
350
+ LockGuard l(context->memoryManagementSyncher);
351
+ // Use `storagePointer` because using `this` after calling the destructor
352
+ // is undefined behavior.
353
+ context->processObjectPool.free(storagePointer);
343
354
  }
344
355
 
345
356
 
@@ -384,6 +395,10 @@ public:
384
395
 
385
396
  /** Last time when a session was opened for this Process. */
386
397
  unsigned long long lastUsed;
398
+ /** Which generation of app processes this one belongs to,
399
+ inherited from the app group, incremented when a restart
400
+ is initiated*/
401
+ const unsigned int generation;
387
402
  /** Number of sessions currently open.
388
403
  * @invariant session >= 0
389
404
  */
@@ -446,8 +461,7 @@ public:
446
461
  /** Collected by Pool::collectAnalytics(). */
447
462
  ProcessMetrics metrics;
448
463
 
449
-
450
- Process(const BasicGroupInfo *groupInfo, const Json::Value &args)
464
+ Process(const BasicGroupInfo *groupInfo, const unsigned int gen, const Json::Value &args)
451
465
  : info(this, groupInfo, args),
452
466
  socketsAcceptingHttpRequestsCount(0),
453
467
  spawnerCreationTime(getJsonUint64Field(args, "spawner_creation_time")),
@@ -458,6 +472,7 @@ public:
458
472
  refcount(1),
459
473
  index(-1),
460
474
  lastUsed(spawnEndTime),
475
+ generation(gen),
461
476
  sessions(0),
462
477
  processed(0),
463
478
  lifeStatus(ALIVE),
@@ -471,7 +486,7 @@ public:
471
486
  indexSocketsAcceptingHttpRequests();
472
487
  }
473
488
 
474
- Process(const BasicGroupInfo *groupInfo, const SpawningKit::Result &skResult,
489
+ Process(const BasicGroupInfo *groupInfo, const unsigned int gen, const SpawningKit::Result &skResult,
475
490
  const Json::Value &args)
476
491
  : info(this, groupInfo, skResult),
477
492
  socketsAcceptingHttpRequestsCount(0),
@@ -483,6 +498,7 @@ public:
483
498
  refcount(1),
484
499
  index(-1),
485
500
  lastUsed(spawnEndTime),
501
+ generation(gen),
486
502
  sessions(0),
487
503
  processed(0),
488
504
  lifeStatus(ALIVE),
@@ -109,9 +109,14 @@ private:
109
109
  }
110
110
 
111
111
  void destroySelf() const {
112
+ Context *context = this->context;
113
+ Session *storagePointer = const_cast<Session *>(this);
112
114
  this->~Session();
115
+
113
116
  LockGuard l(context->memoryManagementSyncher);
114
- context->sessionObjectPool.free(const_cast<Session *>(this));
117
+ // Use `storagePointer` because using `this` after calling the destructor
118
+ // is undefined behavior.
119
+ context->sessionObjectPool.free(storagePointer);
115
120
  }
116
121
 
117
122
  public: