passenger 6.2.0 → 6.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (650) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +33 -1
  3. data/CONTRIBUTING.md +7 -311
  4. data/CONTRIBUTORS +1 -0
  5. data/LICENSE +1 -1
  6. data/README.md +1 -1
  7. data/Rakefile +1 -1
  8. data/bin/passenger +1 -1
  9. data/bin/passenger-config +1 -1
  10. data/bin/passenger-install-apache2-module +1 -1
  11. data/bin/passenger-install-nginx-module +4 -9
  12. data/bin/passenger-memory-stats +1 -1
  13. data/bin/passenger-status +1 -1
  14. data/build/agent.rb +13 -15
  15. data/build/apache2.rb +13 -16
  16. data/build/basics.rb +10 -13
  17. data/build/common_library.rb +5 -9
  18. data/build/cxx_tests.rb +37 -12
  19. data/build/integration_tests.rb +5 -2
  20. data/build/misc.rb +1 -1
  21. data/build/nginx.rb +1 -1
  22. data/build/node_tests.rb +1 -1
  23. data/build/oxt_tests.rb +6 -8
  24. data/build/packaging.rb +1 -1
  25. data/build/ruby_extension.rb +1 -1
  26. data/build/ruby_tests.rb +1 -1
  27. data/build/schema_printer.rb +13 -15
  28. data/build/support/cplusplus.rb +61 -69
  29. data/build/support/cxx_dependency_map.rb +2 -1
  30. data/build/support/general.rb +1 -1
  31. data/build/support/vendor/cxx_hinted_parser/LICENSE.md +1 -1
  32. data/build/support/vendor/cxx_hinted_parser/lib/cxx_hinted_parser/parser.rb +1 -1
  33. data/build/support/vendor/cxx_hinted_parser/lib/cxx_hinted_parser.rb +1 -1
  34. data/build/support/vendor/cxxcodebuilder/LICENSE.md +1 -1
  35. data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder/builder.rb +1 -1
  36. data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder/initializer_builder.rb +1 -1
  37. data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder.rb +1 -1
  38. data/build/test_basics.rb +1 -1
  39. data/dev/copy_boost_headers +1 -1
  40. data/dev/index_cxx_dependencies.rb +5 -1
  41. data/dev/libev-changes.patch +108 -0
  42. data/dev/nginx_version_sha256 +1 -1
  43. data/dev/ruby_server.rb +1 -6
  44. data/dev/upgrading_libuv.sh +16 -0
  45. data/doc/BasicArchitectureOverview.md +55 -0
  46. data/doc/BuildCaching.md +23 -0
  47. data/doc/BuildSystem.md +49 -0
  48. data/doc/DebuggingAndStressTesting.md +2 -0
  49. data/doc/DesignAspects/LimitedGemDependencies.md +1 -0
  50. data/doc/DevEnvironmentSetup.md +46 -0
  51. data/doc/DevHandbook.md +28 -0
  52. data/doc/Packaging.md +1 -1
  53. data/doc/RunningTests.md +88 -0
  54. data/doc/{TempFileHandling.md → SecureTempFileHandling.md} +1 -1
  55. data/doc/{CxxTestingGuide.md → WritingCxxTests.md} +1 -20
  56. data/src/agent/AgentMain.cpp +1 -1
  57. data/src/agent/Core/ApiServer.h +1 -1
  58. data/src/agent/Core/ApplicationPool/AbstractSession.h +1 -1
  59. data/src/agent/Core/ApplicationPool/BasicGroupInfo.h +1 -1
  60. data/src/agent/Core/ApplicationPool/BasicProcessInfo.h +1 -1
  61. data/src/agent/Core/ApplicationPool/Common.h +1 -1
  62. data/src/agent/Core/ApplicationPool/Context.h +1 -1
  63. data/src/agent/Core/ApplicationPool/Group/InitializationAndShutdown.cpp +1 -1
  64. data/src/agent/Core/ApplicationPool/Group/InternalUtils.cpp +1 -1
  65. data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +1 -1
  66. data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +1 -1
  67. data/src/agent/Core/ApplicationPool/Group/OutOfBandWork.cpp +1 -1
  68. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +1 -1
  69. data/src/agent/Core/ApplicationPool/Group/SessionManagement.cpp +1 -1
  70. data/src/agent/Core/ApplicationPool/Group/SpawningAndRestarting.cpp +1 -1
  71. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +1 -1
  72. data/src/agent/Core/ApplicationPool/Group/Verification.cpp +1 -1
  73. data/src/agent/Core/ApplicationPool/Group.h +1 -1
  74. data/src/agent/Core/ApplicationPool/Implementation.cpp +1 -1
  75. data/src/agent/Core/ApplicationPool/Options.h +1 -1
  76. data/src/agent/Core/ApplicationPool/Pool/AnalyticsCollection.cpp +1 -1
  77. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +1 -1
  78. data/src/agent/Core/ApplicationPool/Pool/GeneralUtils.cpp +1 -1
  79. data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +1 -1
  80. data/src/agent/Core/ApplicationPool/Pool/InitializationAndShutdown.cpp +1 -1
  81. data/src/agent/Core/ApplicationPool/Pool/Miscellaneous.cpp +1 -1
  82. data/src/agent/Core/ApplicationPool/Pool/ProcessUtils.cpp +1 -1
  83. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +1 -1
  84. data/src/agent/Core/ApplicationPool/Pool.h +1 -1
  85. data/src/agent/Core/ApplicationPool/Process.cpp +1 -1
  86. data/src/agent/Core/ApplicationPool/Process.h +1 -1
  87. data/src/agent/Core/ApplicationPool/Session.h +1 -1
  88. data/src/agent/Core/ApplicationPool/Socket.h +1 -1
  89. data/src/agent/Core/ApplicationPool/TestSession.h +1 -1
  90. data/src/agent/Core/Config.h +3 -2
  91. data/src/agent/Core/ConfigChange.cpp +1 -1
  92. data/src/agent/Core/ConfigChange.h +1 -1
  93. data/src/agent/Core/Controller/AppResponse.h +1 -1
  94. data/src/agent/Core/Controller/BufferBody.cpp +1 -1
  95. data/src/agent/Core/Controller/CheckoutSession.cpp +8 -5
  96. data/src/agent/Core/Controller/Client.h +1 -1
  97. data/src/agent/Core/Controller/Config.cpp +1 -1
  98. data/src/agent/Core/Controller/Config.h +2 -2
  99. data/src/agent/Core/Controller/ForwardResponse.cpp +2 -2
  100. data/src/agent/Core/Controller/Hooks.cpp +12 -9
  101. data/src/agent/Core/Controller/Implementation.cpp +1 -1
  102. data/src/agent/Core/Controller/InitRequest.cpp +1 -1
  103. data/src/agent/Core/Controller/InitializationAndShutdown.cpp +1 -1
  104. data/src/agent/Core/Controller/InternalUtils.cpp +1 -1
  105. data/src/agent/Core/Controller/Miscellaneous.cpp +1 -1
  106. data/src/agent/Core/Controller/Request.h +1 -1
  107. data/src/agent/Core/Controller/SendRequest.cpp +1 -1
  108. data/src/agent/Core/Controller/StateInspection.cpp +1 -1
  109. data/src/agent/Core/Controller/TurboCaching.h +1 -1
  110. data/src/agent/Core/Controller.h +1 -1
  111. data/src/agent/Core/CoreMain.cpp +1 -1
  112. data/src/agent/Core/OptionParser.h +1 -1
  113. data/src/agent/Core/ResponseCache.h +1 -1
  114. data/src/agent/Core/SecurityUpdateChecker.h +1 -1
  115. data/src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h +1 -1
  116. data/src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h.cxxcodebuilder +1 -1
  117. data/src/agent/Core/SpawningKit/Config.h +1 -1
  118. data/src/agent/Core/SpawningKit/Context.h +1 -1
  119. data/src/agent/Core/SpawningKit/DirectSpawner.h +1 -1
  120. data/src/agent/Core/SpawningKit/DummySpawner.h +1 -1
  121. data/src/agent/Core/SpawningKit/ErrorRenderer.h +1 -1
  122. data/src/agent/Core/SpawningKit/Exceptions.h +63 -2
  123. data/src/agent/Core/SpawningKit/Factory.h +1 -1
  124. data/src/agent/Core/SpawningKit/Handshake/BackgroundIOCapturer.h +1 -1
  125. data/src/agent/Core/SpawningKit/Handshake/Perform.h +3 -2
  126. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -1
  127. data/src/agent/Core/SpawningKit/Handshake/Session.h +1 -1
  128. data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +1 -1
  129. data/src/agent/Core/SpawningKit/Journey.h +1 -1
  130. data/src/agent/Core/SpawningKit/PipeWatcher.h +1 -1
  131. data/src/agent/Core/SpawningKit/README.md +3 -3
  132. data/src/agent/Core/SpawningKit/Result/AutoGeneratedCode.h +1 -1
  133. data/src/agent/Core/SpawningKit/Result/AutoGeneratedCode.h.cxxcodebuilder +1 -1
  134. data/src/agent/Core/SpawningKit/Result.h +1 -1
  135. data/src/agent/Core/SpawningKit/SmartSpawner.h +17 -17
  136. data/src/agent/Core/SpawningKit/Spawner.h +1 -1
  137. data/src/agent/Core/SpawningKit/UserSwitchingRules.h +1 -1
  138. data/src/agent/Core/TelemetryCollector.h +1 -1
  139. data/src/agent/ExecHelper/ExecHelperMain.cpp +1 -1
  140. data/src/agent/FileReadHelper/FileReadHelperMain.cpp +1 -1
  141. data/src/agent/MainFunctions.h +1 -1
  142. data/src/agent/Shared/ApiAccountUtils.h +4 -3
  143. data/src/agent/Shared/ApiServerUtils.h +1 -2
  144. data/src/agent/Shared/ApplicationPoolApiKey.h +1 -1
  145. data/src/agent/Shared/Fundamentals/AbortHandler.cpp +1 -1
  146. data/src/agent/Shared/Fundamentals/AbortHandler.h +1 -1
  147. data/src/agent/Shared/Fundamentals/Initialization.cpp +1 -1
  148. data/src/agent/Shared/Fundamentals/Initialization.h +1 -1
  149. data/src/agent/Shared/Fundamentals/Utils.cpp +1 -1
  150. data/src/agent/Shared/Fundamentals/Utils.h +1 -1
  151. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +1 -1
  152. data/src/agent/SystemMetrics/SystemMetricsMain.cpp +1 -1
  153. data/src/agent/TempDirToucher/TempDirToucherMain.cpp +1 -1
  154. data/src/agent/Watchdog/ApiServer.h +7 -6
  155. data/src/agent/Watchdog/Config.h +2 -2
  156. data/src/apache2_module/Bucket.cpp +1 -1
  157. data/src/apache2_module/Bucket.h +1 -1
  158. data/src/apache2_module/CBindings.cpp +1 -1
  159. data/src/apache2_module/Config.cpp +1 -1
  160. data/src/apache2_module/Config.h +1 -1
  161. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +104 -104
  162. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp.cxxcodebuilder +2 -2
  163. data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp +1 -1
  164. data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp.cxxcodebuilder +1 -1
  165. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +1 -1
  166. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp.cxxcodebuilder +1 -1
  167. data/src/apache2_module/ConfigGeneral/Common.h +1 -1
  168. data/src/apache2_module/ConfigGeneral/ManifestGeneration.h +1 -1
  169. data/src/apache2_module/ConfigGeneral/SetterFuncs.h +1 -1
  170. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +1 -1
  171. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp.cxxcodebuilder +1 -1
  172. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +1 -1
  173. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp.cxxcodebuilder +1 -1
  174. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +1 -1
  175. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp.cxxcodebuilder +1 -1
  176. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +1 -1
  177. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp.cxxcodebuilder +1 -1
  178. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +1 -1
  179. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h.cxxcodebuilder +1 -1
  180. data/src/apache2_module/DirectoryMapper.h +1 -1
  181. data/src/apache2_module/Hooks.cpp +8 -2
  182. data/src/apache2_module/Hooks.h +1 -1
  183. data/src/apache2_module/ServerConfig/AutoGeneratedManifestGeneration.cpp +1 -1
  184. data/src/apache2_module/ServerConfig/AutoGeneratedManifestGeneration.cpp.cxxcodebuilder +1 -1
  185. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +1 -1
  186. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h.cxxcodebuilder +1 -1
  187. data/src/apache2_module/Utils.h +1 -1
  188. data/src/apache2_module/mod_passenger.c +1 -1
  189. data/src/cxx_supportlib/Algorithms/Hasher.cpp +1 -1
  190. data/src/cxx_supportlib/Algorithms/Hasher.h +1 -1
  191. data/src/cxx_supportlib/Algorithms/MovingAverage.h +1 -1
  192. data/src/cxx_supportlib/AppLocalConfigFileUtils.h +1 -1
  193. data/src/cxx_supportlib/AppTypeDetector/CBindings.cpp +1 -1
  194. data/src/cxx_supportlib/AppTypeDetector/CBindings.h +1 -1
  195. data/src/cxx_supportlib/AppTypeDetector/Detector.h +1 -1
  196. data/src/cxx_supportlib/BackgroundEventLoop.cpp +1 -1
  197. data/src/cxx_supportlib/BackgroundEventLoop.h +1 -1
  198. data/src/cxx_supportlib/ConfigKit/AsyncUtils.h +1 -1
  199. data/src/cxx_supportlib/ConfigKit/Common.h +1 -1
  200. data/src/cxx_supportlib/ConfigKit/ConfigKit.h +1 -1
  201. data/src/cxx_supportlib/ConfigKit/DummyTranslator.h +1 -1
  202. data/src/cxx_supportlib/ConfigKit/IN_PRACTICE.md +1 -3
  203. data/src/cxx_supportlib/ConfigKit/PrefixTranslator.h +3 -3
  204. data/src/cxx_supportlib/ConfigKit/Schema.h +1 -1
  205. data/src/cxx_supportlib/ConfigKit/SchemaUtils.h +1 -1
  206. data/src/cxx_supportlib/ConfigKit/Store.h +1 -1
  207. data/src/cxx_supportlib/ConfigKit/SubComponentUtils.h +1 -1
  208. data/src/cxx_supportlib/ConfigKit/TableTranslator.h +1 -1
  209. data/src/cxx_supportlib/ConfigKit/Translator.h +1 -1
  210. data/src/cxx_supportlib/ConfigKit/Utils.h +1 -1
  211. data/src/cxx_supportlib/Constants.h +2 -2
  212. data/src/cxx_supportlib/Constants.h.cxxcodebuilder +1 -1
  213. data/src/cxx_supportlib/DataStructures/HashedStaticString.h +1 -1
  214. data/src/cxx_supportlib/DataStructures/LString.cpp +1 -1
  215. data/src/cxx_supportlib/DataStructures/LString.h +1 -1
  216. data/src/cxx_supportlib/DataStructures/StringKeyTable.h +1 -1
  217. data/src/cxx_supportlib/DataStructures/StringMap.h +1 -1
  218. data/src/cxx_supportlib/Exceptions.cpp +1 -1
  219. data/src/cxx_supportlib/Exceptions.h +1 -1
  220. data/src/cxx_supportlib/FileDescriptor.h +1 -1
  221. data/src/cxx_supportlib/FileTools/FileManip.cpp +1 -1
  222. data/src/cxx_supportlib/FileTools/FileManip.h +1 -1
  223. data/src/cxx_supportlib/FileTools/PathManip.cpp +1 -1
  224. data/src/cxx_supportlib/FileTools/PathManip.h +1 -1
  225. data/src/cxx_supportlib/FileTools/PathManipCBindings.cpp +1 -1
  226. data/src/cxx_supportlib/FileTools/PathManipCBindings.h +1 -1
  227. data/src/cxx_supportlib/FileTools/PathSecurityCheck.cpp +1 -1
  228. data/src/cxx_supportlib/FileTools/PathSecurityCheck.h +1 -1
  229. data/src/cxx_supportlib/Hooks.h +1 -1
  230. data/src/cxx_supportlib/IOTools/BufferedIO.h +1 -1
  231. data/src/cxx_supportlib/IOTools/IOUtils.cpp +10 -10
  232. data/src/cxx_supportlib/IOTools/IOUtils.h +1 -1
  233. data/src/cxx_supportlib/IOTools/MessageIO.h +1 -1
  234. data/src/cxx_supportlib/IOTools/MessageSerialization.h +1 -1
  235. data/src/cxx_supportlib/InstanceDirectory.h +1 -1
  236. data/src/cxx_supportlib/Integrations/LibevJsonUtils.h +1 -1
  237. data/src/cxx_supportlib/JsonTools/Autocast.h +1 -1
  238. data/src/cxx_supportlib/JsonTools/CBindings.cpp +1 -1
  239. data/src/cxx_supportlib/JsonTools/CBindings.h +1 -1
  240. data/src/cxx_supportlib/JsonTools/JsonUtils.h +1 -1
  241. data/src/cxx_supportlib/LoggingKit/Assert.h +1 -1
  242. data/src/cxx_supportlib/LoggingKit/Config.h +2 -1
  243. data/src/cxx_supportlib/LoggingKit/Context.h +1 -1
  244. data/src/cxx_supportlib/LoggingKit/Forward.h +1 -1
  245. data/src/cxx_supportlib/LoggingKit/Implementation.cpp +11 -1
  246. data/src/cxx_supportlib/LoggingKit/Logging.h +1 -1
  247. data/src/cxx_supportlib/LoggingKit/LoggingKit.h +1 -1
  248. data/src/cxx_supportlib/LveLoggingDecorator.h +1 -1
  249. data/src/cxx_supportlib/MemoryKit/mbuf.cpp +1 -1
  250. data/src/cxx_supportlib/MemoryKit/mbuf.h +1 -1
  251. data/src/cxx_supportlib/MemoryKit/palloc.cpp +1 -1
  252. data/src/cxx_supportlib/MemoryKit/palloc.h +1 -1
  253. data/src/cxx_supportlib/ProcessManagement/Ruby.cpp +1 -1
  254. data/src/cxx_supportlib/ProcessManagement/Ruby.h +1 -1
  255. data/src/cxx_supportlib/ProcessManagement/Spawn.cpp +1 -1
  256. data/src/cxx_supportlib/ProcessManagement/Spawn.h +1 -1
  257. data/src/cxx_supportlib/ProcessManagement/Utils.cpp +1 -1
  258. data/src/cxx_supportlib/ProcessManagement/Utils.h +1 -1
  259. data/src/cxx_supportlib/RandomGenerator.h +1 -1
  260. data/src/cxx_supportlib/ResourceLocator.h +1 -1
  261. data/src/cxx_supportlib/SafeLibev.h +1 -1
  262. data/src/cxx_supportlib/SecurityKit/Crypto.cpp +9 -27
  263. data/src/cxx_supportlib/SecurityKit/Crypto.h +2 -2
  264. data/src/cxx_supportlib/SecurityKit/MemZeroGuard.h +1 -1
  265. data/src/cxx_supportlib/ServerKit/AcceptLoadBalancer.h +1 -1
  266. data/src/cxx_supportlib/ServerKit/Channel.h +1 -1
  267. data/src/cxx_supportlib/ServerKit/Client.h +1 -1
  268. data/src/cxx_supportlib/ServerKit/ClientRef.h +1 -1
  269. data/src/cxx_supportlib/ServerKit/Config.h +1 -1
  270. data/src/cxx_supportlib/ServerKit/Context.h +1 -1
  271. data/src/cxx_supportlib/ServerKit/CookieUtils.h +1 -1
  272. data/src/cxx_supportlib/ServerKit/Errors.h +1 -1
  273. data/src/cxx_supportlib/ServerKit/FdSinkChannel.h +1 -1
  274. data/src/cxx_supportlib/ServerKit/FdSourceChannel.h +1 -1
  275. data/src/cxx_supportlib/ServerKit/FileBufferedChannel.h +54 -2
  276. data/src/cxx_supportlib/ServerKit/FileBufferedFdSinkChannel.h +1 -1
  277. data/src/cxx_supportlib/ServerKit/HeaderTable.h +1 -1
  278. data/src/cxx_supportlib/ServerKit/Hooks.h +1 -1
  279. data/src/cxx_supportlib/ServerKit/HttpChunkedBodyParser.h +1 -1
  280. data/src/cxx_supportlib/ServerKit/HttpChunkedBodyParserState.h +1 -1
  281. data/src/cxx_supportlib/ServerKit/HttpClient.h +1 -1
  282. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +1 -1
  283. data/src/cxx_supportlib/ServerKit/HttpHeaderParserState.h +1 -1
  284. data/src/cxx_supportlib/ServerKit/HttpRequest.h +1 -1
  285. data/src/cxx_supportlib/ServerKit/HttpRequestRef.h +1 -1
  286. data/src/cxx_supportlib/ServerKit/HttpServer.h +1 -1
  287. data/src/cxx_supportlib/ServerKit/Implementation.cpp +1 -1
  288. data/src/cxx_supportlib/ServerKit/Server.h +4 -2
  289. data/src/cxx_supportlib/StaticString.h +1 -1
  290. data/src/cxx_supportlib/StrIntTools/DateParsing.h +1 -1
  291. data/src/cxx_supportlib/StrIntTools/StrIntUtils.cpp +1 -1
  292. data/src/cxx_supportlib/StrIntTools/StrIntUtils.h +1 -1
  293. data/src/cxx_supportlib/StrIntTools/StrIntUtilsNoStrictAliasing.cpp +1 -1
  294. data/src/cxx_supportlib/StrIntTools/StringScanning.h +1 -1
  295. data/src/cxx_supportlib/StrIntTools/Template.h +1 -1
  296. data/src/cxx_supportlib/SystemTools/ContainerHelpers.h +1 -1
  297. data/src/cxx_supportlib/SystemTools/ProcessMetricsCollector.h +1 -1
  298. data/src/cxx_supportlib/SystemTools/SystemMetricsCollector.h +1 -1
  299. data/src/cxx_supportlib/SystemTools/SystemTime.cpp +1 -1
  300. data/src/cxx_supportlib/SystemTools/SystemTime.h +1 -1
  301. data/src/cxx_supportlib/SystemTools/UserDatabase.cpp +1 -1
  302. data/src/cxx_supportlib/SystemTools/UserDatabase.h +1 -1
  303. data/src/cxx_supportlib/Utils/AnsiColorConstants.h +1 -1
  304. data/src/cxx_supportlib/Utils/AsyncSignalSafeUtils.h +1 -1
  305. data/src/cxx_supportlib/Utils/BlockingQueue.h +1 -1
  306. data/src/cxx_supportlib/Utils/CachedFileStat.cpp +1 -1
  307. data/src/cxx_supportlib/Utils/CachedFileStat.h +1 -1
  308. data/src/cxx_supportlib/Utils/CachedFileStat.hpp +1 -1
  309. data/src/cxx_supportlib/Utils/ClassUtils.h +1 -1
  310. data/src/cxx_supportlib/Utils/Curl.h +1 -1
  311. data/src/cxx_supportlib/Utils/FastStringStream.h +1 -1
  312. data/src/cxx_supportlib/Utils/FileChangeChecker.h +1 -1
  313. data/src/cxx_supportlib/Utils/HttpConstants.h +1 -1
  314. data/src/cxx_supportlib/Utils/IniFile.h +1 -1
  315. data/src/cxx_supportlib/Utils/MessagePassing.h +1 -1
  316. data/src/cxx_supportlib/Utils/OptionParsing.h +1 -1
  317. data/src/cxx_supportlib/Utils/ReleaseableScopedPointer.h +1 -1
  318. data/src/cxx_supportlib/Utils/ScopeGuard.h +1 -1
  319. data/src/cxx_supportlib/Utils/SpeedMeter.h +1 -1
  320. data/src/cxx_supportlib/Utils/Timer.h +1 -1
  321. data/src/cxx_supportlib/Utils/VariantMap.h +1 -1
  322. data/src/cxx_supportlib/Utils.cpp +1 -1
  323. data/src/cxx_supportlib/Utils.h +1 -1
  324. data/src/cxx_supportlib/WatchdogLauncher.cpp +1 -1
  325. data/src/cxx_supportlib/WatchdogLauncher.h +1 -1
  326. data/src/cxx_supportlib/WrapperRegistry/CBindings.cpp +1 -1
  327. data/src/cxx_supportlib/WrapperRegistry/CBindings.h +1 -1
  328. data/src/cxx_supportlib/WrapperRegistry/Entry.h +1 -1
  329. data/src/cxx_supportlib/WrapperRegistry/Registry.h +1 -1
  330. data/src/cxx_supportlib/oxt/backtrace.hpp +1 -1
  331. data/src/cxx_supportlib/oxt/detail/backtrace_disabled.hpp +1 -1
  332. data/src/cxx_supportlib/oxt/detail/backtrace_enabled.hpp +1 -1
  333. data/src/cxx_supportlib/oxt/detail/context.hpp +1 -1
  334. data/src/cxx_supportlib/oxt/detail/tracable_exception_disabled.hpp +1 -1
  335. data/src/cxx_supportlib/oxt/detail/tracable_exception_enabled.hpp +1 -1
  336. data/src/cxx_supportlib/oxt/dynamic_thread_group.hpp +1 -1
  337. data/src/cxx_supportlib/oxt/implementation.cpp +1 -1
  338. data/src/cxx_supportlib/oxt/initialize.hpp +1 -1
  339. data/src/cxx_supportlib/oxt/macros.hpp +1 -1
  340. data/src/cxx_supportlib/oxt/spin_lock.hpp +1 -1
  341. data/src/cxx_supportlib/oxt/system_calls.cpp +1 -1
  342. data/src/cxx_supportlib/oxt/system_calls.hpp +1 -1
  343. data/src/cxx_supportlib/oxt/thread.hpp +1 -1
  344. data/src/cxx_supportlib/oxt/tracable_exception.hpp +1 -1
  345. data/src/cxx_supportlib/vendor-copy/adhoc_lve.h +1 -1
  346. data/src/cxx_supportlib/vendor-copy/libuv/AUTHORS +353 -3
  347. data/src/cxx_supportlib/vendor-copy/libuv/ChangeLog +3981 -2
  348. data/src/cxx_supportlib/vendor-copy/libuv/LICENSE +1 -28
  349. data/src/cxx_supportlib/vendor-copy/libuv/LICENSE-docs +396 -0
  350. data/src/cxx_supportlib/vendor-copy/libuv/LICENSE-extra +36 -0
  351. data/src/cxx_supportlib/vendor-copy/libuv/Makefile.am +275 -58
  352. data/src/cxx_supportlib/vendor-copy/libuv/Makefile.in +4380 -2125
  353. data/src/cxx_supportlib/vendor-copy/libuv/aclocal.m4 +425 -221
  354. data/src/cxx_supportlib/vendor-copy/libuv/ar-lib +30 -10
  355. data/src/cxx_supportlib/vendor-copy/libuv/compile +31 -14
  356. data/src/cxx_supportlib/vendor-copy/libuv/config.guess +1084 -690
  357. data/src/cxx_supportlib/vendor-copy/libuv/config.sub +1844 -1297
  358. data/src/cxx_supportlib/vendor-copy/libuv/configure +6935 -3664
  359. data/src/cxx_supportlib/vendor-copy/libuv/configure.ac +43 -19
  360. data/src/cxx_supportlib/vendor-copy/libuv/depcomp +12 -11
  361. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-darwin.h → uv/darwin.h} +3 -3
  362. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-errno.h → uv/errno.h} +119 -60
  363. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-linux.h → uv/linux.h} +1 -1
  364. data/src/cxx_supportlib/vendor-copy/libuv/include/uv/os390.h +33 -0
  365. data/src/cxx_supportlib/vendor-copy/libuv/include/uv/posix.h +31 -0
  366. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-threadpool.h → uv/threadpool.h} +1 -1
  367. data/src/cxx_supportlib/vendor-copy/libuv/include/{tree.h → uv/tree.h} +3 -250
  368. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-unix.h → uv/unix.h} +186 -60
  369. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-version.h → uv/version.h} +3 -3
  370. data/src/cxx_supportlib/vendor-copy/libuv/include/uv/win.h +703 -0
  371. data/src/cxx_supportlib/vendor-copy/libuv/include/uv.h +528 -40
  372. data/src/cxx_supportlib/vendor-copy/libuv/install-sh +110 -70
  373. data/src/cxx_supportlib/vendor-copy/libuv/libuv-static.pc.in +12 -0
  374. data/src/cxx_supportlib/vendor-copy/libuv/libuv.pc.in +4 -2
  375. data/src/cxx_supportlib/vendor-copy/libuv/ltmain.sh +995 -619
  376. data/src/cxx_supportlib/vendor-copy/libuv/m4/ax_pthread.m4 +485 -0
  377. data/src/cxx_supportlib/vendor-copy/libuv/m4/libtool.m4 +438 -289
  378. data/src/cxx_supportlib/vendor-copy/libuv/m4/libuv-check-flags.m4 +21 -4
  379. data/src/cxx_supportlib/vendor-copy/libuv/m4/libuv-check-versions.m4 +7 -0
  380. data/src/cxx_supportlib/vendor-copy/libuv/m4/ltoptions.m4 +69 -39
  381. data/src/cxx_supportlib/vendor-copy/libuv/m4/ltsugar.m4 +1 -1
  382. data/src/cxx_supportlib/vendor-copy/libuv/m4/ltversion.m4 +7 -6
  383. data/src/cxx_supportlib/vendor-copy/libuv/m4/lt~obsolete.m4 +2 -2
  384. data/src/cxx_supportlib/vendor-copy/libuv/missing +55 -34
  385. data/src/cxx_supportlib/vendor-copy/libuv/src/fs-poll.c +52 -20
  386. data/src/cxx_supportlib/vendor-copy/libuv/src/idna.c +560 -0
  387. data/src/cxx_supportlib/vendor-copy/libuv/src/idna.h +31 -0
  388. data/src/cxx_supportlib/vendor-copy/libuv/src/inet.c +5 -16
  389. data/src/cxx_supportlib/vendor-copy/libuv/src/queue.h +68 -86
  390. data/src/cxx_supportlib/vendor-copy/libuv/src/random.c +123 -0
  391. data/src/cxx_supportlib/vendor-copy/libuv/src/strscpy.c +38 -0
  392. data/src/cxx_supportlib/vendor-copy/libuv/src/strscpy.h +39 -0
  393. data/src/cxx_supportlib/vendor-copy/libuv/src/strtok.c +52 -0
  394. data/src/cxx_supportlib/vendor-copy/libuv/src/strtok.h +27 -0
  395. data/src/cxx_supportlib/vendor-copy/libuv/src/thread-common.c +175 -0
  396. data/src/cxx_supportlib/vendor-copy/libuv/src/threadpool.c +172 -57
  397. data/src/cxx_supportlib/vendor-copy/libuv/src/{unix/timer.c → timer.c} +57 -29
  398. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/aix-common.c +89 -0
  399. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/aix.c +418 -256
  400. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/async.c +168 -129
  401. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/bsd-ifaddrs.c +163 -0
  402. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/bsd-proctitle.c +99 -0
  403. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/core.c +1312 -378
  404. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/cygwin.c +93 -0
  405. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/darwin-proctitle.c +18 -32
  406. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/darwin-stub.h +97 -0
  407. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/darwin-syscalls.h +17 -0
  408. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/darwin.c +41 -139
  409. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/dl.c +1 -1
  410. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/freebsd.c +75 -235
  411. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/fs.c +1308 -299
  412. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/fsevents.c +150 -148
  413. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/getaddrinfo.c +58 -8
  414. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/getnameinfo.c +3 -2
  415. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/haiku.c +172 -0
  416. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/hurd.c +172 -0
  417. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/ibmi.c +542 -0
  418. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/internal.h +297 -106
  419. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/kqueue.c +325 -94
  420. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux.c +2708 -0
  421. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/loop-watcher.c +11 -11
  422. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/loop.c +105 -24
  423. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/netbsd.c +51 -157
  424. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/no-fsevents.c +42 -0
  425. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/no-proctitle.c +45 -0
  426. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/openbsd.c +42 -183
  427. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/os390-proctitle.c +136 -0
  428. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/os390-syscalls.c +536 -0
  429. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/os390-syscalls.h +75 -0
  430. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/os390.c +1070 -0
  431. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/pipe.c +324 -55
  432. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/poll.c +58 -11
  433. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/posix-hrtime.c +36 -0
  434. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/posix-poll.c +385 -0
  435. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/process.c +795 -248
  436. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/procfs-exepath.c +45 -0
  437. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/proctitle.c +77 -22
  438. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/qnx.c +142 -0
  439. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/random-devurandom.c +93 -0
  440. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/random-getentropy.c +57 -0
  441. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/random-getrandom.c +86 -0
  442. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/random-sysctl-linux.c +99 -0
  443. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/signal.c +147 -39
  444. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/stream.c +426 -474
  445. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/sunos.c +240 -98
  446. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/sysinfo-loadavg.c +36 -0
  447. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/sysinfo-memory.c +42 -0
  448. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/tcp.c +402 -91
  449. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/thread.c +497 -145
  450. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/tty.c +269 -45
  451. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/udp.c +695 -165
  452. data/src/cxx_supportlib/vendor-copy/libuv/src/uv-common.c +463 -61
  453. data/src/cxx_supportlib/vendor-copy/libuv/src/uv-common.h +248 -44
  454. data/src/cxx_supportlib/vendor-copy/libuv/src/uv-data-getter-setters.c +119 -0
  455. data/src/cxx_supportlib/vendor-copy/libuv/tsansupp.txt +2 -0
  456. data/src/cxx_supportlib/vendor-modified/libev/Changes +109 -0
  457. data/src/cxx_supportlib/vendor-modified/libev/Makefile.am +2 -1
  458. data/src/cxx_supportlib/vendor-modified/libev/Makefile.in +47 -33
  459. data/src/cxx_supportlib/vendor-modified/libev/README +2 -1
  460. data/src/cxx_supportlib/vendor-modified/libev/aclocal.m4 +1653 -1224
  461. data/src/cxx_supportlib/vendor-modified/libev/config.guess +376 -316
  462. data/src/cxx_supportlib/vendor-modified/libev/config.h.in +13 -2
  463. data/src/cxx_supportlib/vendor-modified/libev/config.sub +156 -154
  464. data/src/cxx_supportlib/vendor-modified/libev/configure +1431 -940
  465. data/src/cxx_supportlib/vendor-modified/libev/configure.ac +3 -3
  466. data/src/cxx_supportlib/vendor-modified/libev/depcomp +5 -5
  467. data/src/cxx_supportlib/vendor-modified/libev/ev++.h +109 -107
  468. data/src/cxx_supportlib/vendor-modified/libev/ev.c +807 -319
  469. data/src/cxx_supportlib/vendor-modified/libev/ev.h +111 -105
  470. data/src/cxx_supportlib/vendor-modified/libev/ev_epoll.c +42 -29
  471. data/src/cxx_supportlib/vendor-modified/libev/ev_iouring.c +694 -0
  472. data/src/cxx_supportlib/vendor-modified/libev/ev_kqueue.c +15 -9
  473. data/src/cxx_supportlib/vendor-modified/libev/ev_linuxaio.c +620 -0
  474. data/src/cxx_supportlib/vendor-modified/libev/ev_poll.c +19 -14
  475. data/src/cxx_supportlib/vendor-modified/libev/ev_port.c +8 -5
  476. data/src/cxx_supportlib/vendor-modified/libev/ev_select.c +6 -6
  477. data/src/cxx_supportlib/vendor-modified/libev/ev_vars.h +48 -3
  478. data/src/cxx_supportlib/vendor-modified/libev/ev_win32.c +2 -2
  479. data/src/cxx_supportlib/vendor-modified/libev/ev_wrap.h +72 -0
  480. data/src/cxx_supportlib/vendor-modified/libev/install-sh +23 -13
  481. data/src/cxx_supportlib/vendor-modified/libev/libev.m4 +6 -1
  482. data/src/cxx_supportlib/vendor-modified/libev/ltmain.sh +3581 -1993
  483. data/src/cxx_supportlib/vendor-modified/libev/missing +8 -8
  484. data/src/cxx_supportlib/vendor-modified/libev/mkinstalldirs +3 -3
  485. data/src/cxx_supportlib/vendor-modified/modp_b64_strict_aliasing.cpp +1 -1
  486. data/src/helper-scripts/backtrace-sanitizer.rb +1 -1
  487. data/src/helper-scripts/crash-watch.rb +1 -1
  488. data/src/helper-scripts/download_binaries/extconf.rb +1 -1
  489. data/src/helper-scripts/meteor-loader.rb +1 -1
  490. data/src/helper-scripts/node-loader.js +1 -1
  491. data/src/helper-scripts/prespawn +1 -1
  492. data/src/helper-scripts/rack-loader.rb +1 -1
  493. data/src/helper-scripts/rack-preloader.rb +1 -1
  494. data/src/helper-scripts/wsgi-loader.py +1 -1
  495. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +1 -1
  496. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c.cxxcodebuilder +1 -1
  497. data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c +1 -1
  498. data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c.cxxcodebuilder +1 -1
  499. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +1 -1
  500. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c.cxxcodebuilder +1 -1
  501. data/src/nginx_module/Configuration.c +1 -1
  502. data/src/nginx_module/Configuration.h +1 -1
  503. data/src/nginx_module/ContentHandler.c +1 -1
  504. data/src/nginx_module/ContentHandler.h +1 -1
  505. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +1 -1
  506. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c.cxxcodebuilder +1 -1
  507. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +1 -1
  508. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c.cxxcodebuilder +1 -1
  509. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +1 -1
  510. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c.cxxcodebuilder +1 -1
  511. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +1 -1
  512. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c.cxxcodebuilder +1 -1
  513. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +1 -1
  514. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h.cxxcodebuilder +1 -1
  515. data/src/nginx_module/MainConfig/AutoGeneratedCreateFunction.c +1 -1
  516. data/src/nginx_module/MainConfig/AutoGeneratedCreateFunction.c.cxxcodebuilder +1 -1
  517. data/src/nginx_module/MainConfig/AutoGeneratedManifestGeneration.c +1 -1
  518. data/src/nginx_module/MainConfig/AutoGeneratedManifestGeneration.c.cxxcodebuilder +1 -1
  519. data/src/nginx_module/MainConfig/AutoGeneratedStruct.h +1 -1
  520. data/src/nginx_module/MainConfig/AutoGeneratedStruct.h.cxxcodebuilder +1 -1
  521. data/src/nginx_module/StaticContentHandler.c +1 -1
  522. data/src/nginx_module/StaticContentHandler.h +1 -1
  523. data/src/nginx_module/ngx_http_passenger_module.c +1 -1
  524. data/src/nginx_module/ngx_http_passenger_module.h +1 -1
  525. data/src/nodejs_supportlib/phusion_passenger/line_reader.js +1 -1
  526. data/src/ruby_native_extension/extconf.rb +1 -1
  527. data/src/ruby_native_extension/passenger_native_support.c +1 -1
  528. data/src/ruby_supportlib/phusion_passenger/abstract_installer.rb +1 -1
  529. data/src/ruby_supportlib/phusion_passenger/admin_tools/instance.rb +1 -1
  530. data/src/ruby_supportlib/phusion_passenger/admin_tools/instance_registry.rb +1 -1
  531. data/src/ruby_supportlib/phusion_passenger/admin_tools/memory_stats.rb +2 -12
  532. data/src/ruby_supportlib/phusion_passenger/admin_tools.rb +1 -1
  533. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +1 -1
  534. data/src/ruby_supportlib/phusion_passenger/apache2/config_utils.rb +1 -1
  535. data/src/ruby_supportlib/phusion_passenger/common_library.rb +8 -10
  536. data/src/ruby_supportlib/phusion_passenger/config/about_command.rb +1 -1
  537. data/src/ruby_supportlib/phusion_passenger/config/agent_compiler.rb +1 -1
  538. data/src/ruby_supportlib/phusion_passenger/config/api_call_command.rb +1 -1
  539. data/src/ruby_supportlib/phusion_passenger/config/build_native_support_command.rb +1 -1
  540. data/src/ruby_supportlib/phusion_passenger/config/command.rb +1 -1
  541. data/src/ruby_supportlib/phusion_passenger/config/compile_agent_command.rb +1 -1
  542. data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +1 -1
  543. data/src/ruby_supportlib/phusion_passenger/config/detach_process_command.rb +1 -1
  544. data/src/ruby_supportlib/phusion_passenger/config/download_agent_command.rb +1 -1
  545. data/src/ruby_supportlib/phusion_passenger/config/download_nginx_engine_command.rb +1 -1
  546. data/src/ruby_supportlib/phusion_passenger/config/install_agent_command.rb +1 -1
  547. data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +1 -1
  548. data/src/ruby_supportlib/phusion_passenger/config/installation_utils.rb +1 -1
  549. data/src/ruby_supportlib/phusion_passenger/config/list_instances_command.rb +1 -1
  550. data/src/ruby_supportlib/phusion_passenger/config/main.rb +1 -1
  551. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +3 -2
  552. data/src/ruby_supportlib/phusion_passenger/config/reopen_logs_command.rb +6 -1
  553. data/src/ruby_supportlib/phusion_passenger/config/restart_app_command.rb +1 -1
  554. data/src/ruby_supportlib/phusion_passenger/config/system_metrics_command.rb +1 -1
  555. data/src/ruby_supportlib/phusion_passenger/config/system_properties_command.rb +1 -1
  556. data/src/ruby_supportlib/phusion_passenger/config/utils.rb +1 -1
  557. data/src/ruby_supportlib/phusion_passenger/config/validate_install_command.rb +1 -1
  558. data/src/ruby_supportlib/phusion_passenger/console_text_template.rb +1 -1
  559. data/src/ruby_supportlib/phusion_passenger/constants.rb +1 -1
  560. data/src/ruby_supportlib/phusion_passenger/debug_logging.rb +1 -1
  561. data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +1 -1
  562. data/src/ruby_supportlib/phusion_passenger/message_channel.rb +1 -1
  563. data/src/ruby_supportlib/phusion_passenger/message_client.rb +1 -1
  564. data/src/ruby_supportlib/phusion_passenger/native_support.rb +1 -1
  565. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +1 -1
  566. data/src/ruby_supportlib/phusion_passenger/packaging.rb +4 -3
  567. data/src/ruby_supportlib/phusion_passenger/platform_info/apache.rb +1 -1
  568. data/src/ruby_supportlib/phusion_passenger/platform_info/apache_detector.rb +1 -1
  569. data/src/ruby_supportlib/phusion_passenger/platform_info/binary_compatibility.rb +1 -1
  570. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +195 -11
  571. data/src/ruby_supportlib/phusion_passenger/platform_info/crypto.rb +1 -1
  572. data/src/ruby_supportlib/phusion_passenger/platform_info/curl.rb +1 -1
  573. data/src/ruby_supportlib/phusion_passenger/platform_info/cxx_portability.rb +1 -1
  574. data/src/ruby_supportlib/phusion_passenger/platform_info/linux.rb +1 -1
  575. data/src/ruby_supportlib/phusion_passenger/platform_info/networking.rb +1 -1
  576. data/src/ruby_supportlib/phusion_passenger/platform_info/openssl.rb +1 -1
  577. data/src/ruby_supportlib/phusion_passenger/platform_info/operating_system.rb +1 -1
  578. data/src/ruby_supportlib/phusion_passenger/platform_info/pcre.rb +1 -1
  579. data/src/ruby_supportlib/phusion_passenger/platform_info/ruby.rb +1 -1
  580. data/src/ruby_supportlib/phusion_passenger/platform_info/zlib.rb +1 -1
  581. data/src/ruby_supportlib/phusion_passenger/platform_info.rb +1 -1
  582. data/src/ruby_supportlib/phusion_passenger/plugin.rb +1 -1
  583. data/src/ruby_supportlib/phusion_passenger/preloader_shared_helpers.rb +1 -1
  584. data/src/ruby_supportlib/phusion_passenger/public_api.rb +1 -1
  585. data/src/ruby_supportlib/phusion_passenger/rack/handler.rb +1 -1
  586. data/src/ruby_supportlib/phusion_passenger/rack/out_of_band_gc.rb +1 -1
  587. data/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb +1 -1
  588. data/src/ruby_supportlib/phusion_passenger/rack_handler.rb +1 -1
  589. data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +2 -7
  590. data/src/ruby_supportlib/phusion_passenger/request_handler.rb +1 -1
  591. data/src/ruby_supportlib/phusion_passenger/ruby_core_enhancements.rb +1 -1
  592. data/src/ruby_supportlib/phusion_passenger/ruby_core_io_enhancements.rb +1 -1
  593. data/src/ruby_supportlib/phusion_passenger/simple_benchmarking.rb +1 -1
  594. data/src/ruby_supportlib/phusion_passenger/standalone/app_finder.rb +1 -1
  595. data/src/ruby_supportlib/phusion_passenger/standalone/command.rb +1 -1
  596. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +1 -1
  597. data/src/ruby_supportlib/phusion_passenger/standalone/config_utils.rb +1 -1
  598. data/src/ruby_supportlib/phusion_passenger/standalone/control_utils.rb +1 -1
  599. data/src/ruby_supportlib/phusion_passenger/standalone/main.rb +1 -1
  600. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +2 -2
  601. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/nginx_engine.rb +4 -8
  602. data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +1 -1
  603. data/src/ruby_supportlib/phusion_passenger/standalone/status_command.rb +1 -1
  604. data/src/ruby_supportlib/phusion_passenger/standalone/stop_command.rb +1 -1
  605. data/src/ruby_supportlib/phusion_passenger/standalone/version_command.rb +1 -1
  606. data/src/ruby_supportlib/phusion_passenger/utils/ansi_colors.rb +1 -1
  607. data/src/ruby_supportlib/phusion_passenger/utils/download.rb +1 -1
  608. data/src/ruby_supportlib/phusion_passenger/utils/file_system_watcher.rb +1 -1
  609. data/src/ruby_supportlib/phusion_passenger/utils/hosts_file_parser.rb +1 -1
  610. data/src/ruby_supportlib/phusion_passenger/utils/lock.rb +1 -1
  611. data/src/ruby_supportlib/phusion_passenger/utils/native_support_utils.rb +1 -1
  612. data/src/ruby_supportlib/phusion_passenger/utils/progress_bar.rb +1 -1
  613. data/src/ruby_supportlib/phusion_passenger/utils/strscan.rb +1 -1
  614. data/src/ruby_supportlib/phusion_passenger/utils/terminal_choice_menu.rb +1 -1
  615. data/src/ruby_supportlib/phusion_passenger/utils/unseekable_socket.rb +3 -13
  616. data/src/ruby_supportlib/phusion_passenger/utils.rb +1 -1
  617. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/app.rb +1 -1
  618. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/base.rb +1 -1
  619. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +1 -1
  620. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/lldb_controller.rb +1 -1
  621. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/utils.rb +1 -1
  622. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/version.rb +1 -1
  623. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller/lock_file.rb +8 -6
  624. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller/spawn.rb +4 -3
  625. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller/version.rb +6 -4
  626. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller.rb +395 -579
  627. data/src/ruby_supportlib/phusion_passenger.rb +8 -8
  628. data/src/schema_printer/SchemaPrinterMain.cpp +1 -1
  629. data/src/schema_printer/SchemaPrinterMain.cpp.cxxcodebuilder +1 -1
  630. metadata +69 -32
  631. data/doc/DeveloperQuickstart.md +0 -70
  632. data/src/README.md +0 -7
  633. data/src/cxx_supportlib/vendor-copy/libuv/README.md +0 -245
  634. data/src/cxx_supportlib/vendor-copy/libuv/checksparse.sh +0 -234
  635. data/src/cxx_supportlib/vendor-copy/libuv/common.gypi +0 -210
  636. data/src/cxx_supportlib/vendor-copy/libuv/gyp_uv.py +0 -93
  637. data/src/cxx_supportlib/vendor-copy/libuv/include/android-ifaddrs.h +0 -54
  638. data/src/cxx_supportlib/vendor-copy/libuv/include/pthread-fixes.h +0 -72
  639. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/android-ifaddrs.c +0 -703
  640. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/atomic-ops.h +0 -77
  641. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux-core.c +0 -899
  642. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux-inotify.c +0 -285
  643. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux-syscalls.c +0 -471
  644. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux-syscalls.h +0 -158
  645. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/pthread-fixes.c +0 -104
  646. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/spinlock.h +0 -53
  647. data/src/cxx_supportlib/vendor-copy/libuv/uv.gyp +0 -508
  648. /data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-aix.h → uv/aix.h} +0 -0
  649. /data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-bsd.h → uv/bsd.h} +0 -0
  650. /data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-sunos.h → uv/sunos.h} +0 -0
@@ -0,0 +1,1070 @@
1
+ /* Copyright libuv project contributors. All rights reserved.
2
+ *
3
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ * of this software and associated documentation files (the "Software"), to
5
+ * deal in the Software without restriction, including without limitation the
6
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ * sell copies of the Software, and to permit persons to whom the Software is
8
+ * furnished to do so, subject to the following conditions:
9
+ *
10
+ * The above copyright notice and this permission notice shall be included in
11
+ * all copies or substantial portions of the Software.
12
+ *
13
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19
+ * IN THE SOFTWARE.
20
+ */
21
+
22
+ #include "uv.h"
23
+ #include "internal.h"
24
+ #include <sys/ioctl.h>
25
+ #include <net/if.h>
26
+ #include <utmpx.h>
27
+ #include <unistd.h>
28
+ #include <sys/ps.h>
29
+ #include <builtins.h>
30
+ #include <termios.h>
31
+ #include <sys/msg.h>
32
+ #include <sys/resource.h>
33
+ #include "zos-base.h"
34
+ #include "zos-sys-info.h"
35
+ #if defined(__clang__)
36
+ #include "csrsic.h"
37
+ #else
38
+ #include "//'SYS1.SAMPLIB(CSRSIC)'"
39
+ #endif
40
+
41
+ #define CVT_PTR 0x10
42
+ #define PSA_PTR 0x00
43
+ #define CSD_OFFSET 0x294
44
+
45
+ /*
46
+ Long-term average CPU service used by this logical partition,
47
+ in millions of service units per hour. If this value is above
48
+ the partition's defined capacity, the partition will be capped.
49
+ It is calculated using the physical CPU adjustment factor
50
+ (RCTPCPUA) so it may not match other measures of service which
51
+ are based on the logical CPU adjustment factor. It is available
52
+ if the hardware supports LPAR cluster.
53
+ */
54
+ #define RCTLACS_OFFSET 0xC4
55
+
56
+ /* 32-bit count of alive CPUs. This includes both CPs and IFAs */
57
+ #define CSD_NUMBER_ONLINE_CPUS 0xD4
58
+
59
+ /* Address of system resources manager (SRM) control table */
60
+ #define CVTOPCTP_OFFSET 0x25C
61
+
62
+ /* Address of the RCT table */
63
+ #define RMCTRCT_OFFSET 0xE4
64
+
65
+ /* Address of the rsm control and enumeration area. */
66
+ #define CVTRCEP_OFFSET 0x490
67
+
68
+ /* Total number of frames currently on all available frame queues. */
69
+ #define RCEAFC_OFFSET 0x088
70
+
71
+ /* Pointer to the home (current) ASCB. */
72
+ #define PSAAOLD 0x224
73
+
74
+ /* Pointer to rsm address space block extension. */
75
+ #define ASCBRSME 0x16C
76
+
77
+ /*
78
+ NUMBER OF FRAMES CURRENTLY IN USE BY THIS ADDRESS SPACE.
79
+ It does not include 2G frames.
80
+ */
81
+ #define RAXFMCT 0x2C
82
+
83
+ /* Thread Entry constants */
84
+ #define PGTH_CURRENT 1
85
+ #define PGTH_LEN 26
86
+ #define PGTHAPATH 0x20
87
+ #pragma linkage(BPX4GTH, OS)
88
+ #pragma linkage(BPX1GTH, OS)
89
+
90
+ /* TOD Clock resolution in nanoseconds */
91
+ #define TOD_RES 4.096
92
+
93
+ typedef unsigned data_area_ptr_assign_type;
94
+
95
+ typedef union {
96
+ struct {
97
+ #if defined(_LP64)
98
+ data_area_ptr_assign_type lower;
99
+ #endif
100
+ data_area_ptr_assign_type assign;
101
+ };
102
+ char* deref;
103
+ } data_area_ptr;
104
+
105
+
106
+ void uv_loadavg(double avg[3]) {
107
+ /* TODO: implement the following */
108
+ avg[0] = 0;
109
+ avg[1] = 0;
110
+ avg[2] = 0;
111
+ }
112
+
113
+
114
+ int uv__platform_loop_init(uv_loop_t* loop) {
115
+ uv__os390_epoll* ep;
116
+
117
+ ep = epoll_create1(0);
118
+ loop->ep = ep;
119
+ if (ep == NULL)
120
+ return UV__ERR(errno);
121
+
122
+ return 0;
123
+ }
124
+
125
+
126
+ void uv__platform_loop_delete(uv_loop_t* loop) {
127
+ if (loop->ep != NULL) {
128
+ epoll_queue_close(loop->ep);
129
+ loop->ep = NULL;
130
+ }
131
+ }
132
+
133
+
134
+ uint64_t uv__hrtime(uv_clocktype_t type) {
135
+ unsigned long long timestamp;
136
+ __stckf(&timestamp);
137
+ /* Convert to nanoseconds */
138
+ return timestamp / TOD_RES;
139
+ }
140
+
141
+
142
+ static int getexe(char* buf, size_t len) {
143
+ return uv__strscpy(buf, __getargv()[0], len);
144
+ }
145
+
146
+
147
+ /*
148
+ * We could use a static buffer for the path manipulations that we need outside
149
+ * of the function, but this function could be called by multiple consumers and
150
+ * we don't want to potentially create a race condition in the use of snprintf.
151
+ * There is no direct way of getting the exe path in zOS - either through /procfs
152
+ * or through some libc APIs. The below approach is to parse the argv[0]'s pattern
153
+ * and use it in conjunction with PATH environment variable to craft one.
154
+ */
155
+ int uv_exepath(char* buffer, size_t* size) {
156
+ int res;
157
+ char args[PATH_MAX];
158
+ int pid;
159
+
160
+ if (buffer == NULL || size == NULL || *size == 0)
161
+ return UV_EINVAL;
162
+
163
+ res = getexe(args, sizeof(args));
164
+ if (res < 0)
165
+ return UV_EINVAL;
166
+
167
+ return uv__search_path(args, buffer, size);
168
+ }
169
+
170
+
171
+ uint64_t uv_get_free_memory(void) {
172
+ uint64_t freeram;
173
+
174
+ data_area_ptr cvt = {0};
175
+ data_area_ptr rcep = {0};
176
+ cvt.assign = *(data_area_ptr_assign_type*)(CVT_PTR);
177
+ rcep.assign = *(data_area_ptr_assign_type*)(cvt.deref + CVTRCEP_OFFSET);
178
+ freeram = (uint64_t)*((uint32_t*)(rcep.deref + RCEAFC_OFFSET)) * 4096;
179
+ return freeram;
180
+ }
181
+
182
+
183
+ uint64_t uv_get_total_memory(void) {
184
+ /* Use CVTRLSTG to get the size of actual real storage online at IPL in K. */
185
+ return (uint64_t)((int)((char *__ptr32 *__ptr32 *)0)[4][214]) * 1024;
186
+ }
187
+
188
+
189
+ uint64_t uv_get_constrained_memory(void) {
190
+ struct rlimit rl;
191
+
192
+ /* RLIMIT_MEMLIMIT return value is in megabytes rather than bytes. */
193
+ if (getrlimit(RLIMIT_MEMLIMIT, &rl) == 0)
194
+ return rl.rlim_cur * 1024 * 1024;
195
+
196
+ return 0; /* There is no memory limit set. */
197
+ }
198
+
199
+
200
+ uint64_t uv_get_available_memory(void) {
201
+ return uv_get_free_memory();
202
+ }
203
+
204
+
205
+ int uv_resident_set_memory(size_t* rss) {
206
+ char* ascb;
207
+ char* rax;
208
+ size_t nframes;
209
+
210
+ ascb = *(char* __ptr32 *)(PSA_PTR + PSAAOLD);
211
+ rax = *(char* __ptr32 *)(ascb + ASCBRSME);
212
+ nframes = *(unsigned int*)(rax + RAXFMCT);
213
+
214
+ *rss = nframes * sysconf(_SC_PAGESIZE);
215
+ return 0;
216
+ }
217
+
218
+
219
+ int uv_uptime(double* uptime) {
220
+ struct utmpx u ;
221
+ struct utmpx *v;
222
+ time64_t t;
223
+
224
+ u.ut_type = BOOT_TIME;
225
+ v = getutxid(&u);
226
+ if (v == NULL)
227
+ return -1;
228
+ *uptime = difftime64(time64(&t), v->ut_tv.tv_sec);
229
+ return 0;
230
+ }
231
+
232
+
233
+ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
234
+ uv_cpu_info_t* cpu_info;
235
+ int idx;
236
+ siv1v2 info;
237
+ data_area_ptr cvt = {0};
238
+ data_area_ptr csd = {0};
239
+ data_area_ptr rmctrct = {0};
240
+ data_area_ptr cvtopctp = {0};
241
+ int cpu_usage_avg;
242
+
243
+ cvt.assign = *(data_area_ptr_assign_type*)(CVT_PTR);
244
+
245
+ csd.assign = *((data_area_ptr_assign_type *) (cvt.deref + CSD_OFFSET));
246
+ cvtopctp.assign = *((data_area_ptr_assign_type *) (cvt.deref + CVTOPCTP_OFFSET));
247
+ rmctrct.assign = *((data_area_ptr_assign_type *) (cvtopctp.deref + RMCTRCT_OFFSET));
248
+
249
+ *count = *((int*) (csd.deref + CSD_NUMBER_ONLINE_CPUS));
250
+ cpu_usage_avg = *((unsigned short int*) (rmctrct.deref + RCTLACS_OFFSET));
251
+
252
+ *cpu_infos = uv__malloc(*count * sizeof(uv_cpu_info_t));
253
+ if (!*cpu_infos)
254
+ return UV_ENOMEM;
255
+
256
+ cpu_info = *cpu_infos;
257
+ idx = 0;
258
+ while (idx < *count) {
259
+ cpu_info->speed = *(int*)(info.siv1v2si22v1.si22v1cpucapability);
260
+ cpu_info->model = uv__malloc(ZOSCPU_MODEL_LENGTH + 1);
261
+ if (cpu_info->model == NULL) {
262
+ uv_free_cpu_info(*cpu_infos, idx);
263
+ return UV_ENOMEM;
264
+ }
265
+ __get_cpu_model(cpu_info->model, ZOSCPU_MODEL_LENGTH + 1);
266
+ cpu_info->cpu_times.user = cpu_usage_avg;
267
+ /* TODO: implement the following */
268
+ cpu_info->cpu_times.sys = 0;
269
+ cpu_info->cpu_times.idle = 0;
270
+ cpu_info->cpu_times.irq = 0;
271
+ cpu_info->cpu_times.nice = 0;
272
+ ++cpu_info;
273
+ ++idx;
274
+ }
275
+
276
+ return 0;
277
+ }
278
+
279
+
280
+ static int uv__interface_addresses_v6(uv_interface_address_t** addresses,
281
+ int* count) {
282
+ uv_interface_address_t* address;
283
+ int sockfd;
284
+ int maxsize;
285
+ __net_ifconf6header_t ifc;
286
+ __net_ifconf6entry_t* ifr;
287
+ __net_ifconf6entry_t* p;
288
+ unsigned int i;
289
+ int count_names;
290
+ unsigned char netmask[16] = {0};
291
+
292
+ *count = 0;
293
+ /* Assume maximum buffer size allowable */
294
+ maxsize = 16384;
295
+
296
+ if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)))
297
+ return UV__ERR(errno);
298
+
299
+ ifc.__nif6h_buffer = uv__calloc(1, maxsize);
300
+
301
+ if (ifc.__nif6h_buffer == NULL) {
302
+ uv__close(sockfd);
303
+ return UV_ENOMEM;
304
+ }
305
+
306
+ ifc.__nif6h_version = 1;
307
+ ifc.__nif6h_buflen = maxsize;
308
+
309
+ if (ioctl(sockfd, SIOCGIFCONF6, &ifc) == -1) {
310
+ /* This will error on a system that does not support IPv6. However, we want
311
+ * to treat this as there being 0 interfaces so we can continue to get IPv4
312
+ * interfaces in uv_interface_addresses(). So return 0 instead of the error.
313
+ */
314
+ uv__free(ifc.__nif6h_buffer);
315
+ uv__close(sockfd);
316
+ errno = 0;
317
+ return 0;
318
+ }
319
+
320
+ ifr = (__net_ifconf6entry_t*)(ifc.__nif6h_buffer);
321
+ while ((char*)ifr < (char*)ifc.__nif6h_buffer + ifc.__nif6h_buflen) {
322
+ p = ifr;
323
+ ifr = (__net_ifconf6entry_t*)((char*)ifr + ifc.__nif6h_entrylen);
324
+
325
+ if (!(p->__nif6e_addr.sin6_family == AF_INET6))
326
+ continue;
327
+
328
+ if (!(p->__nif6e_flags & _NIF6E_FLAGS_ON_LINK_ACTIVE))
329
+ continue;
330
+
331
+ ++(*count);
332
+ }
333
+
334
+ if ((*count) == 0) {
335
+ uv__free(ifc.__nif6h_buffer);
336
+ uv__close(sockfd);
337
+ return 0;
338
+ }
339
+
340
+ /* Alloc the return interface structs */
341
+ *addresses = uv__calloc(1, *count * sizeof(uv_interface_address_t));
342
+ if (!(*addresses)) {
343
+ uv__free(ifc.__nif6h_buffer);
344
+ uv__close(sockfd);
345
+ return UV_ENOMEM;
346
+ }
347
+ address = *addresses;
348
+
349
+ count_names = 0;
350
+ ifr = (__net_ifconf6entry_t*)(ifc.__nif6h_buffer);
351
+ while ((char*)ifr < (char*)ifc.__nif6h_buffer + ifc.__nif6h_buflen) {
352
+ p = ifr;
353
+ ifr = (__net_ifconf6entry_t*)((char*)ifr + ifc.__nif6h_entrylen);
354
+
355
+ if (!(p->__nif6e_addr.sin6_family == AF_INET6))
356
+ continue;
357
+
358
+ if (!(p->__nif6e_flags & _NIF6E_FLAGS_ON_LINK_ACTIVE))
359
+ continue;
360
+
361
+ /* All conditions above must match count loop */
362
+
363
+ i = 0;
364
+ /* Ignore EBCDIC space (0x40) padding in name */
365
+ while (i < ARRAY_SIZE(p->__nif6e_name) &&
366
+ p->__nif6e_name[i] != 0x40 &&
367
+ p->__nif6e_name[i] != 0)
368
+ ++i;
369
+ address->name = uv__malloc(i + 1);
370
+ if (address->name == NULL) {
371
+ uv_free_interface_addresses(*addresses, count_names);
372
+ uv__free(ifc.__nif6h_buffer);
373
+ uv__close(sockfd);
374
+ return UV_ENOMEM;
375
+ }
376
+ memcpy(address->name, p->__nif6e_name, i);
377
+ address->name[i] = '\0';
378
+ __e2a_s(address->name);
379
+ count_names++;
380
+
381
+ address->address.address6 = *((struct sockaddr_in6*) &p->__nif6e_addr);
382
+
383
+ for (i = 0; i < (p->__nif6e_prefixlen / 8); i++)
384
+ netmask[i] = 0xFF;
385
+
386
+ if (p->__nif6e_prefixlen % 8)
387
+ netmask[i] = 0xFF << (8 - (p->__nif6e_prefixlen % 8));
388
+
389
+ address->netmask.netmask6.sin6_len = p->__nif6e_prefixlen;
390
+ memcpy(&(address->netmask.netmask6.sin6_addr), netmask, 16);
391
+ address->netmask.netmask6.sin6_family = AF_INET6;
392
+
393
+ address->is_internal = p->__nif6e_flags & _NIF6E_FLAGS_LOOPBACK ? 1 : 0;
394
+ address++;
395
+ }
396
+
397
+ uv__free(ifc.__nif6h_buffer);
398
+ uv__close(sockfd);
399
+ return 0;
400
+ }
401
+
402
+
403
+ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
404
+ uv_interface_address_t* address;
405
+ int sockfd;
406
+ int maxsize;
407
+ struct ifconf ifc;
408
+ struct ifreq flg;
409
+ struct ifreq* ifr;
410
+ struct ifreq* p;
411
+ uv_interface_address_t* addresses_v6;
412
+ int count_v6;
413
+ unsigned int i;
414
+ int rc;
415
+ int count_names;
416
+
417
+ *count = 0;
418
+ *addresses = NULL;
419
+
420
+ /* get the ipv6 addresses first */
421
+ if ((rc = uv__interface_addresses_v6(&addresses_v6, &count_v6)) != 0)
422
+ return rc;
423
+
424
+ /* now get the ipv4 addresses */
425
+
426
+ /* Assume maximum buffer size allowable */
427
+ maxsize = 16384;
428
+
429
+ sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
430
+ if (0 > sockfd) {
431
+ if (count_v6)
432
+ uv_free_interface_addresses(addresses_v6, count_v6);
433
+ return UV__ERR(errno);
434
+ }
435
+
436
+ ifc.ifc_req = uv__calloc(1, maxsize);
437
+
438
+ if (ifc.ifc_req == NULL) {
439
+ if (count_v6)
440
+ uv_free_interface_addresses(addresses_v6, count_v6);
441
+ uv__close(sockfd);
442
+ return UV_ENOMEM;
443
+ }
444
+
445
+ ifc.ifc_len = maxsize;
446
+
447
+ if (ioctl(sockfd, SIOCGIFCONF, &ifc) == -1) {
448
+ if (count_v6)
449
+ uv_free_interface_addresses(addresses_v6, count_v6);
450
+ uv__free(ifc.ifc_req);
451
+ uv__close(sockfd);
452
+ return UV__ERR(errno);
453
+ }
454
+
455
+ #define MAX(a,b) (((a)>(b))?(a):(b))
456
+ #define ADDR_SIZE(p) MAX((p).sa_len, sizeof(p))
457
+
458
+ /* Count all up and running ipv4/ipv6 addresses */
459
+ ifr = ifc.ifc_req;
460
+ while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) {
461
+ p = ifr;
462
+ ifr = (struct ifreq*)
463
+ ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr));
464
+
465
+ if (!(p->ifr_addr.sa_family == AF_INET6 ||
466
+ p->ifr_addr.sa_family == AF_INET))
467
+ continue;
468
+
469
+ memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name));
470
+ if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) {
471
+ if (count_v6)
472
+ uv_free_interface_addresses(addresses_v6, count_v6);
473
+ uv__free(ifc.ifc_req);
474
+ uv__close(sockfd);
475
+ return UV__ERR(errno);
476
+ }
477
+
478
+ if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING))
479
+ continue;
480
+
481
+ (*count)++;
482
+ }
483
+
484
+ if (*count == 0 && count_v6 == 0) {
485
+ uv__free(ifc.ifc_req);
486
+ uv__close(sockfd);
487
+ return 0;
488
+ }
489
+
490
+ /* Alloc the return interface structs */
491
+ *addresses = uv__calloc(1, (*count + count_v6) *
492
+ sizeof(uv_interface_address_t));
493
+
494
+ if (!(*addresses)) {
495
+ if (count_v6)
496
+ uv_free_interface_addresses(addresses_v6, count_v6);
497
+ uv__free(ifc.ifc_req);
498
+ uv__close(sockfd);
499
+ return UV_ENOMEM;
500
+ }
501
+ address = *addresses;
502
+
503
+ /* copy over the ipv6 addresses if any are found */
504
+ if (count_v6) {
505
+ memcpy(address, addresses_v6, count_v6 * sizeof(uv_interface_address_t));
506
+ address += count_v6;
507
+ *count += count_v6;
508
+ /* free ipv6 addresses, but keep address names */
509
+ uv__free(addresses_v6);
510
+ }
511
+
512
+ count_names = *count;
513
+ ifr = ifc.ifc_req;
514
+ while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) {
515
+ p = ifr;
516
+ ifr = (struct ifreq*)
517
+ ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr));
518
+
519
+ if (!(p->ifr_addr.sa_family == AF_INET6 ||
520
+ p->ifr_addr.sa_family == AF_INET))
521
+ continue;
522
+
523
+ memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name));
524
+ if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) {
525
+ uv_free_interface_addresses(*addresses, count_names);
526
+ uv__free(ifc.ifc_req);
527
+ uv__close(sockfd);
528
+ return UV_ENOSYS;
529
+ }
530
+
531
+ if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING))
532
+ continue;
533
+
534
+ /* All conditions above must match count loop */
535
+
536
+ i = 0;
537
+ /* Ignore EBCDIC space (0x40) padding in name */
538
+ while (i < ARRAY_SIZE(p->ifr_name) &&
539
+ p->ifr_name[i] != 0x40 &&
540
+ p->ifr_name[i] != 0)
541
+ ++i;
542
+ address->name = uv__malloc(i + 1);
543
+ if (address->name == NULL) {
544
+ uv_free_interface_addresses(*addresses, count_names);
545
+ uv__free(ifc.ifc_req);
546
+ uv__close(sockfd);
547
+ return UV_ENOMEM;
548
+ }
549
+ memcpy(address->name, p->ifr_name, i);
550
+ address->name[i] = '\0';
551
+ __e2a_s(address->name);
552
+ count_names++;
553
+
554
+ address->address.address4 = *((struct sockaddr_in*) &p->ifr_addr);
555
+
556
+ if (ioctl(sockfd, SIOCGIFNETMASK, p) == -1) {
557
+ uv_free_interface_addresses(*addresses, count_names);
558
+ uv__free(ifc.ifc_req);
559
+ uv__close(sockfd);
560
+ return UV__ERR(errno);
561
+ }
562
+
563
+ address->netmask.netmask4 = *((struct sockaddr_in*) &p->ifr_addr);
564
+ address->netmask.netmask4.sin_family = AF_INET;
565
+ address->is_internal = flg.ifr_flags & IFF_LOOPBACK ? 1 : 0;
566
+ address++;
567
+ }
568
+
569
+ #undef ADDR_SIZE
570
+ #undef MAX
571
+
572
+ uv__free(ifc.ifc_req);
573
+ uv__close(sockfd);
574
+ return 0;
575
+ }
576
+
577
+
578
+ void uv_free_interface_addresses(uv_interface_address_t* addresses,
579
+ int count) {
580
+ int i;
581
+ for (i = 0; i < count; ++i)
582
+ uv__free(addresses[i].name);
583
+ uv__free(addresses);
584
+ }
585
+
586
+
587
+ void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) {
588
+ struct epoll_event* events;
589
+ struct epoll_event dummy;
590
+ uintptr_t i;
591
+ uintptr_t nfds;
592
+
593
+ assert(loop->watchers != NULL);
594
+ assert(fd >= 0);
595
+
596
+ events = (struct epoll_event*) loop->watchers[loop->nwatchers];
597
+ nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1];
598
+ if (events != NULL)
599
+ /* Invalidate events with same file descriptor */
600
+ for (i = 0; i < nfds; i++)
601
+ if ((int) events[i].fd == fd)
602
+ events[i].fd = -1;
603
+
604
+ /* Remove the file descriptor from the epoll. */
605
+ if (loop->ep != NULL)
606
+ epoll_ctl(loop->ep, EPOLL_CTL_DEL, fd, &dummy);
607
+ }
608
+
609
+
610
+ int uv__io_check_fd(uv_loop_t* loop, int fd) {
611
+ struct pollfd p[1];
612
+ int rv;
613
+
614
+ p[0].fd = fd;
615
+ p[0].events = POLLIN;
616
+
617
+ do
618
+ rv = poll(p, 1, 0);
619
+ while (rv == -1 && errno == EINTR);
620
+
621
+ if (rv == -1)
622
+ abort();
623
+
624
+ if (p[0].revents & POLLNVAL)
625
+ return -1;
626
+
627
+ return 0;
628
+ }
629
+
630
+
631
+ int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) {
632
+ uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT);
633
+ return 0;
634
+ }
635
+
636
+
637
+ static int os390_regfileint(uv_fs_event_t* handle, char* path) {
638
+ uv__os390_epoll* ep;
639
+ _RFIS reg_struct;
640
+ int rc;
641
+
642
+ ep = handle->loop->ep;
643
+ assert(ep->msg_queue != -1);
644
+
645
+ reg_struct.__rfis_cmd = _RFIS_REG;
646
+ reg_struct.__rfis_qid = ep->msg_queue;
647
+ reg_struct.__rfis_type = 1;
648
+ memcpy(reg_struct.__rfis_utok, &handle, sizeof(handle));
649
+
650
+ rc = __w_pioctl(path, _IOCC_REGFILEINT, sizeof(reg_struct), &reg_struct);
651
+ if (rc != 0)
652
+ return UV__ERR(errno);
653
+
654
+ memcpy(handle->rfis_rftok, reg_struct.__rfis_rftok,
655
+ sizeof(handle->rfis_rftok));
656
+
657
+ return 0;
658
+ }
659
+
660
+
661
+ int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb,
662
+ const char* filename, unsigned int flags) {
663
+ char* path;
664
+ int rc;
665
+
666
+ if (uv__is_active(handle))
667
+ return UV_EINVAL;
668
+
669
+ path = uv__strdup(filename);
670
+ if (path == NULL)
671
+ return UV_ENOMEM;
672
+
673
+ rc = os390_regfileint(handle, path);
674
+ if (rc != 0) {
675
+ uv__free(path);
676
+ return rc;
677
+ }
678
+
679
+ uv__handle_start(handle);
680
+ handle->path = path;
681
+ handle->cb = cb;
682
+
683
+ return 0;
684
+ }
685
+
686
+
687
+ int uv__fs_event_stop(uv_fs_event_t* handle) {
688
+ uv__os390_epoll* ep;
689
+ _RFIS reg_struct;
690
+ int rc;
691
+
692
+ if (!uv__is_active(handle))
693
+ return 0;
694
+
695
+ ep = handle->loop->ep;
696
+ assert(ep->msg_queue != -1);
697
+
698
+ reg_struct.__rfis_cmd = _RFIS_UNREG;
699
+ reg_struct.__rfis_qid = ep->msg_queue;
700
+ reg_struct.__rfis_type = 1;
701
+ memcpy(reg_struct.__rfis_rftok, handle->rfis_rftok,
702
+ sizeof(handle->rfis_rftok));
703
+
704
+ /*
705
+ * This call will take "/" as the path argument in case we
706
+ * don't care to supply the correct path. The system will simply
707
+ * ignore it.
708
+ */
709
+ rc = __w_pioctl("/", _IOCC_REGFILEINT, sizeof(reg_struct), &reg_struct);
710
+ if (rc != 0 && errno != EALREADY && errno != ENOENT)
711
+ abort();
712
+
713
+ if (handle->path != NULL) {
714
+ uv__free(handle->path);
715
+ handle->path = NULL;
716
+ }
717
+
718
+ if (rc != 0 && errno == EALREADY)
719
+ return -1;
720
+
721
+ uv__handle_stop(handle);
722
+
723
+ return 0;
724
+ }
725
+
726
+
727
+ int uv_fs_event_stop(uv_fs_event_t* handle) {
728
+ uv__fs_event_stop(handle);
729
+ return 0;
730
+ }
731
+
732
+
733
+ void uv__fs_event_close(uv_fs_event_t* handle) {
734
+ /*
735
+ * If we were unable to unregister file interest here, then it is most likely
736
+ * that there is a pending queued change notification. When this happens, we
737
+ * don't want to complete the close as it will free the underlying memory for
738
+ * the handle, causing a use-after-free problem when the event is processed.
739
+ * We defer the final cleanup until after the event is consumed in
740
+ * os390_message_queue_handler().
741
+ */
742
+ if (uv__fs_event_stop(handle) == 0)
743
+ uv__make_close_pending((uv_handle_t*) handle);
744
+ }
745
+
746
+
747
+ static int os390_message_queue_handler(uv__os390_epoll* ep) {
748
+ uv_fs_event_t* handle;
749
+ int msglen;
750
+ int events;
751
+ _RFIM msg;
752
+
753
+ if (ep->msg_queue == -1)
754
+ return 0;
755
+
756
+ msglen = msgrcv(ep->msg_queue, &msg, sizeof(msg), 0, IPC_NOWAIT);
757
+
758
+ if (msglen == -1 && errno == ENOMSG)
759
+ return 0;
760
+
761
+ if (msglen == -1)
762
+ abort();
763
+
764
+ events = 0;
765
+ if (msg.__rfim_event == _RFIM_ATTR || msg.__rfim_event == _RFIM_WRITE)
766
+ events = UV_CHANGE;
767
+ else if (msg.__rfim_event == _RFIM_RENAME || msg.__rfim_event == _RFIM_UNLINK)
768
+ events = UV_RENAME;
769
+ else if (msg.__rfim_event == 156)
770
+ /* TODO(gabylb): zos - this event should not happen, need to investigate.
771
+ *
772
+ * This event seems to occur when the watched file is [re]moved, or an
773
+ * editor (like vim) renames then creates the file on save (for vim, that's
774
+ * when backupcopy=no|auto).
775
+ */
776
+ events = UV_RENAME;
777
+ else
778
+ /* Some event that we are not interested in. */
779
+ return 0;
780
+
781
+ /* `__rfim_utok` is treated as text when it should be treated as binary while
782
+ * running in ASCII mode, resulting in an unwanted autoconversion.
783
+ */
784
+ __a2e_l(msg.__rfim_utok, sizeof(msg.__rfim_utok));
785
+ handle = *(uv_fs_event_t**)(msg.__rfim_utok);
786
+ assert(handle != NULL);
787
+
788
+ assert((handle->flags & UV_HANDLE_CLOSED) == 0);
789
+ if (uv__is_closing(handle)) {
790
+ uv__handle_stop(handle);
791
+ uv__make_close_pending((uv_handle_t*) handle);
792
+ return 0;
793
+ } else if (handle->path == NULL) {
794
+ /* _RFIS_UNREG returned EALREADY. */
795
+ uv__handle_stop(handle);
796
+ return 0;
797
+ }
798
+
799
+ /* The file is implicitly unregistered when the change notification is
800
+ * sent, only one notification is sent per registration. So we need to
801
+ * re-register interest in a file after each change notification we
802
+ * receive.
803
+ */
804
+ assert(handle->path != NULL);
805
+ os390_regfileint(handle, handle->path);
806
+ handle->cb(handle, uv__basename_r(handle->path), events, 0);
807
+ return 1;
808
+ }
809
+
810
+
811
+ void uv__io_poll(uv_loop_t* loop, int timeout) {
812
+ static const int max_safe_timeout = 1789569;
813
+ uv__loop_internal_fields_t* lfields;
814
+ struct epoll_event events[1024];
815
+ struct epoll_event* pe;
816
+ struct epoll_event e;
817
+ uv__os390_epoll* ep;
818
+ int have_signals;
819
+ int real_timeout;
820
+ struct uv__queue* q;
821
+ uv__io_t* w;
822
+ uint64_t base;
823
+ int count;
824
+ int nfds;
825
+ int fd;
826
+ int op;
827
+ int i;
828
+ int user_timeout;
829
+ int reset_timeout;
830
+
831
+ if (loop->nfds == 0) {
832
+ assert(uv__queue_empty(&loop->watcher_queue));
833
+ return;
834
+ }
835
+
836
+ lfields = uv__get_internal_fields(loop);
837
+
838
+ while (!uv__queue_empty(&loop->watcher_queue)) {
839
+ uv_stream_t* stream;
840
+
841
+ q = uv__queue_head(&loop->watcher_queue);
842
+ uv__queue_remove(q);
843
+ uv__queue_init(q);
844
+ w = uv__queue_data(q, uv__io_t, watcher_queue);
845
+
846
+ assert(w->pevents != 0);
847
+ assert(w->fd >= 0);
848
+
849
+ stream= container_of(w, uv_stream_t, io_watcher);
850
+
851
+ assert(w->fd < (int) loop->nwatchers);
852
+
853
+ e.events = w->pevents;
854
+ e.fd = w->fd;
855
+
856
+ if (w->events == 0)
857
+ op = EPOLL_CTL_ADD;
858
+ else
859
+ op = EPOLL_CTL_MOD;
860
+
861
+ /* XXX Future optimization: do EPOLL_CTL_MOD lazily if we stop watching
862
+ * events, skip the syscall and squelch the events after epoll_wait().
863
+ */
864
+ if (epoll_ctl(loop->ep, op, w->fd, &e)) {
865
+ if (errno != EEXIST)
866
+ abort();
867
+
868
+ assert(op == EPOLL_CTL_ADD);
869
+
870
+ /* We've reactivated a file descriptor that's been watched before. */
871
+ if (epoll_ctl(loop->ep, EPOLL_CTL_MOD, w->fd, &e))
872
+ abort();
873
+ }
874
+
875
+ w->events = w->pevents;
876
+ }
877
+
878
+ assert(timeout >= -1);
879
+ base = loop->time;
880
+ count = 48; /* Benchmarks suggest this gives the best throughput. */
881
+ real_timeout = timeout;
882
+ int nevents = 0;
883
+ have_signals = 0;
884
+
885
+ if (lfields->flags & UV_METRICS_IDLE_TIME) {
886
+ reset_timeout = 1;
887
+ user_timeout = timeout;
888
+ timeout = 0;
889
+ } else {
890
+ reset_timeout = 0;
891
+ }
892
+
893
+ nfds = 0;
894
+ for (;;) {
895
+ /* Only need to set the provider_entry_time if timeout != 0. The function
896
+ * will return early if the loop isn't configured with UV_METRICS_IDLE_TIME.
897
+ */
898
+ if (timeout != 0)
899
+ uv__metrics_set_provider_entry_time(loop);
900
+
901
+ if (sizeof(int32_t) == sizeof(long) && timeout >= max_safe_timeout)
902
+ timeout = max_safe_timeout;
903
+
904
+ /* Store the current timeout in a location that's globally accessible so
905
+ * other locations like uv__work_done() can determine whether the queue
906
+ * of events in the callback were waiting when poll was called.
907
+ */
908
+ lfields->current_timeout = timeout;
909
+
910
+ nfds = epoll_wait(loop->ep, events,
911
+ ARRAY_SIZE(events), timeout);
912
+
913
+ /* Update loop->time unconditionally. It's tempting to skip the update when
914
+ * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the
915
+ * operating system didn't reschedule our process while in the syscall.
916
+ */
917
+ base = loop->time;
918
+ SAVE_ERRNO(uv__update_time(loop));
919
+ if (nfds == 0) {
920
+ assert(timeout != -1);
921
+
922
+ if (reset_timeout != 0) {
923
+ timeout = user_timeout;
924
+ reset_timeout = 0;
925
+ }
926
+
927
+ if (timeout == -1)
928
+ continue;
929
+
930
+ if (timeout == 0)
931
+ return;
932
+
933
+ /* We may have been inside the system call for longer than |timeout|
934
+ * milliseconds so we need to update the timestamp to avoid drift.
935
+ */
936
+ goto update_timeout;
937
+ }
938
+
939
+ if (nfds == -1) {
940
+
941
+ if (errno != EINTR)
942
+ abort();
943
+
944
+ if (reset_timeout != 0) {
945
+ timeout = user_timeout;
946
+ reset_timeout = 0;
947
+ }
948
+
949
+ if (timeout == -1)
950
+ continue;
951
+
952
+ if (timeout == 0)
953
+ return;
954
+
955
+ /* Interrupted by a signal. Update timeout and poll again. */
956
+ goto update_timeout;
957
+ }
958
+
959
+
960
+ assert(loop->watchers != NULL);
961
+ loop->watchers[loop->nwatchers] = (void*) events;
962
+ loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds;
963
+ for (i = 0; i < nfds; i++) {
964
+ pe = events + i;
965
+ fd = pe->fd;
966
+
967
+ /* Skip invalidated events, see uv__platform_invalidate_fd */
968
+ if (fd == -1)
969
+ continue;
970
+
971
+ ep = loop->ep;
972
+ if (pe->is_msg) {
973
+ os390_message_queue_handler(ep);
974
+ nevents++;
975
+ continue;
976
+ }
977
+
978
+ assert(fd >= 0);
979
+ assert((unsigned) fd < loop->nwatchers);
980
+
981
+ w = loop->watchers[fd];
982
+
983
+ if (w == NULL) {
984
+ /* File descriptor that we've stopped watching, disarm it.
985
+ *
986
+ * Ignore all errors because we may be racing with another thread
987
+ * when the file descriptor is closed.
988
+ */
989
+ epoll_ctl(loop->ep, EPOLL_CTL_DEL, fd, pe);
990
+ continue;
991
+ }
992
+
993
+ /* Give users only events they're interested in. Prevents spurious
994
+ * callbacks when previous callback invocation in this loop has stopped
995
+ * the current watcher. Also, filters out events that users has not
996
+ * requested us to watch.
997
+ */
998
+ pe->events &= w->pevents | POLLERR | POLLHUP;
999
+
1000
+ if (pe->events == POLLERR || pe->events == POLLHUP)
1001
+ pe->events |= w->pevents & (POLLIN | POLLOUT);
1002
+
1003
+ if (pe->events != 0) {
1004
+ /* Run signal watchers last. This also affects child process watchers
1005
+ * because those are implemented in terms of signal watchers.
1006
+ */
1007
+ if (w == &loop->signal_io_watcher) {
1008
+ have_signals = 1;
1009
+ } else {
1010
+ uv__metrics_update_idle_time(loop);
1011
+ w->cb(loop, w, pe->events);
1012
+ }
1013
+ nevents++;
1014
+ }
1015
+ }
1016
+
1017
+ uv__metrics_inc_events(loop, nevents);
1018
+ if (reset_timeout != 0) {
1019
+ timeout = user_timeout;
1020
+ reset_timeout = 0;
1021
+ uv__metrics_inc_events_waiting(loop, nevents);
1022
+ }
1023
+
1024
+ if (have_signals != 0) {
1025
+ uv__metrics_update_idle_time(loop);
1026
+ loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN);
1027
+ }
1028
+
1029
+ loop->watchers[loop->nwatchers] = NULL;
1030
+ loop->watchers[loop->nwatchers + 1] = NULL;
1031
+
1032
+ if (have_signals != 0)
1033
+ return; /* Event loop should cycle now so don't poll again. */
1034
+
1035
+ if (nevents != 0) {
1036
+ if (nfds == ARRAY_SIZE(events) && --count != 0) {
1037
+ /* Poll for more events but don't block this time. */
1038
+ timeout = 0;
1039
+ continue;
1040
+ }
1041
+ return;
1042
+ }
1043
+
1044
+ if (timeout == 0)
1045
+ return;
1046
+
1047
+ if (timeout == -1)
1048
+ continue;
1049
+
1050
+ update_timeout:
1051
+ assert(timeout > 0);
1052
+
1053
+ real_timeout -= (loop->time - base);
1054
+ if (real_timeout <= 0)
1055
+ return;
1056
+
1057
+ timeout = real_timeout;
1058
+ }
1059
+ }
1060
+
1061
+
1062
+ int uv__io_fork(uv_loop_t* loop) {
1063
+ /*
1064
+ Nullify the msg queue but don't close it because
1065
+ it is still being used by the parent.
1066
+ */
1067
+ loop->ep = NULL;
1068
+
1069
+ return uv__platform_loop_init(loop);
1070
+ }