passenger 6.0.22 → 6.0.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (334) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +59 -1
  3. data/Rakefile +13 -2
  4. data/bin/passenger-install-apache2-module +5 -0
  5. data/bin/passenger-install-nginx-module +18 -2
  6. data/build/apache2.rb +1 -1
  7. data/build/basics.rb +10 -4
  8. data/build/cxx_tests.rb +18 -7
  9. data/build/support/cxx_dependency_map.rb +40 -6
  10. data/build/test_basics.rb +24 -13
  11. data/package.json +1 -1
  12. data/passenger.gemspec +4 -2
  13. data/resources/templates/standalone/server.erb +1 -0
  14. data/src/agent/Core/ApplicationPool/Group/InitializationAndShutdown.cpp +8 -0
  15. data/src/agent/Core/ApplicationPool/Group/InternalUtils.cpp +10 -2
  16. data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +8 -0
  17. data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +9 -0
  18. data/src/agent/Core/ApplicationPool/Group/OutOfBandWork.cpp +9 -0
  19. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +63 -50
  20. data/src/agent/Core/ApplicationPool/Group/SessionManagement.cpp +19 -9
  21. data/src/agent/Core/ApplicationPool/Group/SpawningAndRestarting.cpp +8 -0
  22. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +9 -1
  23. data/src/agent/Core/ApplicationPool/Group/Verification.cpp +8 -0
  24. data/src/agent/Core/ApplicationPool/Group.h +15 -5
  25. data/src/agent/Core/ApplicationPool/Pool/AnalyticsCollection.cpp +5 -0
  26. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +5 -0
  27. data/src/agent/Core/ApplicationPool/Pool/GeneralUtils.cpp +5 -0
  28. data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +5 -0
  29. data/src/agent/Core/ApplicationPool/Pool/InitializationAndShutdown.cpp +5 -0
  30. data/src/agent/Core/ApplicationPool/Pool/Miscellaneous.cpp +5 -0
  31. data/src/agent/Core/ApplicationPool/Pool/ProcessUtils.cpp +5 -0
  32. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +11 -4
  33. data/src/agent/Core/ApplicationPool/Pool.h +0 -2
  34. data/src/agent/Core/ApplicationPool/Process.h +22 -6
  35. data/src/agent/Core/ApplicationPool/Session.h +6 -1
  36. data/src/agent/Core/Config.h +8 -3
  37. data/src/agent/Core/Controller/CheckoutSession.cpp +24 -1
  38. data/src/agent/Core/Controller/Config.h +5 -1
  39. data/src/agent/Core/Controller.h +1 -0
  40. data/src/agent/Core/CoreMain.cpp +10 -17
  41. data/src/agent/Core/OptionParser.h +3 -0
  42. data/src/agent/Core/SpawningKit/ErrorRenderer.h +5 -0
  43. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -53
  44. data/src/agent/Core/SpawningKit/Handshake/Session.h +3 -0
  45. data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +5 -2
  46. data/src/agent/Core/SpawningKit/SmartSpawner.h +6 -2
  47. data/src/agent/Core/SpawningKit/Spawner.h +4 -0
  48. data/src/agent/Shared/Fundamentals/AbortHandler.cpp +88 -9
  49. data/src/agent/Shared/Fundamentals/AbortHandler.h +2 -0
  50. data/src/agent/Shared/Fundamentals/Initialization.cpp +9 -3
  51. data/src/agent/Shared/Fundamentals/Initialization.h +3 -3
  52. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +6 -7
  53. data/src/agent/Watchdog/Config.h +2 -1
  54. data/src/agent/Watchdog/WatchdogMain.cpp +4 -7
  55. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +5 -0
  56. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +15 -0
  57. data/src/apache2_module/ConfigGeneral/ManifestGeneration.h +5 -3
  58. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +5 -0
  59. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +3 -0
  60. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +13 -0
  61. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +7 -0
  62. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +16 -0
  63. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h.cxxcodebuilder +3 -0
  64. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +2 -1
  65. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h.cxxcodebuilder +2 -1
  66. data/src/cxx_supportlib/Constants.h +1 -1
  67. data/src/cxx_supportlib/DataStructures/LString.h +4 -0
  68. data/src/cxx_supportlib/DataStructures/StringMap.h +0 -1
  69. data/src/cxx_supportlib/FileTools/PathManip.cpp +1 -1
  70. data/src/cxx_supportlib/SafeLibev.h +1 -3
  71. data/src/cxx_supportlib/ServerKit/Hooks.h +2 -2
  72. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +0 -1
  73. data/src/cxx_supportlib/ServerKit/HttpServer.h +15 -10
  74. data/src/cxx_supportlib/ServerKit/Server.h +0 -6
  75. data/src/cxx_supportlib/Utils/AsyncSignalSafeUtils.h +2 -0
  76. data/src/cxx_supportlib/Utils/SpeedMeter.h +0 -3
  77. data/src/cxx_supportlib/oxt/implementation.cpp +11 -0
  78. data/src/cxx_supportlib/oxt/system_calls.cpp +10 -3
  79. data/src/cxx_supportlib/oxt/thread.hpp +1 -1
  80. data/src/cxx_supportlib/vendor-modified/boost/asio/as_tuple.hpp +35 -9
  81. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_immediate_executor.hpp +3 -2
  82. data/src/cxx_supportlib/vendor-modified/boost/asio/associator.hpp +1 -1
  83. data/src/cxx_supportlib/vendor-modified/boost/asio/async_result.hpp +74 -68
  84. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_datagram_socket.hpp +11 -11
  85. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_deadline_timer.hpp +2 -2
  86. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_random_access_file.hpp +2 -2
  87. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_raw_socket.hpp +10 -10
  88. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_readable_pipe.hpp +1 -1
  89. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_seq_packet_socket.hpp +3 -3
  90. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_serial_port.hpp +2 -2
  91. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_signal_set.hpp +1 -1
  92. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket.hpp +2 -2
  93. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_acceptor.hpp +9 -9
  94. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_file.hpp +2 -2
  95. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_socket.hpp +6 -6
  96. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_waitable_timer.hpp +2 -2
  97. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_writable_pipe.hpp +1 -1
  98. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_allocator.hpp +88 -22
  99. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_cancellation_slot.hpp +91 -22
  100. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_executor.hpp +105 -23
  101. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_immediate_executor.hpp +90 -23
  102. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +2 -2
  103. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer_registration.hpp +1 -1
  104. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_after.hpp +303 -0
  105. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_at.hpp +296 -0
  106. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/impl/co_composed.hpp → co_composed.hpp} +208 -61
  107. data/src/cxx_supportlib/vendor-modified/boost/asio/completion_condition.hpp +49 -0
  108. data/src/cxx_supportlib/vendor-modified/boost/asio/compose.hpp +10 -201
  109. data/src/cxx_supportlib/vendor-modified/boost/asio/composed.hpp +415 -0
  110. data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +214 -48
  111. data/src/cxx_supportlib/vendor-modified/boost/asio/coroutine.hpp +3 -4
  112. data/src/cxx_supportlib/vendor-modified/boost/asio/default_completion_token.hpp +91 -0
  113. data/src/cxx_supportlib/vendor-modified/boost/asio/deferred.hpp +9 -5
  114. data/src/cxx_supportlib/vendor-modified/boost/asio/detached.hpp +2 -2
  115. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffered_stream_storage.hpp +1 -1
  116. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_message.hpp → detail/completion_message.hpp} +14 -16
  117. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_payload.hpp → detail/completion_payload.hpp} +30 -32
  118. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_handler.hpp → detail/completion_payload_handler.hpp} +15 -13
  119. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +26 -32
  120. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/deadline_timer_service.hpp +5 -1
  121. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_alloc_helpers.hpp +14 -118
  122. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/descriptor_ops.ipp +36 -33
  123. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.ipp +1 -1
  124. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_descriptor_service.ipp +7 -5
  125. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_socket_service_base.ipp +6 -4
  126. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +44 -35
  127. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_select_interrupter.ipp +1 -1
  128. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/initiation_base.hpp +64 -0
  129. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/memory.hpp +0 -11
  130. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_descriptor_service.hpp +20 -16
  131. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_send_op.hpp +0 -1
  132. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service.hpp +4 -4
  133. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service_base.hpp +23 -18
  134. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/recycling_allocator.hpp +9 -0
  135. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_endpoint_op.hpp +1 -1
  136. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_query_op.hpp +1 -1
  137. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_info_base.hpp +11 -1
  138. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timed_cancel_op.hpp +363 -0
  139. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wrapped_handler.hpp +29 -51
  140. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/allocator.hpp +1 -1
  141. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking.hpp +1 -1
  142. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking_adaptation.hpp +1 -1
  143. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context.hpp +1 -1
  144. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/mapping.hpp +1 -1
  145. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/occupancy.hpp +1 -1
  146. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/outstanding_work.hpp +1 -1
  147. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/relationship.hpp +1 -1
  148. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_channel.hpp +2 -1
  149. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_concurrent_channel.hpp +2 -1
  150. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_composed.hpp +2 -114
  151. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_receive_op.hpp +2 -3
  152. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_functions.hpp +27 -19
  153. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_op.hpp +0 -1
  154. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_service.hpp +17 -15
  155. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_promise_allocator.hpp +2 -3
  156. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/impl/channel_service.hpp +4 -2
  157. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/partial_promise.hpp +3 -5
  158. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/as_single.hpp +12 -7
  159. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/coro.hpp +1 -1
  160. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/parallel_group.hpp +38 -40
  161. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/promise.hpp +3 -3
  162. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_coro.hpp +5 -5
  163. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_promise.hpp +1 -1
  164. data/src/cxx_supportlib/vendor-modified/boost/asio/immediate.hpp +144 -0
  165. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/append.hpp +14 -7
  166. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/as_tuple.hpp +45 -14
  167. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp +3 -3
  168. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_after.hpp +270 -0
  169. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_at.hpp +270 -0
  170. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/co_spawn.hpp +8 -0
  171. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect.hpp +60 -166
  172. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/consign.hpp +14 -7
  173. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/detached.hpp +2 -2
  174. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/prepend.hpp +14 -7
  175. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read.hpp +26 -177
  176. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_at.hpp +16 -82
  177. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +13 -286
  178. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/redirect_error.hpp +55 -18
  179. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/spawn.hpp +1 -1
  180. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write.hpp +26 -185
  181. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write_at.hpp +16 -87
  182. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context_strand.hpp +5 -5
  183. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +6 -6
  184. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/socket_option.hpp +1 -1
  185. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.ipp +1 -1
  186. data/src/cxx_supportlib/vendor-modified/boost/asio/placeholders.hpp +12 -6
  187. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_descriptor.hpp +1 -1
  188. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_stream_descriptor.hpp +2 -2
  189. data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +127 -28
  190. data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +70 -20
  191. data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +114 -36
  192. data/src/cxx_supportlib/vendor-modified/boost/asio/redirect_error.hpp +43 -3
  193. data/src/cxx_supportlib/vendor-modified/boost/asio/registered_buffer.hpp +2 -2
  194. data/src/cxx_supportlib/vendor-modified/boost/asio/spawn.hpp +0 -1
  195. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/openssl_init.ipp +2 -2
  196. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +10 -7
  197. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +5 -5
  198. data/src/cxx_supportlib/vendor-modified/boost/asio/this_coro.hpp +2 -2
  199. data/src/cxx_supportlib/vendor-modified/boost/asio/use_awaitable.hpp +2 -2
  200. data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +1 -1
  201. data/src/cxx_supportlib/vendor-modified/boost/asio/uses_executor.hpp +1 -1
  202. data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +1 -1
  203. data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +147 -35
  204. data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +74 -22
  205. data/src/cxx_supportlib/vendor-modified/boost/asio.hpp +6 -0
  206. data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +4 -1
  207. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/futex.hpp +42 -11
  208. data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +15 -37
  209. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +8 -8
  210. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +1 -1
  211. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +151 -10
  212. data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +11 -9
  213. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +611 -102
  214. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +1 -1
  215. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +47 -47
  216. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +25 -24
  217. data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocation_type.hpp +7 -7
  218. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_list.hpp +2 -2
  219. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_slist.hpp +2 -2
  220. data/src/cxx_supportlib/vendor-modified/boost/container/detail/construct_in_place.hpp +35 -1
  221. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +14 -14
  222. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +1 -1
  223. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +55 -23
  224. data/src/cxx_supportlib/vendor-modified/boost/container/detail/function_detector.hpp +1 -1
  225. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_container.hpp +2 -2
  226. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_contiguous_container.hpp +1 -1
  227. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_pair.hpp +4 -4
  228. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +8 -8
  229. data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +9 -9
  230. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +4 -4
  231. data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +96 -10
  232. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +19 -4
  233. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +1 -1
  234. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +17 -17
  235. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common.hpp +1 -1
  236. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +2 -2
  237. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_resource.hpp +4 -4
  238. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +86 -52
  239. data/src/cxx_supportlib/vendor-modified/boost/container/detail/version_type.hpp +4 -4
  240. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +12 -0
  241. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +145 -65
  242. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +105 -22
  243. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +2 -2
  244. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +30 -22
  245. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +19 -2
  246. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +1 -1
  247. data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +15 -8
  248. data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +6 -5
  249. data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +15 -15
  250. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +1 -1
  251. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +1 -1
  252. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +3 -3
  253. data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +1 -1
  254. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +2 -2
  255. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +31 -24
  256. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +45 -43
  257. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +45 -33
  258. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +5 -7
  259. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +55 -47
  260. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator.hpp +3 -3
  261. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +222 -73
  262. data/src/cxx_supportlib/vendor-modified/boost/core/detail/minstd_rand.hpp +58 -0
  263. data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +13 -13
  264. data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +53 -5
  265. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +1 -0
  266. data/src/cxx_supportlib/vendor-modified/boost/core/pointer_in_range.hpp +49 -0
  267. data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +2 -0
  268. data/src/cxx_supportlib/vendor-modified/boost/core/type_name.hpp +7 -2
  269. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +22 -34
  270. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +141 -38
  271. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/algorithm.hpp +8 -8
  272. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash.hpp +1 -1
  273. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +8 -6
  274. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_traits.hpp +18 -18
  275. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +22 -17
  276. data/src/cxx_supportlib/vendor-modified/boost/libs/random/src/random_device.cpp +3 -1
  277. data/src/cxx_supportlib/vendor-modified/boost/move/detail/config_begin.hpp +0 -1
  278. data/src/cxx_supportlib/vendor-modified/boost/move/detail/launder.hpp +53 -0
  279. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +9 -1
  280. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +6 -1
  281. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
  282. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/integral_wrapper.hpp +2 -1
  283. data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
  284. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/requires_cxx11.hpp +1 -1
  285. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp +4 -1
  286. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category_message.hpp +13 -1
  287. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +13 -1
  288. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map_fwd.hpp +15 -0
  289. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +13 -1
  290. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set_fwd.hpp +15 -0
  291. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +22 -6
  292. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +38 -10
  293. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +111 -2
  294. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/cumulative_stats.hpp +177 -0
  295. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +11 -1
  296. data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +33 -7
  297. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +12 -0
  298. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map_fwd.hpp +15 -0
  299. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +12 -0
  300. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set_fwd.hpp +14 -0
  301. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +19 -0
  302. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +12 -0
  303. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map_fwd.hpp +15 -0
  304. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +12 -0
  305. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set_fwd.hpp +14 -0
  306. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +17 -0
  307. data/src/cxx_supportlib/vendor-modified/boost/utility/detail/minstd_rand.hpp +1 -43
  308. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  309. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +8 -0
  310. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +12 -0
  311. data/src/nginx_module/Configuration.c +7 -2
  312. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +6 -0
  313. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +15 -0
  314. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +14 -0
  315. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +3 -0
  316. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +4 -0
  317. data/src/ruby_native_extension/passenger_native_support.c +1 -0
  318. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +5 -0
  319. data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +6 -2
  320. data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +10 -0
  321. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +12 -4
  322. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +5 -0
  323. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +32 -5
  324. data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -0
  325. data/src/ruby_supportlib/phusion_passenger/rack/handler.rb +73 -0
  326. data/src/ruby_supportlib/phusion_passenger/rack_handler.rb +30 -56
  327. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +5 -0
  328. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +1 -0
  329. data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +0 -4
  330. data/src/ruby_supportlib/phusion_passenger/utils/json.rb +7 -198
  331. data/src/ruby_supportlib/phusion_passenger/utils/strscan.rb +67 -0
  332. data/src/ruby_supportlib/phusion_passenger/utils.rb +5 -15
  333. data/src/ruby_supportlib/phusion_passenger.rb +5 -5
  334. metadata +39 -10
data/passenger.gemspec CHANGED
@@ -1,5 +1,6 @@
1
1
  source_root = File.expand_path(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift("#{source_root}/src/ruby_supportlib")
3
+ require 'rubygems'
3
4
  require 'phusion_passenger'
4
5
  PhusionPassenger.locate_directories
5
6
  PhusionPassenger.require_passenger_lib 'packaging'
@@ -22,8 +23,9 @@ Gem::Specification.new do |s|
22
23
  "mailing_list_uri" => "https://www.phusionpassenger.com/contact",
23
24
  "wiki_uri" => "https://github.com/phusion/passenger/wiki"
24
25
  }
25
- s.add_dependency 'rake', '>= 0.8.1'
26
- s.add_dependency 'rack'
26
+ s.add_dependency 'rake', '>= 12.3.3'
27
+ s.add_dependency 'rack', '>= 1.6.13'
28
+ s.add_dependency 'rackup', '>= 2.0.0'
27
29
  s.files = Dir[*PhusionPassenger::Packaging::GLOB] -
28
30
  Dir[*PhusionPassenger::Packaging::EXCLUDE_GLOB]
29
31
  s.executables = PhusionPassenger::Packaging::USER_EXECUTABLES +
@@ -55,6 +55,7 @@ passenger_enabled on;
55
55
  <%= nginx_option(app, :preload_bundler) %>
56
56
  <%= nginx_option(app, :app_file_descriptor_ulimit) %>
57
57
  <%= nginx_option(app, :friendly_error_pages) %>
58
+ <%= nginx_option(app, :custom_error_page) %>
58
59
  <%= nginx_option(app, :abort_websockets_on_process_shutdown) %>
59
60
  <%= nginx_option(app, :force_max_concurrent_requests_per_process) %>
60
61
  <%= nginx_option(app, :max_requests) %>
@@ -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_INITIALIZATION_AND_SHUTDOWN_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_GROUP_INITIALIZATION_AND_SHUTDOWN_CPP_
28
+
29
+ #ifdef INTELLISENSE
30
+ #include <Core/ApplicationPool/Pool.h>
31
+ #endif
26
32
  #include <Core/ApplicationPool/Group.h>
27
33
 
28
34
  /*************************************************************************
@@ -179,3 +185,5 @@ Group::shutdown(const Callback &callback,
179
185
 
180
186
  } // namespace ApplicationPool2
181
187
  } // namespace Passenger
188
+
189
+ #endif // _PASSENGER_APPLICATION_POOL_GROUP_INITIALIZATION_AND_SHUTDOWN_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_INTERNAL_UTILS_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_GROUP_INTERNAL_UTILS_CPP_
28
+
29
+ #ifdef INTELLISENSE
30
+ #include <Core/ApplicationPool/Pool.h>
31
+ #endif
26
32
  #include <Core/ApplicationPool/Group.h>
27
33
 
28
34
  /*************************************************************************
@@ -178,7 +184,7 @@ Group::createNullProcessObject() {
178
184
  LockGuard l(context->memoryManagementSyncher);
179
185
  Process *process = context->processObjectPool.malloc();
180
186
  Guard guard(context, process);
181
- process = new (process) Process(&info, args);
187
+ process = new (process) Process(&info, info.group->restartsInitiated, args);
182
188
  process->shutdownNotRequired();
183
189
  guard.clear();
184
190
  return ProcessPtr(process, false);
@@ -215,7 +221,7 @@ Group::createProcessObject(const SpawningKit::Spawner &spawner,
215
221
  LockGuard l(context->memoryManagementSyncher);
216
222
  Process *process = context->processObjectPool.malloc();
217
223
  Guard guard(context, process);
218
- process = new (process) Process(&info, spawnResult, args);
224
+ process = new (process) Process(&info, info.group->restartsInitiated, spawnResult, args);
219
225
  guard.clear();
220
226
  return ProcessPtr(process, false);
221
227
  }
@@ -374,3 +380,5 @@ Group::callAbortLongRunningConnectionsCallback(const ProcessPtr &process) {
374
380
 
375
381
  } // namespace ApplicationPool2
376
382
  } // namespace Passenger
383
+
384
+ #endif // _PASSENGER_APPLICATION_POOL_GROUP_INTERNAL_UTILS_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_LIFETIME_AND_BASICS_CPP_
27
+ #define _PASSENGER_APPLICATION_POOL_GROUP_LIFETIME_AND_BASICS_CPP_
28
+
29
+ #ifdef INTELLISENSE
30
+ #include <Core/ApplicationPool/Pool.h>
31
+ #endif
26
32
  #include <Core/ApplicationPool/Group.h>
27
33
 
28
34
  /*************************************************************************
@@ -107,3 +113,5 @@ Group::getWrapperRegistry() const {
107
113
 
108
114
  } // namespace ApplicationPool2
109
115
  } // namespace Passenger
116
+
117
+ #endif // _PASSENGER_APPLICATION_POOL_GROUP_LIFETIME_AND_BASICS_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_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>
@@ -291,7 +297,7 @@ Group::inspectConfigInAdminPanelFormat(Json::Value &result) const {
291
297
  result["environment_variables"] = VAL(Json::objectValue, Json::objectValue);
292
298
  }
293
299
 
294
- // Missing: sticky_sessions, sticky_session_cookie_name, friendly_error_pages
300
+ // Missing: sticky_sessions, sticky_session_cookie_name, friendly_error_pages, custom_error_page
295
301
 
296
302
  /******************/
297
303
 
@@ -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,15 +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);
84
- #pragma clang diagnostic push
85
- #pragma clang diagnostic ignored "-Wformat-truncation"
87
+ #ifndef __clang__
86
88
  #pragma GCC diagnostic push
87
89
  #pragma GCC diagnostic ignored "-Wformat-truncation"
88
- //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.
89
93
  snprintf(membuf, sizeof(membuf), "%ldM",
90
94
  (unsigned long) (process->metrics.realMemory() / 1024));
95
+ #ifndef __clang__
91
96
  #pragma GCC diagnostic pop
92
- #pragma clang diagnostic pop
97
+ #endif
93
98
  } else {
94
99
  snprintf(cpubuf, sizeof(cpubuf), "0%%");
95
100
  snprintf(membuf, sizeof(membuf), "0M");
@@ -434,3 +439,5 @@ Pool::getGroupCount() const {
434
439
 
435
440
  } // namespace ApplicationPool2
436
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>