passenger 6.0.23 → 6.0.24

Sign up to get free protection for your applications and to get access to all the features.
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: