passenger_dudemeister 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1565) hide show
  1. data/DEVELOPERS.TXT +113 -0
  2. data/INSTALL +6 -0
  3. data/LICENSE +19 -0
  4. data/NEWS +429 -0
  5. data/PACKAGING.TXT +25 -0
  6. data/README +45 -0
  7. data/Rakefile +56 -0
  8. data/bin/passenger +32 -0
  9. data/bin/passenger-config +46 -0
  10. data/bin/passenger-install-apache2-module +237 -0
  11. data/bin/passenger-install-nginx-module +476 -0
  12. data/bin/passenger-make-enterprisey +82 -0
  13. data/bin/passenger-memory-stats +171 -0
  14. data/bin/passenger-status +211 -0
  15. data/build/agents.rb +80 -0
  16. data/build/apache2.rb +168 -0
  17. data/build/basics.rb +105 -0
  18. data/build/common_library.rb +268 -0
  19. data/build/config.rb +42 -0
  20. data/build/cplusplus_support.rb +61 -0
  21. data/build/cxx_tests.rb +219 -0
  22. data/build/documentation.rb +84 -0
  23. data/build/gempackagetask.rb +99 -0
  24. data/build/integration_tests.rb +64 -0
  25. data/build/misc.rb +153 -0
  26. data/build/nginx.rb +72 -0
  27. data/build/oxt_tests.rb +59 -0
  28. data/build/packagetask.rb +186 -0
  29. data/build/packaging.rb +194 -0
  30. data/build/rake_extensions.rb +182 -0
  31. data/build/rdoctask.rb +209 -0
  32. data/build/rpm.rb +98 -0
  33. data/build/ruby_extension.rb +52 -0
  34. data/build/ruby_tests.rb +49 -0
  35. data/build/test_basics.rb +43 -0
  36. data/debian/README.Debian +15 -0
  37. data/debian/changelog +185 -0
  38. data/debian/compat +1 -0
  39. data/debian/control +49 -0
  40. data/debian/copyright +20 -0
  41. data/debian/libapache2-mod-passenger.install +1 -0
  42. data/debian/libapache2-mod-passenger.postinst +36 -0
  43. data/debian/libapache2-mod-passenger.prerm +15 -0
  44. data/debian/passenger-common.install +4 -0
  45. data/debian/passenger.conf +4 -0
  46. data/debian/passenger.load +1 -0
  47. data/debian/prerm +2 -0
  48. data/debian/rules +37 -0
  49. data/debian/watch +3 -0
  50. data/dev/copy_boost_headers.rb +155 -0
  51. data/dev/find_owner_pipe_leaks.rb +128 -0
  52. data/dev/render_error_pages.rb +116 -0
  53. data/doc/ApplicationPool algorithm.txt +615 -0
  54. data/doc/Architectural overview.html +1 -0
  55. data/doc/Architectural overview.txt +334 -0
  56. data/doc/Doxyfile +241 -0
  57. data/doc/Security of user switching support.html +1 -0
  58. data/doc/Security of user switching support.txt +197 -0
  59. data/doc/Users guide Apache.html +1 -0
  60. data/doc/Users guide Apache.txt +2208 -0
  61. data/doc/Users guide Nginx.html +1 -0
  62. data/doc/Users guide Nginx.txt +1394 -0
  63. data/doc/Users guide Standalone.html +1 -0
  64. data/doc/Users guide Standalone.txt +40 -0
  65. data/doc/definitions.h +5 -0
  66. data/doc/images/by_sa.png +0 -0
  67. data/doc/images/conservative_spawning.png +0 -0
  68. data/doc/images/conservative_spawning.svg +248 -0
  69. data/doc/images/icons/README +5 -0
  70. data/doc/images/icons/callouts/1.png +0 -0
  71. data/doc/images/icons/callouts/10.png +0 -0
  72. data/doc/images/icons/callouts/11.png +0 -0
  73. data/doc/images/icons/callouts/12.png +0 -0
  74. data/doc/images/icons/callouts/13.png +0 -0
  75. data/doc/images/icons/callouts/14.png +0 -0
  76. data/doc/images/icons/callouts/15.png +0 -0
  77. data/doc/images/icons/callouts/2.png +0 -0
  78. data/doc/images/icons/callouts/3.png +0 -0
  79. data/doc/images/icons/callouts/4.png +0 -0
  80. data/doc/images/icons/callouts/5.png +0 -0
  81. data/doc/images/icons/callouts/6.png +0 -0
  82. data/doc/images/icons/callouts/7.png +0 -0
  83. data/doc/images/icons/callouts/8.png +0 -0
  84. data/doc/images/icons/callouts/9.png +0 -0
  85. data/doc/images/icons/caution.png +0 -0
  86. data/doc/images/icons/example.png +0 -0
  87. data/doc/images/icons/home.png +0 -0
  88. data/doc/images/icons/important.png +0 -0
  89. data/doc/images/icons/next.png +0 -0
  90. data/doc/images/icons/note.png +0 -0
  91. data/doc/images/icons/prev.png +0 -0
  92. data/doc/images/icons/tip.png +0 -0
  93. data/doc/images/icons/up.png +0 -0
  94. data/doc/images/icons/warning.png +0 -0
  95. data/doc/images/passenger_architecture.png +0 -0
  96. data/doc/images/passenger_architecture.svg +401 -0
  97. data/doc/images/phusion_banner.png +0 -0
  98. data/doc/images/smart-lv2.png +0 -0
  99. data/doc/images/smart-lv2.svg +320 -0
  100. data/doc/images/spawn_server_architecture.png +0 -0
  101. data/doc/images/spawn_server_architecture.svg +655 -0
  102. data/doc/images/typical_isolated_web_application.png +0 -0
  103. data/doc/images/typical_isolated_web_application.svg +213 -0
  104. data/doc/rdoc/classes/ConditionVariable.html +215 -0
  105. data/doc/rdoc/classes/Exception.html +120 -0
  106. data/doc/rdoc/classes/GC.html +113 -0
  107. data/doc/rdoc/classes/IO.html +221 -0
  108. data/doc/rdoc/classes/PhusionPassenger.html +397 -0
  109. data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +180 -0
  110. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +647 -0
  111. data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +654 -0
  112. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/InvalidPassword.html +92 -0
  113. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +97 -0
  114. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +96 -0
  115. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +97 -0
  116. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +96 -0
  117. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +619 -0
  118. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +142 -0
  119. data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats.html +368 -0
  120. data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats/Process.html +231 -0
  121. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance.html +588 -0
  122. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/CorruptedDirectoryError.html +92 -0
  123. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/GenerationsAbsentError.html +92 -0
  124. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Group.html +147 -0
  125. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Process.html +279 -0
  126. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/RoleDeniedError.html +92 -0
  127. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/StaleDirectoryError.html +92 -0
  128. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Stats.html +123 -0
  129. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/UnsupportedGenerationStructureVersionError.html +92 -0
  130. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger.html +341 -0
  131. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/Log.html +294 -0
  132. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/SharedData.html +199 -0
  133. data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +155 -0
  134. data/doc/rdoc/classes/PhusionPassenger/AppProcess.html +367 -0
  135. data/doc/rdoc/classes/PhusionPassenger/ClassicRails.html +95 -0
  136. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner.html +351 -0
  137. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner/Error.html +98 -0
  138. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/CGIFixed.html +200 -0
  139. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner.html +410 -0
  140. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner/Error.html +98 -0
  141. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/RequestHandler.html +156 -0
  142. data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions.html +115 -0
  143. data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions/AnalyticsLogging.html +202 -0
  144. data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +172 -0
  145. data/doc/rdoc/classes/PhusionPassenger/DebugLogging.html +273 -0
  146. data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +145 -0
  147. data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +162 -0
  148. data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +141 -0
  149. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +92 -0
  150. data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +673 -0
  151. data/doc/rdoc/classes/PhusionPassenger/MessageChannel/InvalidHashError.html +92 -0
  152. data/doc/rdoc/classes/PhusionPassenger/MessageClient.html +415 -0
  153. data/doc/rdoc/classes/PhusionPassenger/NativeSupportLoader.html +134 -0
  154. data/doc/rdoc/classes/PhusionPassenger/Packaging.html +129 -0
  155. data/doc/rdoc/classes/PhusionPassenger/PlatformInfo.html +1972 -0
  156. data/doc/rdoc/classes/PhusionPassenger/Plugin.html +237 -0
  157. data/doc/rdoc/classes/PhusionPassenger/Rack.html +91 -0
  158. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +312 -0
  159. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner/Error.html +98 -0
  160. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +218 -0
  161. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions.html +114 -0
  162. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging.html +259 -0
  163. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ACExtension.html +139 -0
  164. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ASBenchmarkableExtension.html +118 -0
  165. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ExceptionLogger.html +135 -0
  166. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +378 -0
  167. data/doc/rdoc/classes/PhusionPassenger/Standalone.html +111 -0
  168. data/doc/rdoc/classes/PhusionPassenger/Standalone/AppFinder.html +252 -0
  169. data/doc/rdoc/classes/PhusionPassenger/Standalone/Command.html +161 -0
  170. data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile.html +368 -0
  171. data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile/DisallowedContextError.html +132 -0
  172. data/doc/rdoc/classes/PhusionPassenger/Standalone/HelpCommand.html +151 -0
  173. data/doc/rdoc/classes/PhusionPassenger/Standalone/Main.html +189 -0
  174. data/doc/rdoc/classes/PhusionPassenger/Standalone/PackageRuntimeCommand.html +177 -0
  175. data/doc/rdoc/classes/PhusionPassenger/Standalone/RuntimeInstaller.html +341 -0
  176. data/doc/rdoc/classes/PhusionPassenger/Standalone/StartCommand.html +203 -0
  177. data/doc/rdoc/classes/PhusionPassenger/Standalone/StatusCommand.html +156 -0
  178. data/doc/rdoc/classes/PhusionPassenger/Standalone/StopCommand.html +168 -0
  179. data/doc/rdoc/classes/PhusionPassenger/Standalone/Utils.html +86 -0
  180. data/doc/rdoc/classes/PhusionPassenger/Standalone/VersionCommand.html +135 -0
  181. data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +125 -0
  182. data/doc/rdoc/classes/PhusionPassenger/Utils.html +1543 -0
  183. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher.html +204 -0
  184. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/DirInfo.html +171 -0
  185. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/FileInfo.html +140 -0
  186. data/doc/rdoc/classes/PhusionPassenger/Utils/HostsFileParser.html +260 -0
  187. data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +169 -0
  188. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput.html +265 -0
  189. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput/Tempfile.html +120 -0
  190. data/doc/rdoc/classes/PhusionPassenger/Utils/UnseekableSocket.html +561 -0
  191. data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +140 -0
  192. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +89 -0
  193. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +182 -0
  194. data/doc/rdoc/classes/Process.html +115 -0
  195. data/doc/rdoc/classes/Signal.html +139 -0
  196. data/doc/rdoc/created.rid +1 -0
  197. data/doc/rdoc/files/DEVELOPERS_TXT.html +280 -0
  198. data/doc/rdoc/files/README.html +157 -0
  199. data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +130 -0
  200. data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +135 -0
  201. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +126 -0
  202. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +128 -0
  203. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/memory_stats_rb.html +126 -0
  204. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/server_instance_rb.html +132 -0
  205. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +122 -0
  206. data/doc/rdoc/files/lib/phusion_passenger/analytics_logger_rb.html +129 -0
  207. data/doc/rdoc/files/lib/phusion_passenger/app_process_rb.html +127 -0
  208. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/application_spawner_rb.html +141 -0
  209. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/cgi_fixed_rb.html +126 -0
  210. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/framework_spawner_rb.html +146 -0
  211. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/request_handler_rb.html +125 -0
  212. data/doc/rdoc/files/lib/phusion_passenger/classic_rails_extensions/init_rb.html +132 -0
  213. data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +126 -0
  214. data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +122 -0
  215. data/doc/rdoc/files/lib/phusion_passenger/debug_logging_rb.html +122 -0
  216. data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +147 -0
  217. data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +122 -0
  218. data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +127 -0
  219. data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +120 -0
  220. data/doc/rdoc/files/lib/phusion_passenger/message_client_rb.html +127 -0
  221. data/doc/rdoc/files/lib/phusion_passenger/native_support_rb.html +132 -0
  222. data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +122 -0
  223. data/doc/rdoc/files/lib/phusion_passenger/platform_info/apache_rb.html +127 -0
  224. data/doc/rdoc/files/lib/phusion_passenger/platform_info/binary_compatibility_rb.html +129 -0
  225. data/doc/rdoc/files/lib/phusion_passenger/platform_info/compiler_rb.html +127 -0
  226. data/doc/rdoc/files/lib/phusion_passenger/platform_info/curl_rb.html +126 -0
  227. data/doc/rdoc/files/lib/phusion_passenger/platform_info/documentation_tools_rb.html +126 -0
  228. data/doc/rdoc/files/lib/phusion_passenger/platform_info/linux_rb.html +126 -0
  229. data/doc/rdoc/files/lib/phusion_passenger/platform_info/operating_system_rb.html +127 -0
  230. data/doc/rdoc/files/lib/phusion_passenger/platform_info/ruby_rb.html +128 -0
  231. data/doc/rdoc/files/lib/phusion_passenger/platform_info/zlib_rb.html +126 -0
  232. data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +122 -0
  233. data/doc/rdoc/files/lib/phusion_passenger/plugin_rb.html +127 -0
  234. data/doc/rdoc/files/lib/phusion_passenger/public_api_rb.html +127 -0
  235. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +137 -0
  236. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +125 -0
  237. data/doc/rdoc/files/lib/phusion_passenger/rails3_extensions/init_rb.html +127 -0
  238. data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +122 -0
  239. data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +160 -0
  240. data/doc/rdoc/files/lib/phusion_passenger/standalone/app_finder_rb.html +127 -0
  241. data/doc/rdoc/files/lib/phusion_passenger/standalone/command_rb.html +136 -0
  242. data/doc/rdoc/files/lib/phusion_passenger/standalone/config_file_rb.html +126 -0
  243. data/doc/rdoc/files/lib/phusion_passenger/standalone/help_command_rb.html +126 -0
  244. data/doc/rdoc/files/lib/phusion_passenger/standalone/main_rb.html +126 -0
  245. data/doc/rdoc/files/lib/phusion_passenger/standalone/package_runtime_command_rb.html +127 -0
  246. data/doc/rdoc/files/lib/phusion_passenger/standalone/runtime_installer_rb.html +133 -0
  247. data/doc/rdoc/files/lib/phusion_passenger/standalone/start_command_rb.html +136 -0
  248. data/doc/rdoc/files/lib/phusion_passenger/standalone/status_command_rb.html +126 -0
  249. data/doc/rdoc/files/lib/phusion_passenger/standalone/stop_command_rb.html +126 -0
  250. data/doc/rdoc/files/lib/phusion_passenger/standalone/utils_rb.html +126 -0
  251. data/doc/rdoc/files/lib/phusion_passenger/standalone/version_command_rb.html +127 -0
  252. data/doc/rdoc/files/lib/phusion_passenger/utils/file_system_watcher_rb.html +126 -0
  253. data/doc/rdoc/files/lib/phusion_passenger/utils/hosts_file_parser_rb.html +120 -0
  254. data/doc/rdoc/files/lib/phusion_passenger/utils/rewindable_input_rb.html +100 -0
  255. data/doc/rdoc/files/lib/phusion_passenger/utils/tmpdir_rb.html +122 -0
  256. data/doc/rdoc/files/lib/phusion_passenger/utils/unseekable_socket_rb.html +126 -0
  257. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +179 -0
  258. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +132 -0
  259. data/doc/rdoc/fr_class_index.html +138 -0
  260. data/doc/rdoc/fr_file_index.html +108 -0
  261. data/doc/rdoc/fr_method_index.html +433 -0
  262. data/doc/rdoc/index.html +26 -0
  263. data/doc/rdoc/rdoc-style.css +187 -0
  264. data/doc/template/horo.rb +613 -0
  265. data/doc/users_guide_snippets/analysis_and_system_maintenance.txt +201 -0
  266. data/doc/users_guide_snippets/appendix_a_about.txt +13 -0
  267. data/doc/users_guide_snippets/appendix_b_terminology.txt +63 -0
  268. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +303 -0
  269. data/doc/users_guide_snippets/global_queueing_explained.txt +74 -0
  270. data/doc/users_guide_snippets/passenger_spawn_method.txt +49 -0
  271. data/doc/users_guide_snippets/rackup_specifications.txt +71 -0
  272. data/doc/users_guide_snippets/tips.txt +207 -0
  273. data/doc/users_guide_snippets/under_the_hood/page_caching_support.txt +22 -0
  274. data/ext/apache2/Bucket.cpp +190 -0
  275. data/ext/apache2/Bucket.h +87 -0
  276. data/ext/apache2/Configuration.cpp +717 -0
  277. data/ext/apache2/Configuration.h +51 -0
  278. data/ext/apache2/Configuration.hpp +462 -0
  279. data/ext/apache2/DirectoryMapper.h +280 -0
  280. data/ext/apache2/HelperAgent.cpp +365 -0
  281. data/ext/apache2/Hooks.cpp +1757 -0
  282. data/ext/apache2/Hooks.h +45 -0
  283. data/ext/apache2/mod_passenger.c +44 -0
  284. data/ext/boost/algorithm/string/case_conv.hpp +176 -0
  285. data/ext/boost/algorithm/string/compare.hpp +199 -0
  286. data/ext/boost/algorithm/string/concept.hpp +83 -0
  287. data/ext/boost/algorithm/string/config.hpp +28 -0
  288. data/ext/boost/algorithm/string/constants.hpp +36 -0
  289. data/ext/boost/algorithm/string/detail/case_conv.hpp +121 -0
  290. data/ext/boost/algorithm/string/detail/find_format.hpp +204 -0
  291. data/ext/boost/algorithm/string/detail/find_format_all.hpp +273 -0
  292. data/ext/boost/algorithm/string/detail/find_format_store.hpp +89 -0
  293. data/ext/boost/algorithm/string/detail/finder.hpp +646 -0
  294. data/ext/boost/algorithm/string/detail/formatter.hpp +94 -0
  295. data/ext/boost/algorithm/string/detail/replace_storage.hpp +159 -0
  296. data/ext/boost/algorithm/string/detail/sequence.hpp +200 -0
  297. data/ext/boost/algorithm/string/detail/util.hpp +106 -0
  298. data/ext/boost/algorithm/string/erase.hpp +844 -0
  299. data/ext/boost/algorithm/string/find_format.hpp +287 -0
  300. data/ext/boost/algorithm/string/finder.hpp +270 -0
  301. data/ext/boost/algorithm/string/formatter.hpp +103 -0
  302. data/ext/boost/algorithm/string/replace.hpp +928 -0
  303. data/ext/boost/algorithm/string/sequence_traits.hpp +193 -0
  304. data/ext/boost/algorithm/string/yes_no_type.hpp +33 -0
  305. data/ext/boost/assert.hpp +50 -0
  306. data/ext/boost/bind.hpp +24 -0
  307. data/ext/boost/bind/arg.hpp +62 -0
  308. data/ext/boost/bind/bind.hpp +1751 -0
  309. data/ext/boost/bind/bind_cc.hpp +117 -0
  310. data/ext/boost/bind/bind_mf2_cc.hpp +228 -0
  311. data/ext/boost/bind/bind_mf_cc.hpp +227 -0
  312. data/ext/boost/bind/bind_template.hpp +345 -0
  313. data/ext/boost/bind/mem_fn.hpp +389 -0
  314. data/ext/boost/bind/mem_fn_cc.hpp +103 -0
  315. data/ext/boost/bind/mem_fn_template.hpp +1047 -0
  316. data/ext/boost/bind/placeholders.hpp +69 -0
  317. data/ext/boost/bind/storage.hpp +475 -0
  318. data/ext/boost/call_traits.hpp +24 -0
  319. data/ext/boost/checked_delete.hpp +69 -0
  320. data/ext/boost/concept/assert.hpp +46 -0
  321. data/ext/boost/concept/detail/backward_compatibility.hpp +16 -0
  322. data/ext/boost/concept/detail/concept_def.hpp +51 -0
  323. data/ext/boost/concept/detail/concept_undef.hpp +5 -0
  324. data/ext/boost/concept/detail/general.hpp +75 -0
  325. data/ext/boost/concept/detail/has_constraints.hpp +50 -0
  326. data/ext/boost/concept/usage.hpp +44 -0
  327. data/ext/boost/concept_check.hpp +1007 -0
  328. data/ext/boost/config.hpp +70 -0
  329. data/ext/boost/config/abi/borland_prefix.hpp +27 -0
  330. data/ext/boost/config/abi/borland_suffix.hpp +12 -0
  331. data/ext/boost/config/abi/msvc_prefix.hpp +22 -0
  332. data/ext/boost/config/abi/msvc_suffix.hpp +8 -0
  333. data/ext/boost/config/abi_prefix.hpp +25 -0
  334. data/ext/boost/config/abi_suffix.hpp +27 -0
  335. data/ext/boost/config/auto_link.hpp +420 -0
  336. data/ext/boost/config/compiler/borland.hpp +275 -0
  337. data/ext/boost/config/compiler/clang.hpp +62 -0
  338. data/ext/boost/config/compiler/codegear.hpp +177 -0
  339. data/ext/boost/config/compiler/comeau.hpp +59 -0
  340. data/ext/boost/config/compiler/common_edg.hpp +99 -0
  341. data/ext/boost/config/compiler/compaq_cxx.hpp +19 -0
  342. data/ext/boost/config/compiler/digitalmars.hpp +93 -0
  343. data/ext/boost/config/compiler/gcc.hpp +243 -0
  344. data/ext/boost/config/compiler/gcc_xml.hpp +55 -0
  345. data/ext/boost/config/compiler/greenhills.hpp +28 -0
  346. data/ext/boost/config/compiler/hp_acc.hpp +127 -0
  347. data/ext/boost/config/compiler/intel.hpp +196 -0
  348. data/ext/boost/config/compiler/kai.hpp +33 -0
  349. data/ext/boost/config/compiler/metrowerks.hpp +139 -0
  350. data/ext/boost/config/compiler/mpw.hpp +81 -0
  351. data/ext/boost/config/compiler/nvcc.hpp +86 -0
  352. data/ext/boost/config/compiler/pgi.hpp +77 -0
  353. data/ext/boost/config/compiler/sgi_mipspro.hpp +29 -0
  354. data/ext/boost/config/compiler/sunpro_cc.hpp +144 -0
  355. data/ext/boost/config/compiler/vacpp.hpp +96 -0
  356. data/ext/boost/config/compiler/visualc.hpp +274 -0
  357. data/ext/boost/config/no_tr1/cmath.hpp +28 -0
  358. data/ext/boost/config/no_tr1/complex.hpp +28 -0
  359. data/ext/boost/config/no_tr1/functional.hpp +28 -0
  360. data/ext/boost/config/no_tr1/memory.hpp +28 -0
  361. data/ext/boost/config/no_tr1/utility.hpp +28 -0
  362. data/ext/boost/config/platform/aix.hpp +33 -0
  363. data/ext/boost/config/platform/amigaos.hpp +15 -0
  364. data/ext/boost/config/platform/beos.hpp +26 -0
  365. data/ext/boost/config/platform/bsd.hpp +86 -0
  366. data/ext/boost/config/platform/cygwin.hpp +48 -0
  367. data/ext/boost/config/platform/hpux.hpp +87 -0
  368. data/ext/boost/config/platform/irix.hpp +31 -0
  369. data/ext/boost/config/platform/linux.hpp +98 -0
  370. data/ext/boost/config/platform/macos.hpp +86 -0
  371. data/ext/boost/config/platform/qnxnto.hpp +31 -0
  372. data/ext/boost/config/platform/solaris.hpp +28 -0
  373. data/ext/boost/config/platform/symbian.hpp +94 -0
  374. data/ext/boost/config/platform/vxworks.hpp +31 -0
  375. data/ext/boost/config/platform/win32.hpp +65 -0
  376. data/ext/boost/config/posix_features.hpp +95 -0
  377. data/ext/boost/config/requires_threads.hpp +92 -0
  378. data/ext/boost/config/select_compiler_config.hpp +129 -0
  379. data/ext/boost/config/select_platform_config.hpp +98 -0
  380. data/ext/boost/config/select_stdlib_config.hpp +77 -0
  381. data/ext/boost/config/stdlib/dinkumware.hpp +148 -0
  382. data/ext/boost/config/stdlib/libcomo.hpp +72 -0
  383. data/ext/boost/config/stdlib/libstdcpp3.hpp +128 -0
  384. data/ext/boost/config/stdlib/modena.hpp +56 -0
  385. data/ext/boost/config/stdlib/msl.hpp +84 -0
  386. data/ext/boost/config/stdlib/roguewave.hpp +180 -0
  387. data/ext/boost/config/stdlib/sgi.hpp +137 -0
  388. data/ext/boost/config/stdlib/stlport.hpp +237 -0
  389. data/ext/boost/config/stdlib/vacpp.hpp +44 -0
  390. data/ext/boost/config/suffix.hpp +639 -0
  391. data/ext/boost/config/user.hpp +124 -0
  392. data/ext/boost/config/warning_disable.hpp +47 -0
  393. data/ext/boost/cstdint.hpp +504 -0
  394. data/ext/boost/current_function.hpp +67 -0
  395. data/ext/boost/date_time/adjust_functors.hpp +178 -0
  396. data/ext/boost/date_time/c_time.hpp +107 -0
  397. data/ext/boost/date_time/compiler_config.hpp +171 -0
  398. data/ext/boost/date_time/constrained_value.hpp +121 -0
  399. data/ext/boost/date_time/date.hpp +208 -0
  400. data/ext/boost/date_time/date_clock_device.hpp +77 -0
  401. data/ext/boost/date_time/date_defs.hpp +26 -0
  402. data/ext/boost/date_time/date_duration.hpp +146 -0
  403. data/ext/boost/date_time/date_duration_types.hpp +269 -0
  404. data/ext/boost/date_time/date_facet.hpp +764 -0
  405. data/ext/boost/date_time/date_format_simple.hpp +159 -0
  406. data/ext/boost/date_time/date_formatting.hpp +127 -0
  407. data/ext/boost/date_time/date_formatting_limited.hpp +121 -0
  408. data/ext/boost/date_time/date_formatting_locales.hpp +233 -0
  409. data/ext/boost/date_time/date_generator_formatter.hpp +265 -0
  410. data/ext/boost/date_time/date_generator_parser.hpp +330 -0
  411. data/ext/boost/date_time/date_generators.hpp +509 -0
  412. data/ext/boost/date_time/date_iterator.hpp +101 -0
  413. data/ext/boost/date_time/date_names_put.hpp +320 -0
  414. data/ext/boost/date_time/date_parsing.hpp +316 -0
  415. data/ext/boost/date_time/dst_rules.hpp +391 -0
  416. data/ext/boost/date_time/filetime_functions.hpp +170 -0
  417. data/ext/boost/date_time/format_date_parser.hpp +743 -0
  418. data/ext/boost/date_time/gregorian/conversion.hpp +68 -0
  419. data/ext/boost/date_time/gregorian/formatters.hpp +162 -0
  420. data/ext/boost/date_time/gregorian/formatters_limited.hpp +81 -0
  421. data/ext/boost/date_time/gregorian/greg_calendar.hpp +48 -0
  422. data/ext/boost/date_time/gregorian/greg_date.hpp +136 -0
  423. data/ext/boost/date_time/gregorian/greg_day.hpp +57 -0
  424. data/ext/boost/date_time/gregorian/greg_day_of_year.hpp +38 -0
  425. data/ext/boost/date_time/gregorian/greg_duration.hpp +134 -0
  426. data/ext/boost/date_time/gregorian/greg_duration_types.hpp +43 -0
  427. data/ext/boost/date_time/gregorian/greg_month.hpp +105 -0
  428. data/ext/boost/date_time/gregorian/greg_weekday.hpp +66 -0
  429. data/ext/boost/date_time/gregorian/greg_year.hpp +53 -0
  430. data/ext/boost/date_time/gregorian/greg_ymd.hpp +33 -0
  431. data/ext/boost/date_time/gregorian/gregorian.hpp +38 -0
  432. data/ext/boost/date_time/gregorian/gregorian_io.hpp +784 -0
  433. data/ext/boost/date_time/gregorian/gregorian_types.hpp +109 -0
  434. data/ext/boost/date_time/gregorian/parsers.hpp +91 -0
  435. data/ext/boost/date_time/gregorian_calendar.hpp +70 -0
  436. data/ext/boost/date_time/gregorian_calendar.ipp +219 -0
  437. data/ext/boost/date_time/int_adapter.hpp +509 -0
  438. data/ext/boost/date_time/iso_format.hpp +303 -0
  439. data/ext/boost/date_time/locale_config.hpp +31 -0
  440. data/ext/boost/date_time/microsec_time_clock.hpp +127 -0
  441. data/ext/boost/date_time/parse_format_base.hpp +29 -0
  442. data/ext/boost/date_time/period.hpp +377 -0
  443. data/ext/boost/date_time/period_formatter.hpp +196 -0
  444. data/ext/boost/date_time/period_parser.hpp +198 -0
  445. data/ext/boost/date_time/posix_time/conversion.hpp +94 -0
  446. data/ext/boost/date_time/posix_time/date_duration_operators.hpp +114 -0
  447. data/ext/boost/date_time/posix_time/posix_time.hpp +39 -0
  448. data/ext/boost/date_time/posix_time/posix_time_config.hpp +178 -0
  449. data/ext/boost/date_time/posix_time/posix_time_duration.hpp +82 -0
  450. data/ext/boost/date_time/posix_time/posix_time_io.hpp +239 -0
  451. data/ext/boost/date_time/posix_time/posix_time_system.hpp +68 -0
  452. data/ext/boost/date_time/posix_time/posix_time_types.hpp +55 -0
  453. data/ext/boost/date_time/posix_time/ptime.hpp +65 -0
  454. data/ext/boost/date_time/posix_time/time_formatters.hpp +289 -0
  455. data/ext/boost/date_time/posix_time/time_parsers.hpp +44 -0
  456. data/ext/boost/date_time/posix_time/time_period.hpp +29 -0
  457. data/ext/boost/date_time/special_defs.hpp +25 -0
  458. data/ext/boost/date_time/special_values_formatter.hpp +96 -0
  459. data/ext/boost/date_time/special_values_parser.hpp +159 -0
  460. data/ext/boost/date_time/string_convert.hpp +33 -0
  461. data/ext/boost/date_time/string_parse_tree.hpp +278 -0
  462. data/ext/boost/date_time/strings_from_facet.hpp +125 -0
  463. data/ext/boost/date_time/time.hpp +191 -0
  464. data/ext/boost/date_time/time_clock.hpp +83 -0
  465. data/ext/boost/date_time/time_defs.hpp +43 -0
  466. data/ext/boost/date_time/time_duration.hpp +282 -0
  467. data/ext/boost/date_time/time_facet.hpp +1367 -0
  468. data/ext/boost/date_time/time_formatting_streams.hpp +122 -0
  469. data/ext/boost/date_time/time_iterator.hpp +52 -0
  470. data/ext/boost/date_time/time_parsing.hpp +321 -0
  471. data/ext/boost/date_time/time_resolution_traits.hpp +144 -0
  472. data/ext/boost/date_time/time_system_counted.hpp +254 -0
  473. data/ext/boost/date_time/time_system_split.hpp +207 -0
  474. data/ext/boost/date_time/wrapping_int.hpp +169 -0
  475. data/ext/boost/date_time/year_month_day.hpp +45 -0
  476. data/ext/boost/detail/call_traits.hpp +164 -0
  477. data/ext/boost/detail/endian.hpp +76 -0
  478. data/ext/boost/detail/indirect_traits.hpp +487 -0
  479. data/ext/boost/detail/iterator.hpp +494 -0
  480. data/ext/boost/detail/lcast_precision.hpp +184 -0
  481. data/ext/boost/detail/limits.hpp +449 -0
  482. data/ext/boost/detail/no_exceptions_support.hpp +87 -0
  483. data/ext/boost/detail/reference_content.hpp +141 -0
  484. data/ext/boost/detail/sp_typeinfo.hpp +129 -0
  485. data/ext/boost/detail/workaround.hpp +267 -0
  486. data/ext/boost/enable_shared_from_this.hpp +18 -0
  487. data/ext/boost/exception/current_exception_cast.hpp +43 -0
  488. data/ext/boost/exception/detail/attribute_noreturn.hpp +17 -0
  489. data/ext/boost/exception/detail/error_info_impl.hpp +75 -0
  490. data/ext/boost/exception/detail/exception_ptr.hpp +431 -0
  491. data/ext/boost/exception/detail/is_output_streamable.hpp +60 -0
  492. data/ext/boost/exception/detail/object_hex_dump.hpp +50 -0
  493. data/ext/boost/exception/detail/type_info.hpp +83 -0
  494. data/ext/boost/exception/diagnostic_information.hpp +184 -0
  495. data/ext/boost/exception/exception.hpp +436 -0
  496. data/ext/boost/exception/get_error_info.hpp +130 -0
  497. data/ext/boost/exception/info.hpp +200 -0
  498. data/ext/boost/exception/to_string.hpp +83 -0
  499. data/ext/boost/exception/to_string_stub.hpp +109 -0
  500. data/ext/boost/exception_ptr.hpp +11 -0
  501. data/ext/boost/function.hpp +66 -0
  502. data/ext/boost/function/detail/function_iterate.hpp +16 -0
  503. data/ext/boost/function/detail/maybe_include.hpp +267 -0
  504. data/ext/boost/function/detail/prologue.hpp +26 -0
  505. data/ext/boost/function/function_base.hpp +904 -0
  506. data/ext/boost/function/function_fwd.hpp +70 -0
  507. data/ext/boost/function/function_template.hpp +1158 -0
  508. data/ext/boost/function_equal.hpp +28 -0
  509. data/ext/boost/get_pointer.hpp +33 -0
  510. data/ext/boost/implicit_cast.hpp +29 -0
  511. data/ext/boost/integer.hpp +257 -0
  512. data/ext/boost/integer_fwd.hpp +180 -0
  513. data/ext/boost/integer_traits.hpp +261 -0
  514. data/ext/boost/io/ios_state.hpp +439 -0
  515. data/ext/boost/io_fwd.hpp +67 -0
  516. data/ext/boost/is_placeholder.hpp +31 -0
  517. data/ext/boost/iterator.hpp +59 -0
  518. data/ext/boost/iterator/detail/config_def.hpp +137 -0
  519. data/ext/boost/iterator/detail/config_undef.hpp +25 -0
  520. data/ext/boost/iterator/detail/enable_if.hpp +86 -0
  521. data/ext/boost/iterator/detail/facade_iterator_category.hpp +200 -0
  522. data/ext/boost/iterator/detail/minimum_category.hpp +116 -0
  523. data/ext/boost/iterator/interoperable.hpp +50 -0
  524. data/ext/boost/iterator/iterator_adaptor.hpp +371 -0
  525. data/ext/boost/iterator/iterator_categories.hpp +188 -0
  526. data/ext/boost/iterator/iterator_concepts.hpp +284 -0
  527. data/ext/boost/iterator/iterator_facade.hpp +878 -0
  528. data/ext/boost/iterator/iterator_traits.hpp +92 -0
  529. data/ext/boost/iterator/reverse_iterator.hpp +69 -0
  530. data/ext/boost/iterator/transform_iterator.hpp +187 -0
  531. data/ext/boost/lexical_cast.hpp +1213 -0
  532. data/ext/boost/limits.hpp +146 -0
  533. data/ext/boost/make_shared.hpp +17 -0
  534. data/ext/boost/mem_fn.hpp +24 -0
  535. data/ext/boost/memory_order.hpp +53 -0
  536. data/ext/boost/mpl/always.hpp +39 -0
  537. data/ext/boost/mpl/and.hpp +60 -0
  538. data/ext/boost/mpl/apply.hpp +229 -0
  539. data/ext/boost/mpl/apply_fwd.hpp +107 -0
  540. data/ext/boost/mpl/apply_wrap.hpp +234 -0
  541. data/ext/boost/mpl/arg.hpp +131 -0
  542. data/ext/boost/mpl/arg_fwd.hpp +28 -0
  543. data/ext/boost/mpl/assert.hpp +370 -0
  544. data/ext/boost/mpl/aux_/adl_barrier.hpp +48 -0
  545. data/ext/boost/mpl/aux_/arg_typedef.hpp +31 -0
  546. data/ext/boost/mpl/aux_/arity.hpp +39 -0
  547. data/ext/boost/mpl/aux_/arity_spec.hpp +67 -0
  548. data/ext/boost/mpl/aux_/common_name_wknd.hpp +34 -0
  549. data/ext/boost/mpl/aux_/config/adl.hpp +40 -0
  550. data/ext/boost/mpl/aux_/config/arrays.hpp +30 -0
  551. data/ext/boost/mpl/aux_/config/bcc.hpp +28 -0
  552. data/ext/boost/mpl/aux_/config/bind.hpp +33 -0
  553. data/ext/boost/mpl/aux_/config/compiler.hpp +66 -0
  554. data/ext/boost/mpl/aux_/config/ctps.hpp +30 -0
  555. data/ext/boost/mpl/aux_/config/dtp.hpp +46 -0
  556. data/ext/boost/mpl/aux_/config/eti.hpp +47 -0
  557. data/ext/boost/mpl/aux_/config/gcc.hpp +23 -0
  558. data/ext/boost/mpl/aux_/config/has_apply.hpp +32 -0
  559. data/ext/boost/mpl/aux_/config/has_xxx.hpp +34 -0
  560. data/ext/boost/mpl/aux_/config/integral.hpp +38 -0
  561. data/ext/boost/mpl/aux_/config/intel.hpp +21 -0
  562. data/ext/boost/mpl/aux_/config/lambda.hpp +32 -0
  563. data/ext/boost/mpl/aux_/config/msvc.hpp +21 -0
  564. data/ext/boost/mpl/aux_/config/msvc_typename.hpp +26 -0
  565. data/ext/boost/mpl/aux_/config/nttp.hpp +41 -0
  566. data/ext/boost/mpl/aux_/config/overload_resolution.hpp +29 -0
  567. data/ext/boost/mpl/aux_/config/pp_counter.hpp +26 -0
  568. data/ext/boost/mpl/aux_/config/preprocessor.hpp +39 -0
  569. data/ext/boost/mpl/aux_/config/static_constant.hpp +25 -0
  570. data/ext/boost/mpl/aux_/config/ttp.hpp +41 -0
  571. data/ext/boost/mpl/aux_/config/use_preprocessed.hpp +19 -0
  572. data/ext/boost/mpl/aux_/config/workaround.hpp +19 -0
  573. data/ext/boost/mpl/aux_/full_lambda.hpp +354 -0
  574. data/ext/boost/mpl/aux_/has_apply.hpp +32 -0
  575. data/ext/boost/mpl/aux_/has_type.hpp +23 -0
  576. data/ext/boost/mpl/aux_/include_preprocessed.hpp +42 -0
  577. data/ext/boost/mpl/aux_/integral_wrapper.hpp +93 -0
  578. data/ext/boost/mpl/aux_/lambda_arity_param.hpp +25 -0
  579. data/ext/boost/mpl/aux_/lambda_support.hpp +169 -0
  580. data/ext/boost/mpl/aux_/msvc_never_true.hpp +34 -0
  581. data/ext/boost/mpl/aux_/na.hpp +95 -0
  582. data/ext/boost/mpl/aux_/na_assert.hpp +34 -0
  583. data/ext/boost/mpl/aux_/na_fwd.hpp +31 -0
  584. data/ext/boost/mpl/aux_/na_spec.hpp +175 -0
  585. data/ext/boost/mpl/aux_/nested_type_wknd.hpp +48 -0
  586. data/ext/boost/mpl/aux_/nttp_decl.hpp +35 -0
  587. data/ext/boost/mpl/aux_/preprocessed/gcc/and.hpp +69 -0
  588. data/ext/boost/mpl/aux_/preprocessed/gcc/apply.hpp +169 -0
  589. data/ext/boost/mpl/aux_/preprocessed/gcc/apply_fwd.hpp +52 -0
  590. data/ext/boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp +84 -0
  591. data/ext/boost/mpl/aux_/preprocessed/gcc/arg.hpp +123 -0
  592. data/ext/boost/mpl/aux_/preprocessed/gcc/bind.hpp +561 -0
  593. data/ext/boost/mpl/aux_/preprocessed/gcc/bind_fwd.hpp +52 -0
  594. data/ext/boost/mpl/aux_/preprocessed/gcc/full_lambda.hpp +558 -0
  595. data/ext/boost/mpl/aux_/preprocessed/gcc/or.hpp +69 -0
  596. data/ext/boost/mpl/aux_/preprocessed/gcc/placeholders.hpp +105 -0
  597. data/ext/boost/mpl/aux_/preprocessed/gcc/quote.hpp +123 -0
  598. data/ext/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp +97 -0
  599. data/ext/boost/mpl/aux_/preprocessor/def_params_tail.hpp +105 -0
  600. data/ext/boost/mpl/aux_/preprocessor/enum.hpp +62 -0
  601. data/ext/boost/mpl/aux_/preprocessor/filter_params.hpp +28 -0
  602. data/ext/boost/mpl/aux_/preprocessor/params.hpp +65 -0
  603. data/ext/boost/mpl/aux_/preprocessor/sub.hpp +65 -0
  604. data/ext/boost/mpl/aux_/static_cast.hpp +27 -0
  605. data/ext/boost/mpl/aux_/template_arity.hpp +189 -0
  606. data/ext/boost/mpl/aux_/template_arity_fwd.hpp +23 -0
  607. data/ext/boost/mpl/aux_/type_wrapper.hpp +47 -0
  608. data/ext/boost/mpl/aux_/value_wknd.hpp +89 -0
  609. data/ext/boost/mpl/aux_/yes_no.hpp +58 -0
  610. data/ext/boost/mpl/bind.hpp +551 -0
  611. data/ext/boost/mpl/bind_fwd.hpp +99 -0
  612. data/ext/boost/mpl/bool.hpp +39 -0
  613. data/ext/boost/mpl/bool_fwd.hpp +33 -0
  614. data/ext/boost/mpl/eval_if.hpp +71 -0
  615. data/ext/boost/mpl/has_xxx.hpp +640 -0
  616. data/ext/boost/mpl/identity.hpp +45 -0
  617. data/ext/boost/mpl/if.hpp +135 -0
  618. data/ext/boost/mpl/int.hpp +22 -0
  619. data/ext/boost/mpl/int_fwd.hpp +27 -0
  620. data/ext/boost/mpl/integral_c.hpp +51 -0
  621. data/ext/boost/mpl/integral_c_fwd.hpp +32 -0
  622. data/ext/boost/mpl/integral_c_tag.hpp +26 -0
  623. data/ext/boost/mpl/lambda.hpp +29 -0
  624. data/ext/boost/mpl/lambda_fwd.hpp +57 -0
  625. data/ext/boost/mpl/limits/arity.hpp +21 -0
  626. data/ext/boost/mpl/logical.hpp +21 -0
  627. data/ext/boost/mpl/next.hpp +19 -0
  628. data/ext/boost/mpl/next_prior.hpp +49 -0
  629. data/ext/boost/mpl/not.hpp +51 -0
  630. data/ext/boost/mpl/or.hpp +61 -0
  631. data/ext/boost/mpl/placeholders.hpp +100 -0
  632. data/ext/boost/mpl/protect.hpp +55 -0
  633. data/ext/boost/mpl/quote.hpp +151 -0
  634. data/ext/boost/mpl/size_t.hpp +25 -0
  635. data/ext/boost/mpl/size_t_fwd.hpp +28 -0
  636. data/ext/boost/mpl/void.hpp +76 -0
  637. data/ext/boost/mpl/void_fwd.hpp +26 -0
  638. data/ext/boost/next_prior.hpp +51 -0
  639. data/ext/boost/non_type.hpp +27 -0
  640. data/ext/boost/noncopyable.hpp +36 -0
  641. data/ext/boost/none.hpp +28 -0
  642. data/ext/boost/none_t.hpp +24 -0
  643. data/ext/boost/operators.hpp +976 -0
  644. data/ext/boost/optional.hpp +18 -0
  645. data/ext/boost/optional/optional.hpp +924 -0
  646. data/ext/boost/optional/optional_fwd.hpp +22 -0
  647. data/ext/boost/preprocessor/arithmetic/add.hpp +51 -0
  648. data/ext/boost/preprocessor/arithmetic/dec.hpp +288 -0
  649. data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
  650. data/ext/boost/preprocessor/arithmetic/inc.hpp +288 -0
  651. data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
  652. data/ext/boost/preprocessor/arithmetic/sub.hpp +50 -0
  653. data/ext/boost/preprocessor/array/data.hpp +28 -0
  654. data/ext/boost/preprocessor/array/elem.hpp +29 -0
  655. data/ext/boost/preprocessor/array/size.hpp +28 -0
  656. data/ext/boost/preprocessor/cat.hpp +35 -0
  657. data/ext/boost/preprocessor/comma_if.hpp +17 -0
  658. data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
  659. data/ext/boost/preprocessor/config/config.hpp +70 -0
  660. data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
  661. data/ext/boost/preprocessor/control/detail/while.hpp +536 -0
  662. data/ext/boost/preprocessor/control/expr_iif.hpp +31 -0
  663. data/ext/boost/preprocessor/control/if.hpp +30 -0
  664. data/ext/boost/preprocessor/control/iif.hpp +34 -0
  665. data/ext/boost/preprocessor/control/while.hpp +312 -0
  666. data/ext/boost/preprocessor/debug/error.hpp +33 -0
  667. data/ext/boost/preprocessor/detail/auto_rec.hpp +293 -0
  668. data/ext/boost/preprocessor/detail/check.hpp +48 -0
  669. data/ext/boost/preprocessor/detail/is_binary.hpp +30 -0
  670. data/ext/boost/preprocessor/empty.hpp +17 -0
  671. data/ext/boost/preprocessor/enum.hpp +17 -0
  672. data/ext/boost/preprocessor/enum_params.hpp +17 -0
  673. data/ext/boost/preprocessor/facilities/empty.hpp +21 -0
  674. data/ext/boost/preprocessor/facilities/identity.hpp +23 -0
  675. data/ext/boost/preprocessor/identity.hpp +17 -0
  676. data/ext/boost/preprocessor/inc.hpp +17 -0
  677. data/ext/boost/preprocessor/iterate.hpp +17 -0
  678. data/ext/boost/preprocessor/iteration/detail/bounds/lower1.hpp +99 -0
  679. data/ext/boost/preprocessor/iteration/detail/bounds/upper1.hpp +99 -0
  680. data/ext/boost/preprocessor/iteration/detail/iter/forward1.hpp +1342 -0
  681. data/ext/boost/preprocessor/iteration/iterate.hpp +82 -0
  682. data/ext/boost/preprocessor/list/adt.hpp +73 -0
  683. data/ext/boost/preprocessor/list/append.hpp +40 -0
  684. data/ext/boost/preprocessor/list/detail/fold_left.hpp +279 -0
  685. data/ext/boost/preprocessor/list/detail/fold_right.hpp +277 -0
  686. data/ext/boost/preprocessor/list/fold_left.hpp +303 -0
  687. data/ext/boost/preprocessor/list/fold_right.hpp +40 -0
  688. data/ext/boost/preprocessor/list/for_each_i.hpp +65 -0
  689. data/ext/boost/preprocessor/list/reverse.hpp +40 -0
  690. data/ext/boost/preprocessor/list/transform.hpp +49 -0
  691. data/ext/boost/preprocessor/logical/and.hpp +30 -0
  692. data/ext/boost/preprocessor/logical/bitand.hpp +38 -0
  693. data/ext/boost/preprocessor/logical/bool.hpp +288 -0
  694. data/ext/boost/preprocessor/logical/compl.hpp +36 -0
  695. data/ext/boost/preprocessor/logical/not.hpp +30 -0
  696. data/ext/boost/preprocessor/punctuation/comma.hpp +21 -0
  697. data/ext/boost/preprocessor/punctuation/comma_if.hpp +31 -0
  698. data/ext/boost/preprocessor/repeat.hpp +17 -0
  699. data/ext/boost/preprocessor/repetition/detail/for.hpp +536 -0
  700. data/ext/boost/preprocessor/repetition/enum.hpp +66 -0
  701. data/ext/boost/preprocessor/repetition/enum_binary_params.hpp +54 -0
  702. data/ext/boost/preprocessor/repetition/enum_params.hpp +41 -0
  703. data/ext/boost/preprocessor/repetition/enum_trailing_params.hpp +38 -0
  704. data/ext/boost/preprocessor/repetition/for.hpp +306 -0
  705. data/ext/boost/preprocessor/repetition/repeat.hpp +825 -0
  706. data/ext/boost/preprocessor/repetition/repeat_from_to.hpp +87 -0
  707. data/ext/boost/preprocessor/seq/cat.hpp +48 -0
  708. data/ext/boost/preprocessor/seq/elem.hpp +304 -0
  709. data/ext/boost/preprocessor/seq/enum.hpp +288 -0
  710. data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
  711. data/ext/boost/preprocessor/seq/for_each_i.hpp +61 -0
  712. data/ext/boost/preprocessor/seq/seq.hpp +44 -0
  713. data/ext/boost/preprocessor/seq/size.hpp +548 -0
  714. data/ext/boost/preprocessor/seq/transform.hpp +48 -0
  715. data/ext/boost/preprocessor/slot/detail/def.hpp +49 -0
  716. data/ext/boost/preprocessor/slot/detail/shared.hpp +247 -0
  717. data/ext/boost/preprocessor/slot/slot.hpp +32 -0
  718. data/ext/boost/preprocessor/stringize.hpp +33 -0
  719. data/ext/boost/preprocessor/tuple/eat.hpp +57 -0
  720. data/ext/boost/preprocessor/tuple/elem.hpp +385 -0
  721. data/ext/boost/preprocessor/tuple/rem.hpp +72 -0
  722. data/ext/boost/preprocessor/tuple/to_list.hpp +62 -0
  723. data/ext/boost/range/algorithm/equal.hpp +188 -0
  724. data/ext/boost/range/as_literal.hpp +127 -0
  725. data/ext/boost/range/begin.hpp +132 -0
  726. data/ext/boost/range/concepts.hpp +331 -0
  727. data/ext/boost/range/config.hpp +54 -0
  728. data/ext/boost/range/const_iterator.hpp +67 -0
  729. data/ext/boost/range/detail/common.hpp +117 -0
  730. data/ext/boost/range/detail/extract_optional_type.hpp +52 -0
  731. data/ext/boost/range/detail/implementation_help.hpp +103 -0
  732. data/ext/boost/range/detail/misc_concept.hpp +33 -0
  733. data/ext/boost/range/detail/sfinae.hpp +77 -0
  734. data/ext/boost/range/detail/str_types.hpp +38 -0
  735. data/ext/boost/range/difference_type.hpp +29 -0
  736. data/ext/boost/range/distance.hpp +34 -0
  737. data/ext/boost/range/empty.hpp +34 -0
  738. data/ext/boost/range/end.hpp +131 -0
  739. data/ext/boost/range/functions.hpp +27 -0
  740. data/ext/boost/range/iterator.hpp +72 -0
  741. data/ext/boost/range/iterator_range.hpp +16 -0
  742. data/ext/boost/range/iterator_range_core.hpp +542 -0
  743. data/ext/boost/range/iterator_range_io.hpp +93 -0
  744. data/ext/boost/range/mutable_iterator.hpp +67 -0
  745. data/ext/boost/range/rbegin.hpp +65 -0
  746. data/ext/boost/range/rend.hpp +65 -0
  747. data/ext/boost/range/reverse_iterator.hpp +40 -0
  748. data/ext/boost/range/size.hpp +36 -0
  749. data/ext/boost/range/size_type.hpp +79 -0
  750. data/ext/boost/range/value_type.hpp +34 -0
  751. data/ext/boost/ref.hpp +189 -0
  752. data/ext/boost/scoped_array.hpp +16 -0
  753. data/ext/boost/scoped_ptr.hpp +16 -0
  754. data/ext/boost/shared_array.hpp +19 -0
  755. data/ext/boost/shared_ptr.hpp +19 -0
  756. data/ext/boost/smart_ptr/bad_weak_ptr.hpp +59 -0
  757. data/ext/boost/smart_ptr/detail/atomic_count.hpp +119 -0
  758. data/ext/boost/smart_ptr/detail/atomic_count_gcc.hpp +72 -0
  759. data/ext/boost/smart_ptr/detail/atomic_count_gcc_x86.hpp +77 -0
  760. data/ext/boost/smart_ptr/detail/atomic_count_pthreads.hpp +96 -0
  761. data/ext/boost/smart_ptr/detail/atomic_count_solaris.hpp +59 -0
  762. data/ext/boost/smart_ptr/detail/atomic_count_sync.hpp +61 -0
  763. data/ext/boost/smart_ptr/detail/atomic_count_win32.hpp +63 -0
  764. data/ext/boost/smart_ptr/detail/operator_bool.hpp +56 -0
  765. data/ext/boost/smart_ptr/detail/shared_count.hpp +444 -0
  766. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +76 -0
  767. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +70 -0
  768. data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +150 -0
  769. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +170 -0
  770. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +158 -0
  771. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +157 -0
  772. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +172 -0
  773. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +181 -0
  774. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +166 -0
  775. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +173 -0
  776. data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +107 -0
  777. data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +135 -0
  778. data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +113 -0
  779. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +131 -0
  780. data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +155 -0
  781. data/ext/boost/smart_ptr/detail/sp_counted_base_w32.hpp +130 -0
  782. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +231 -0
  783. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +49 -0
  784. data/ext/boost/smart_ptr/detail/spinlock.hpp +53 -0
  785. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +85 -0
  786. data/ext/boost/smart_ptr/detail/spinlock_nt.hpp +89 -0
  787. data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +87 -0
  788. data/ext/boost/smart_ptr/detail/spinlock_pt.hpp +79 -0
  789. data/ext/boost/smart_ptr/detail/spinlock_sync.hpp +87 -0
  790. data/ext/boost/smart_ptr/detail/yield_k.hpp +149 -0
  791. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +79 -0
  792. data/ext/boost/smart_ptr/make_shared.hpp +508 -0
  793. data/ext/boost/smart_ptr/scoped_array.hpp +107 -0
  794. data/ext/boost/smart_ptr/scoped_ptr.hpp +131 -0
  795. data/ext/boost/smart_ptr/shared_array.hpp +147 -0
  796. data/ext/boost/smart_ptr/shared_ptr.hpp +701 -0
  797. data/ext/boost/smart_ptr/weak_ptr.hpp +230 -0
  798. data/ext/boost/src/pthread/once.cpp +51 -0
  799. data/ext/boost/src/pthread/thread.cpp +616 -0
  800. data/ext/boost/src/pthread/timeconv.inl +133 -0
  801. data/ext/boost/src/tss_null.cpp +34 -0
  802. data/ext/boost/static_assert.hpp +132 -0
  803. data/ext/boost/thread.hpp +26 -0
  804. data/ext/boost/thread/barrier.hpp +64 -0
  805. data/ext/boost/thread/condition.hpp +16 -0
  806. data/ext/boost/thread/condition_variable.hpp +21 -0
  807. data/ext/boost/thread/detail/config.hpp +100 -0
  808. data/ext/boost/thread/detail/force_cast.hpp +39 -0
  809. data/ext/boost/thread/detail/move.hpp +60 -0
  810. data/ext/boost/thread/detail/platform.hpp +71 -0
  811. data/ext/boost/thread/detail/singleton.hpp +59 -0
  812. data/ext/boost/thread/detail/thread.hpp +540 -0
  813. data/ext/boost/thread/detail/thread_group.hpp +108 -0
  814. data/ext/boost/thread/detail/thread_heap_alloc.hpp +23 -0
  815. data/ext/boost/thread/detail/thread_interruption.hpp +35 -0
  816. data/ext/boost/thread/detail/tss_hooks.hpp +65 -0
  817. data/ext/boost/thread/exceptions.hpp +223 -0
  818. data/ext/boost/thread/future.hpp +1375 -0
  819. data/ext/boost/thread/locks.hpp +1585 -0
  820. data/ext/boost/thread/mutex.hpp +21 -0
  821. data/ext/boost/thread/once.hpp +33 -0
  822. data/ext/boost/thread/pthread/condition_variable.hpp +179 -0
  823. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +102 -0
  824. data/ext/boost/thread/pthread/mutex.hpp +236 -0
  825. data/ext/boost/thread/pthread/once.hpp +95 -0
  826. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +54 -0
  827. data/ext/boost/thread/pthread/recursive_mutex.hpp +345 -0
  828. data/ext/boost/thread/pthread/shared_mutex.hpp +303 -0
  829. data/ext/boost/thread/pthread/thread_data.hpp +129 -0
  830. data/ext/boost/thread/pthread/thread_heap_alloc.hpp +242 -0
  831. data/ext/boost/thread/pthread/timespec.hpp +36 -0
  832. data/ext/boost/thread/recursive_mutex.hpp +21 -0
  833. data/ext/boost/thread/shared_mutex.hpp +21 -0
  834. data/ext/boost/thread/thread.hpp +27 -0
  835. data/ext/boost/thread/thread_time.hpp +50 -0
  836. data/ext/boost/thread/tss.hpp +113 -0
  837. data/ext/boost/thread/xtime.hpp +92 -0
  838. data/ext/boost/throw_exception.hpp +91 -0
  839. data/ext/boost/token_functions.hpp +641 -0
  840. data/ext/boost/token_iterator.hpp +128 -0
  841. data/ext/boost/tokenizer.hpp +98 -0
  842. data/ext/boost/type.hpp +18 -0
  843. data/ext/boost/type_traits/add_const.hpp +47 -0
  844. data/ext/boost/type_traits/add_pointer.hpp +72 -0
  845. data/ext/boost/type_traits/add_reference.hpp +107 -0
  846. data/ext/boost/type_traits/add_volatile.hpp +47 -0
  847. data/ext/boost/type_traits/alignment_of.hpp +128 -0
  848. data/ext/boost/type_traits/broken_compiler_spec.hpp +117 -0
  849. data/ext/boost/type_traits/composite_traits.hpp +29 -0
  850. data/ext/boost/type_traits/config.hpp +76 -0
  851. data/ext/boost/type_traits/conversion_traits.hpp +17 -0
  852. data/ext/boost/type_traits/detail/bool_trait_def.hpp +173 -0
  853. data/ext/boost/type_traits/detail/bool_trait_undef.hpp +27 -0
  854. data/ext/boost/type_traits/detail/cv_traits_impl.hpp +97 -0
  855. data/ext/boost/type_traits/detail/false_result.hpp +28 -0
  856. data/ext/boost/type_traits/detail/ice_and.hpp +35 -0
  857. data/ext/boost/type_traits/detail/ice_eq.hpp +36 -0
  858. data/ext/boost/type_traits/detail/ice_not.hpp +31 -0
  859. data/ext/boost/type_traits/detail/ice_or.hpp +34 -0
  860. data/ext/boost/type_traits/detail/is_function_ptr_helper.hpp +220 -0
  861. data/ext/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp +817 -0
  862. data/ext/boost/type_traits/detail/size_t_trait_def.hpp +58 -0
  863. data/ext/boost/type_traits/detail/size_t_trait_undef.hpp +16 -0
  864. data/ext/boost/type_traits/detail/template_arity_spec.hpp +31 -0
  865. data/ext/boost/type_traits/detail/type_trait_def.hpp +61 -0
  866. data/ext/boost/type_traits/detail/type_trait_undef.hpp +19 -0
  867. data/ext/boost/type_traits/detail/yes_no_type.hpp +26 -0
  868. data/ext/boost/type_traits/function_traits.hpp +236 -0
  869. data/ext/boost/type_traits/has_nothrow_copy.hpp +39 -0
  870. data/ext/boost/type_traits/has_trivial_copy.hpp +49 -0
  871. data/ext/boost/type_traits/has_trivial_destructor.hpp +42 -0
  872. data/ext/boost/type_traits/ice.hpp +20 -0
  873. data/ext/boost/type_traits/integral_constant.hpp +53 -0
  874. data/ext/boost/type_traits/intrinsics.hpp +240 -0
  875. data/ext/boost/type_traits/is_abstract.hpp +153 -0
  876. data/ext/boost/type_traits/is_arithmetic.hpp +51 -0
  877. data/ext/boost/type_traits/is_array.hpp +91 -0
  878. data/ext/boost/type_traits/is_base_and_derived.hpp +254 -0
  879. data/ext/boost/type_traits/is_base_of.hpp +51 -0
  880. data/ext/boost/type_traits/is_class.hpp +140 -0
  881. data/ext/boost/type_traits/is_const.hpp +165 -0
  882. data/ext/boost/type_traits/is_convertible.hpp +430 -0
  883. data/ext/boost/type_traits/is_enum.hpp +189 -0
  884. data/ext/boost/type_traits/is_float.hpp +27 -0
  885. data/ext/boost/type_traits/is_function.hpp +106 -0
  886. data/ext/boost/type_traits/is_fundamental.hpp +45 -0
  887. data/ext/boost/type_traits/is_integral.hpp +78 -0
  888. data/ext/boost/type_traits/is_lvalue_reference.hpp +118 -0
  889. data/ext/boost/type_traits/is_member_function_pointer.hpp +136 -0
  890. data/ext/boost/type_traits/is_member_pointer.hpp +116 -0
  891. data/ext/boost/type_traits/is_pod.hpp +135 -0
  892. data/ext/boost/type_traits/is_pointer.hpp +162 -0
  893. data/ext/boost/type_traits/is_reference.hpp +45 -0
  894. data/ext/boost/type_traits/is_rvalue_reference.hpp +29 -0
  895. data/ext/boost/type_traits/is_same.hpp +103 -0
  896. data/ext/boost/type_traits/is_scalar.hpp +55 -0
  897. data/ext/boost/type_traits/is_signed.hpp +135 -0
  898. data/ext/boost/type_traits/is_union.hpp +49 -0
  899. data/ext/boost/type_traits/is_unsigned.hpp +130 -0
  900. data/ext/boost/type_traits/is_void.hpp +38 -0
  901. data/ext/boost/type_traits/is_volatile.hpp +152 -0
  902. data/ext/boost/type_traits/make_unsigned.hpp +137 -0
  903. data/ext/boost/type_traits/remove_const.hpp +90 -0
  904. data/ext/boost/type_traits/remove_cv.hpp +83 -0
  905. data/ext/boost/type_traits/remove_pointer.hpp +43 -0
  906. data/ext/boost/type_traits/remove_reference.hpp +70 -0
  907. data/ext/boost/type_traits/type_with_alignment.hpp +393 -0
  908. data/ext/boost/units/detail/utility.hpp +104 -0
  909. data/ext/boost/utility.hpp +20 -0
  910. data/ext/boost/utility/addressof.hpp +102 -0
  911. data/ext/boost/utility/base_from_member.hpp +87 -0
  912. data/ext/boost/utility/binary.hpp +708 -0
  913. data/ext/boost/utility/compare_pointees.hpp +68 -0
  914. data/ext/boost/utility/enable_if.hpp +119 -0
  915. data/ext/boost/visit_each.hpp +29 -0
  916. data/ext/boost/weak_ptr.hpp +18 -0
  917. data/ext/common/AbstractSpawnManager.h +110 -0
  918. data/ext/common/Account.h +175 -0
  919. data/ext/common/AccountsDatabase.cpp +81 -0
  920. data/ext/common/AccountsDatabase.h +130 -0
  921. data/ext/common/AgentBase.cpp +323 -0
  922. data/ext/common/AgentBase.h +39 -0
  923. data/ext/common/AgentsStarter.cpp +154 -0
  924. data/ext/common/AgentsStarter.h +81 -0
  925. data/ext/common/AgentsStarter.hpp +646 -0
  926. data/ext/common/ApplicationPool/Client.h +796 -0
  927. data/ext/common/ApplicationPool/Interface.h +295 -0
  928. data/ext/common/ApplicationPool/Pool.h +1327 -0
  929. data/ext/common/ApplicationPool/Server.h +475 -0
  930. data/ext/common/BCrypt.cpp +343 -0
  931. data/ext/common/BCrypt.h +73 -0
  932. data/ext/common/Blowfish.c +685 -0
  933. data/ext/common/Blowfish.h +103 -0
  934. data/ext/common/Constants.h +48 -0
  935. data/ext/common/EventedClient.h +702 -0
  936. data/ext/common/EventedMessageServer.h +327 -0
  937. data/ext/common/EventedServer.h +295 -0
  938. data/ext/common/Exceptions.h +348 -0
  939. data/ext/common/FileDescriptor.h +293 -0
  940. data/ext/common/HelperAgent/BacktracesServer.h +59 -0
  941. data/ext/common/IniFile.h +488 -0
  942. data/ext/common/Logging.cpp +64 -0
  943. data/ext/common/Logging.h +695 -0
  944. data/ext/common/LoggingAgent/ChangeNotifier.h +63 -0
  945. data/ext/common/LoggingAgent/DataStoreId.h +177 -0
  946. data/ext/common/LoggingAgent/LoggingServer.h +1343 -0
  947. data/ext/common/LoggingAgent/Main.cpp +278 -0
  948. data/ext/common/LoggingAgent/RemoteSender.h +468 -0
  949. data/ext/common/MessageChannel.h +737 -0
  950. data/ext/common/MessageClient.h +297 -0
  951. data/ext/common/MessageReadersWriters.h +508 -0
  952. data/ext/common/MessageServer.h +581 -0
  953. data/ext/common/PoolOptions.h +518 -0
  954. data/ext/common/Process.h +255 -0
  955. data/ext/common/RandomGenerator.h +160 -0
  956. data/ext/common/ResourceLocator.h +134 -0
  957. data/ext/common/SafeLibev.h +149 -0
  958. data/ext/common/ServerInstanceDir.h +347 -0
  959. data/ext/common/Session.h +470 -0
  960. data/ext/common/SpawnManager.h +616 -0
  961. data/ext/common/StaticString.h +298 -0
  962. data/ext/common/StringListCreator.h +83 -0
  963. data/ext/common/Utils.cpp +972 -0
  964. data/ext/common/Utils.h +428 -0
  965. data/ext/common/Utils/Base64.cpp +143 -0
  966. data/ext/common/Utils/Base64.h +83 -0
  967. data/ext/common/Utils/BlockingQueue.h +136 -0
  968. data/ext/common/Utils/BufferedIO.h +196 -0
  969. data/ext/common/Utils/CachedFileStat.cpp +62 -0
  970. data/ext/common/Utils/CachedFileStat.h +51 -0
  971. data/ext/common/Utils/CachedFileStat.hpp +243 -0
  972. data/ext/common/Utils/FileChangeChecker.h +209 -0
  973. data/ext/common/Utils/IOUtils.cpp +913 -0
  974. data/ext/common/Utils/IOUtils.h +370 -0
  975. data/ext/common/Utils/MD5.cpp +406 -0
  976. data/ext/common/Utils/MD5.h +98 -0
  977. data/ext/common/Utils/MemZeroGuard.h +103 -0
  978. data/ext/common/Utils/ProcessMetricsCollector.h +590 -0
  979. data/ext/common/Utils/ScopeGuard.h +72 -0
  980. data/ext/common/Utils/StrIntUtils.cpp +363 -0
  981. data/ext/common/Utils/StrIntUtils.h +231 -0
  982. data/ext/common/Utils/SystemTime.cpp +37 -0
  983. data/ext/common/Utils/SystemTime.h +201 -0
  984. data/ext/common/Utils/Timer.h +152 -0
  985. data/ext/common/Utils/VariantMap.h +363 -0
  986. data/ext/common/Utils/utf8.h +35 -0
  987. data/ext/common/Utils/utf8/checked.h +324 -0
  988. data/ext/common/Utils/utf8/core.h +359 -0
  989. data/ext/common/Utils/utf8/unchecked.h +229 -0
  990. data/ext/common/Watchdog.cpp +1001 -0
  991. data/ext/google/COPYING +28 -0
  992. data/ext/google/ChangeLog +167 -0
  993. data/ext/google/dense_hash_map +310 -0
  994. data/ext/google/dense_hash_set +287 -0
  995. data/ext/google/sparse_hash_map +294 -0
  996. data/ext/google/sparse_hash_set +275 -0
  997. data/ext/google/sparsehash/densehashtable.h +1062 -0
  998. data/ext/google/sparsehash/sparseconfig.h +55 -0
  999. data/ext/google/sparsehash/sparsehashtable.h +1015 -0
  1000. data/ext/google/sparsetable +1468 -0
  1001. data/ext/google/type_traits.h +250 -0
  1002. data/ext/libev/Changes +302 -0
  1003. data/ext/libev/LICENSE +36 -0
  1004. data/ext/libev/Makefile.am +18 -0
  1005. data/ext/libev/Makefile.in +685 -0
  1006. data/ext/libev/README +58 -0
  1007. data/ext/libev/aclocal.m4 +7549 -0
  1008. data/ext/libev/autogen.sh +6 -0
  1009. data/ext/libev/config.guess +1526 -0
  1010. data/ext/libev/config.h.in +121 -0
  1011. data/ext/libev/config.sub +1658 -0
  1012. data/ext/libev/configure +22156 -0
  1013. data/ext/libev/configure.ac +18 -0
  1014. data/ext/libev/ev++.h +800 -0
  1015. data/ext/libev/ev.c +3694 -0
  1016. data/ext/libev/ev.h +705 -0
  1017. data/ext/libev/ev_epoll.c +228 -0
  1018. data/ext/libev/ev_kqueue.c +196 -0
  1019. data/ext/libev/ev_poll.c +144 -0
  1020. data/ext/libev/ev_port.c +165 -0
  1021. data/ext/libev/ev_select.c +308 -0
  1022. data/ext/libev/ev_vars.h +187 -0
  1023. data/ext/libev/ev_win32.c +153 -0
  1024. data/ext/libev/ev_wrap.h +178 -0
  1025. data/ext/libev/event.c +401 -0
  1026. data/ext/libev/event.h +158 -0
  1027. data/ext/libev/install-sh +294 -0
  1028. data/ext/libev/libev.m4 +38 -0
  1029. data/ext/libev/ltmain.sh +6871 -0
  1030. data/ext/libev/missing +336 -0
  1031. data/ext/libev/mkinstalldirs +111 -0
  1032. data/ext/nginx/Configuration.c +1454 -0
  1033. data/ext/nginx/Configuration.h +94 -0
  1034. data/ext/nginx/ContentHandler.c +1360 -0
  1035. data/ext/nginx/ContentHandler.h +64 -0
  1036. data/ext/nginx/HelperAgent.cpp +988 -0
  1037. data/ext/nginx/HttpStatusExtractor.h +351 -0
  1038. data/ext/nginx/ScgiRequestParser.h +375 -0
  1039. data/ext/nginx/StaticContentHandler.c +256 -0
  1040. data/ext/nginx/StaticContentHandler.h +37 -0
  1041. data/ext/nginx/config +56 -0
  1042. data/ext/nginx/ngx_http_passenger_module.c +499 -0
  1043. data/ext/nginx/ngx_http_passenger_module.h +63 -0
  1044. data/ext/oxt/backtrace.cpp +185 -0
  1045. data/ext/oxt/backtrace.hpp +135 -0
  1046. data/ext/oxt/detail/backtrace_disabled.hpp +39 -0
  1047. data/ext/oxt/detail/backtrace_enabled.hpp +156 -0
  1048. data/ext/oxt/detail/spin_lock_darwin.hpp +69 -0
  1049. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +81 -0
  1050. data/ext/oxt/detail/spin_lock_portable.hpp +38 -0
  1051. data/ext/oxt/detail/spin_lock_pthreads.hpp +97 -0
  1052. data/ext/oxt/detail/tracable_exception_disabled.hpp +46 -0
  1053. data/ext/oxt/detail/tracable_exception_enabled.hpp +48 -0
  1054. data/ext/oxt/dynamic_thread_group.hpp +195 -0
  1055. data/ext/oxt/macros.hpp +58 -0
  1056. data/ext/oxt/spin_lock.hpp +57 -0
  1057. data/ext/oxt/system_calls.cpp +477 -0
  1058. data/ext/oxt/system_calls.hpp +260 -0
  1059. data/ext/oxt/thread.cpp +32 -0
  1060. data/ext/oxt/thread.hpp +370 -0
  1061. data/ext/oxt/tracable_exception.cpp +87 -0
  1062. data/ext/oxt/tracable_exception.hpp +35 -0
  1063. data/ext/ruby/extconf.rb +41 -0
  1064. data/ext/ruby/passenger_native_support.c +1037 -0
  1065. data/helper-scripts/passenger-spawn-server +106 -0
  1066. data/helper-scripts/prespawn +63 -0
  1067. data/lib/phusion_passenger.rb +107 -0
  1068. data/lib/phusion_passenger/abstract_installer.rb +234 -0
  1069. data/lib/phusion_passenger/abstract_request_handler.rb +738 -0
  1070. data/lib/phusion_passenger/abstract_server.rb +372 -0
  1071. data/lib/phusion_passenger/abstract_server_collection.rb +335 -0
  1072. data/lib/phusion_passenger/admin_tools.rb +48 -0
  1073. data/lib/phusion_passenger/admin_tools/memory_stats.rb +299 -0
  1074. data/lib/phusion_passenger/admin_tools/server_instance.rb +334 -0
  1075. data/lib/phusion_passenger/analytics_logger.rb +342 -0
  1076. data/lib/phusion_passenger/app_process.rb +162 -0
  1077. data/lib/phusion_passenger/classic_rails/application_spawner.rb +344 -0
  1078. data/lib/phusion_passenger/classic_rails/cgi_fixed.rb +68 -0
  1079. data/lib/phusion_passenger/classic_rails/framework_spawner.rb +311 -0
  1080. data/lib/phusion_passenger/classic_rails/request_handler.rb +75 -0
  1081. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_base_extension.rb +65 -0
  1082. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_benchmarking_extension.rb +48 -0
  1083. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_rescue_extension.rb +59 -0
  1084. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ar_abstract_adapter_extension.rb +54 -0
  1085. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/as_cache_extension.rb +130 -0
  1086. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/av_benchmark_helper_extension.rb +47 -0
  1087. data/lib/phusion_passenger/classic_rails_extensions/init.rb +123 -0
  1088. data/lib/phusion_passenger/console_text_template.rb +66 -0
  1089. data/lib/phusion_passenger/constants.rb +35 -0
  1090. data/lib/phusion_passenger/debug_logging.rb +104 -0
  1091. data/lib/phusion_passenger/dependencies.rb +633 -0
  1092. data/lib/phusion_passenger/exceptions.rb +103 -0
  1093. data/lib/phusion_passenger/html_template.rb +107 -0
  1094. data/lib/phusion_passenger/message_channel.rb +387 -0
  1095. data/lib/phusion_passenger/message_client.rb +173 -0
  1096. data/lib/phusion_passenger/native_support.rb +166 -0
  1097. data/lib/phusion_passenger/packaging.rb +108 -0
  1098. data/lib/phusion_passenger/platform_info.rb +248 -0
  1099. data/lib/phusion_passenger/platform_info/apache.rb +332 -0
  1100. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +175 -0
  1101. data/lib/phusion_passenger/platform_info/compiler.rb +183 -0
  1102. data/lib/phusion_passenger/platform_info/curl.rb +61 -0
  1103. data/lib/phusion_passenger/platform_info/documentation_tools.rb +35 -0
  1104. data/lib/phusion_passenger/platform_info/linux.rb +77 -0
  1105. data/lib/phusion_passenger/platform_info/operating_system.rb +158 -0
  1106. data/lib/phusion_passenger/platform_info/ruby.rb +338 -0
  1107. data/lib/phusion_passenger/platform_info/zlib.rb +38 -0
  1108. data/lib/phusion_passenger/plugin.rb +96 -0
  1109. data/lib/phusion_passenger/public_api.rb +112 -0
  1110. data/lib/phusion_passenger/rack/application_spawner.rb +227 -0
  1111. data/lib/phusion_passenger/rack/request_handler.rb +145 -0
  1112. data/lib/phusion_passenger/rails3_extensions/init.rb +207 -0
  1113. data/lib/phusion_passenger/simple_benchmarking.rb +52 -0
  1114. data/lib/phusion_passenger/spawn_manager.rb +359 -0
  1115. data/lib/phusion_passenger/standalone/app_finder.rb +153 -0
  1116. data/lib/phusion_passenger/standalone/command.rb +241 -0
  1117. data/lib/phusion_passenger/standalone/config_file.rb +119 -0
  1118. data/lib/phusion_passenger/standalone/help_command.rb +57 -0
  1119. data/lib/phusion_passenger/standalone/main.rb +101 -0
  1120. data/lib/phusion_passenger/standalone/package_runtime_command.rb +92 -0
  1121. data/lib/phusion_passenger/standalone/runtime_installer.rb +479 -0
  1122. data/lib/phusion_passenger/standalone/start_command.rb +514 -0
  1123. data/lib/phusion_passenger/standalone/status_command.rb +62 -0
  1124. data/lib/phusion_passenger/standalone/stop_command.rb +74 -0
  1125. data/lib/phusion_passenger/standalone/utils.rb +46 -0
  1126. data/lib/phusion_passenger/standalone/version_command.rb +42 -0
  1127. data/lib/phusion_passenger/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +9 -0
  1128. data/lib/phusion_passenger/templates/apache2/config_snippets.txt.erb +13 -0
  1129. data/lib/phusion_passenger/templates/apache2/deployment_example.txt.erb +23 -0
  1130. data/lib/phusion_passenger/templates/apache2/no_write_permission_to_passenger_root.txt.erb +9 -0
  1131. data/lib/phusion_passenger/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +11 -0
  1132. data/lib/phusion_passenger/templates/apache2/run_installer_as_root.txt.erb +8 -0
  1133. data/lib/phusion_passenger/templates/apache2/welcome.txt.erb +15 -0
  1134. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +38 -0
  1135. data/lib/phusion_passenger/templates/app_init_error.html.erb +64 -0
  1136. data/lib/phusion_passenger/templates/database_error.html.erb +66 -0
  1137. data/lib/phusion_passenger/templates/error_layout.css +97 -0
  1138. data/lib/phusion_passenger/templates/error_layout.html.erb +39 -0
  1139. data/lib/phusion_passenger/templates/framework_init_error.html.erb +39 -0
  1140. data/lib/phusion_passenger/templates/general_error.html.erb +22 -0
  1141. data/lib/phusion_passenger/templates/load_error.html.erb +46 -0
  1142. data/lib/phusion_passenger/templates/nginx/ask_for_extra_configure_flags.txt.erb +8 -0
  1143. data/lib/phusion_passenger/templates/nginx/cannot_write_to_dir.txt.erb +11 -0
  1144. data/lib/phusion_passenger/templates/nginx/config_snippets.txt.erb +17 -0
  1145. data/lib/phusion_passenger/templates/nginx/config_snippets_inserted.txt.erb +20 -0
  1146. data/lib/phusion_passenger/templates/nginx/confirm_extra_configure_flags.txt.erb +5 -0
  1147. data/lib/phusion_passenger/templates/nginx/deployment_example.txt.erb +22 -0
  1148. data/lib/phusion_passenger/templates/nginx/pcre_could_not_be_downloaded.txt.erb +11 -0
  1149. data/lib/phusion_passenger/templates/nginx/pcre_could_not_be_extracted.txt.erb +11 -0
  1150. data/lib/phusion_passenger/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +11 -0
  1151. data/lib/phusion_passenger/templates/nginx/possible_solutions_for_download_and_extraction_problems.txt.erb +20 -0
  1152. data/lib/phusion_passenger/templates/nginx/query_download_and_install.txt.erb +21 -0
  1153. data/lib/phusion_passenger/templates/nginx/run_installer_as_root.txt.erb +8 -0
  1154. data/lib/phusion_passenger/templates/nginx/welcome.txt.erb +15 -0
  1155. data/lib/phusion_passenger/templates/standalone/cannot_write_to_dir.txt.erb +11 -0
  1156. data/lib/phusion_passenger/templates/standalone/config.erb +94 -0
  1157. data/lib/phusion_passenger/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +17 -0
  1158. data/lib/phusion_passenger/templates/standalone/run_installer_as_root.txt.erb +8 -0
  1159. data/lib/phusion_passenger/templates/standalone/welcome.txt.erb +8 -0
  1160. data/lib/phusion_passenger/templates/standalone_default_root/index.html +1 -0
  1161. data/lib/phusion_passenger/templates/version_not_found.html.erb +34 -0
  1162. data/lib/phusion_passenger/utils.rb +1080 -0
  1163. data/lib/phusion_passenger/utils/file_system_watcher.rb +186 -0
  1164. data/lib/phusion_passenger/utils/hosts_file_parser.rb +130 -0
  1165. data/lib/phusion_passenger/utils/rewindable_input.rb +125 -0
  1166. data/lib/phusion_passenger/utils/tmpdir.rb +70 -0
  1167. data/lib/phusion_passenger/utils/unseekable_socket.rb +196 -0
  1168. data/lib/phusion_passenger/wsgi/application_spawner.rb +108 -0
  1169. data/lib/phusion_passenger/wsgi/request_handler.py +199 -0
  1170. data/man/passenger-config.1 +29 -0
  1171. data/man/passenger-make-enterprisey.8 +23 -0
  1172. data/man/passenger-memory-stats.8 +33 -0
  1173. data/man/passenger-status.8 +43 -0
  1174. data/man/passenger-stress-test.1 +43 -0
  1175. data/resources/mime.types +73 -0
  1176. data/resources/union_station_gateway.crt +32 -0
  1177. data/test/config.yml.example +41 -0
  1178. data/test/cxx/ApplicationPool_PoolTest.cpp +33 -0
  1179. data/test/cxx/ApplicationPool_PoolTestCases.cpp +1029 -0
  1180. data/test/cxx/ApplicationPool_ServerTest.cpp +308 -0
  1181. data/test/cxx/ApplicationPool_Server_PoolTest.cpp +80 -0
  1182. data/test/cxx/Base64Test.cpp +50 -0
  1183. data/test/cxx/BufferedIOTest.cpp +364 -0
  1184. data/test/cxx/CachedFileStatTest.cpp +402 -0
  1185. data/test/cxx/CxxTestMain.cpp +122 -0
  1186. data/test/cxx/EventedClientTest.cpp +523 -0
  1187. data/test/cxx/FileChangeCheckerTest.cpp +329 -0
  1188. data/test/cxx/FileDescriptorTest.cpp +69 -0
  1189. data/test/cxx/HttpStatusExtractorTest.cpp +198 -0
  1190. data/test/cxx/IOUtilsTest.cpp +796 -0
  1191. data/test/cxx/LoggingTest.cpp +914 -0
  1192. data/test/cxx/MessageChannelTest.cpp +557 -0
  1193. data/test/cxx/MessageReadersWritersTest.cpp +574 -0
  1194. data/test/cxx/MessageServerTest.cpp +383 -0
  1195. data/test/cxx/PoolOptionsTest.cpp +116 -0
  1196. data/test/cxx/ProcessMetricsCollectorTest.cpp +121 -0
  1197. data/test/cxx/ScgiRequestParserTest.cpp +389 -0
  1198. data/test/cxx/ServerInstanceDirTest.cpp +186 -0
  1199. data/test/cxx/SpawnManagerTest.cpp +161 -0
  1200. data/test/cxx/StaticStringTest.cpp +220 -0
  1201. data/test/cxx/SystemTimeTest.cpp +37 -0
  1202. data/test/cxx/TestSupport.cpp +166 -0
  1203. data/test/cxx/TestSupport.h +254 -0
  1204. data/test/cxx/UtilsTest.cpp +491 -0
  1205. data/test/cxx/VariantMapTest.cpp +179 -0
  1206. data/test/integration_tests/apache2_tests.rb +666 -0
  1207. data/test/integration_tests/cgi_environment_spec.rb +26 -0
  1208. data/test/integration_tests/hello_world_rack_spec.rb +36 -0
  1209. data/test/integration_tests/hello_world_wsgi_spec.rb +41 -0
  1210. data/test/integration_tests/mycook_spec.rb +166 -0
  1211. data/test/integration_tests/nginx_tests.rb +260 -0
  1212. data/test/integration_tests/spec_helper.rb +19 -0
  1213. data/test/oxt/backtrace_test.cpp +88 -0
  1214. data/test/oxt/counter.hpp +55 -0
  1215. data/test/oxt/dynamic_thread_group_test.cpp +131 -0
  1216. data/test/oxt/oxt_test_main.cpp +25 -0
  1217. data/test/oxt/spin_lock_test.cpp +59 -0
  1218. data/test/oxt/syscall_interruption_test.cpp +38 -0
  1219. data/test/ruby/abstract_request_handler_spec.rb +406 -0
  1220. data/test/ruby/abstract_server_collection_spec.rb +247 -0
  1221. data/test/ruby/abstract_server_spec.rb +61 -0
  1222. data/test/ruby/admin_tools_spec.rb +362 -0
  1223. data/test/ruby/analytics_logger_spec.rb +253 -0
  1224. data/test/ruby/app_process_spec.rb +43 -0
  1225. data/test/ruby/classic_rails/application_spawner_spec.rb +89 -0
  1226. data/test/ruby/classic_rails/framework_spawner_spec.rb +92 -0
  1227. data/test/ruby/debug_logging_spec.rb +141 -0
  1228. data/test/ruby/message_channel_spec.rb +196 -0
  1229. data/test/ruby/rack/application_spawner_spec.rb +116 -0
  1230. data/test/ruby/shared/abstract_server_spec.rb +23 -0
  1231. data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +375 -0
  1232. data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +38 -0
  1233. data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +19 -0
  1234. data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +15 -0
  1235. data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +27 -0
  1236. data/test/ruby/shared/spawners/preloading_spawner_spec.rb +29 -0
  1237. data/test/ruby/shared/spawners/reload_all_spec.rb +36 -0
  1238. data/test/ruby/shared/spawners/reload_single_spec.rb +52 -0
  1239. data/test/ruby/shared/spawners/spawn_server_spec.rb +28 -0
  1240. data/test/ruby/shared/spawners/spawner_spec.rb +273 -0
  1241. data/test/ruby/shared/utils/pseudo_io_spec.rb +60 -0
  1242. data/test/ruby/spawn_manager_spec.rb +134 -0
  1243. data/test/ruby/spec_helper.rb +104 -0
  1244. data/test/ruby/utils/file_system_watcher_spec.rb +221 -0
  1245. data/test/ruby/utils/hosts_file_parser.rb +258 -0
  1246. data/test/ruby/utils/unseekable_socket_spec.rb +66 -0
  1247. data/test/ruby/utils_spec.rb +748 -0
  1248. data/test/ruby/wsgi/application_spawner_spec.rb +50 -0
  1249. data/test/stub/apache2/httpd.conf.erb +86 -0
  1250. data/test/stub/apache2/mime.types +748 -0
  1251. data/test/stub/garbage1.dat +0 -0
  1252. data/test/stub/garbage2.dat +0 -0
  1253. data/test/stub/garbage3.dat +0 -0
  1254. data/test/stub/http_request.yml +23 -0
  1255. data/test/stub/message_channel.rb +11 -0
  1256. data/test/stub/message_channel_2.rb +12 -0
  1257. data/test/stub/message_channel_3.rb +19 -0
  1258. data/test/stub/nginx/koi-utf +109 -0
  1259. data/test/stub/nginx/koi-win +103 -0
  1260. data/test/stub/nginx/mime.types +70 -0
  1261. data/test/stub/nginx/nginx.conf.erb +58 -0
  1262. data/test/stub/nginx/win-utf +126 -0
  1263. data/test/stub/rack/config.ru +4 -0
  1264. data/test/stub/rack/public/rack.jpg +0 -0
  1265. data/test/stub/rails_apps/1.2/empty/Rakefile +10 -0
  1266. data/test/stub/rails_apps/1.2/empty/app/controllers/application.rb +7 -0
  1267. data/test/stub/rails_apps/1.2/empty/app/helpers/application_helper.rb +3 -0
  1268. data/test/stub/rails_apps/1.2/empty/config/boot.rb +108 -0
  1269. data/test/stub/rails_apps/1.2/empty/config/database.yml +31 -0
  1270. data/test/stub/rails_apps/1.2/empty/config/environment.rb +66 -0
  1271. data/test/stub/rails_apps/1.2/empty/config/environments/development.rb +21 -0
  1272. data/test/stub/rails_apps/1.2/empty/config/environments/production.rb +18 -0
  1273. data/test/stub/rails_apps/1.2/empty/config/environments/staging.rb +18 -0
  1274. data/test/stub/rails_apps/1.2/empty/config/environments/test.rb +19 -0
  1275. data/test/stub/rails_apps/1.2/empty/config/routes.rb +23 -0
  1276. data/test/stub/rails_apps/1.2/empty/doc/README_FOR_APP +2 -0
  1277. data/test/stub/rails_apps/1.2/empty/public/404.html +30 -0
  1278. data/test/stub/rails_apps/1.2/empty/public/500.html +30 -0
  1279. data/test/stub/rails_apps/1.2/empty/public/dispatch.cgi +10 -0
  1280. data/test/stub/rails_apps/1.2/empty/public/dispatch.fcgi +24 -0
  1281. data/test/stub/rails_apps/1.2/empty/public/dispatch.rb +10 -0
  1282. data/test/stub/rails_apps/1.2/empty/public/favicon.ico +0 -0
  1283. data/test/stub/rails_apps/1.2/empty/public/images/rails.png +0 -0
  1284. data/test/stub/rails_apps/1.2/empty/public/robots.txt +1 -0
  1285. data/test/stub/rails_apps/1.2/empty/script/about +3 -0
  1286. data/test/stub/rails_apps/1.2/empty/script/breakpointer +3 -0
  1287. data/test/stub/rails_apps/1.2/empty/script/console +3 -0
  1288. data/test/stub/rails_apps/1.2/empty/script/destroy +3 -0
  1289. data/test/stub/rails_apps/1.2/empty/script/generate +3 -0
  1290. data/test/stub/rails_apps/1.2/empty/script/performance/benchmarker +3 -0
  1291. data/test/stub/rails_apps/1.2/empty/script/performance/profiler +3 -0
  1292. data/test/stub/rails_apps/1.2/empty/script/plugin +3 -0
  1293. data/test/stub/rails_apps/1.2/empty/script/process/inspector +3 -0
  1294. data/test/stub/rails_apps/1.2/empty/script/process/reaper +3 -0
  1295. data/test/stub/rails_apps/1.2/empty/script/process/spawner +3 -0
  1296. data/test/stub/rails_apps/1.2/empty/script/runner +3 -0
  1297. data/test/stub/rails_apps/1.2/empty/script/server +3 -0
  1298. data/test/stub/rails_apps/1.2/empty/test/test_helper.rb +28 -0
  1299. data/test/stub/rails_apps/2.0/empty/Rakefile +10 -0
  1300. data/test/stub/rails_apps/2.0/empty/app/controllers/application.rb +10 -0
  1301. data/test/stub/rails_apps/2.0/empty/app/helpers/application_helper.rb +3 -0
  1302. data/test/stub/rails_apps/2.0/empty/config/boot.rb +108 -0
  1303. data/test/stub/rails_apps/2.0/empty/config/database.yml +31 -0
  1304. data/test/stub/rails_apps/2.0/empty/config/environment.rb +59 -0
  1305. data/test/stub/rails_apps/2.0/empty/config/environments/development.rb +18 -0
  1306. data/test/stub/rails_apps/2.0/empty/config/environments/production.rb +18 -0
  1307. data/test/stub/rails_apps/2.0/empty/config/environments/staging.rb +18 -0
  1308. data/test/stub/rails_apps/2.0/empty/config/environments/test.rb +22 -0
  1309. data/test/stub/rails_apps/2.0/empty/config/initializers/inflections.rb +10 -0
  1310. data/test/stub/rails_apps/2.0/empty/config/initializers/mime_types.rb +5 -0
  1311. data/test/stub/rails_apps/2.0/empty/config/routes.rb +35 -0
  1312. data/test/stub/rails_apps/2.0/empty/doc/README_FOR_APP +2 -0
  1313. data/test/stub/rails_apps/2.0/empty/public/404.html +30 -0
  1314. data/test/stub/rails_apps/2.0/empty/public/422.html +30 -0
  1315. data/test/stub/rails_apps/2.0/empty/public/500.html +30 -0
  1316. data/test/stub/rails_apps/2.0/empty/public/dispatch.cgi +10 -0
  1317. data/test/stub/rails_apps/2.0/empty/public/dispatch.fcgi +24 -0
  1318. data/test/stub/rails_apps/2.0/empty/public/dispatch.rb +10 -0
  1319. data/test/stub/rails_apps/2.0/empty/public/favicon.ico +0 -0
  1320. data/test/stub/rails_apps/2.0/empty/public/images/rails.png +0 -0
  1321. data/test/stub/rails_apps/2.0/empty/public/robots.txt +5 -0
  1322. data/test/stub/rails_apps/2.0/empty/script/about +3 -0
  1323. data/test/stub/rails_apps/2.0/empty/script/console +3 -0
  1324. data/test/stub/rails_apps/2.0/empty/script/destroy +3 -0
  1325. data/test/stub/rails_apps/2.0/empty/script/generate +3 -0
  1326. data/test/stub/rails_apps/2.0/empty/script/performance/benchmarker +3 -0
  1327. data/test/stub/rails_apps/2.0/empty/script/performance/profiler +3 -0
  1328. data/test/stub/rails_apps/2.0/empty/script/performance/request +3 -0
  1329. data/test/stub/rails_apps/2.0/empty/script/plugin +3 -0
  1330. data/test/stub/rails_apps/2.0/empty/script/process/inspector +3 -0
  1331. data/test/stub/rails_apps/2.0/empty/script/process/reaper +3 -0
  1332. data/test/stub/rails_apps/2.0/empty/script/process/spawner +3 -0
  1333. data/test/stub/rails_apps/2.0/empty/script/runner +3 -0
  1334. data/test/stub/rails_apps/2.0/empty/script/server +3 -0
  1335. data/test/stub/rails_apps/2.0/empty/test/test_helper.rb +38 -0
  1336. data/test/stub/rails_apps/2.2/empty/Rakefile +10 -0
  1337. data/test/stub/rails_apps/2.2/empty/app/controllers/application.rb +15 -0
  1338. data/test/stub/rails_apps/2.2/empty/app/helpers/application_helper.rb +3 -0
  1339. data/test/stub/rails_apps/2.2/empty/config/boot.rb +109 -0
  1340. data/test/stub/rails_apps/2.2/empty/config/database.yml +31 -0
  1341. data/test/stub/rails_apps/2.2/empty/config/environment.rb +75 -0
  1342. data/test/stub/rails_apps/2.2/empty/config/environments/development.rb +17 -0
  1343. data/test/stub/rails_apps/2.2/empty/config/environments/production.rb +24 -0
  1344. data/test/stub/rails_apps/2.2/empty/config/environments/staging.rb +24 -0
  1345. data/test/stub/rails_apps/2.2/empty/config/environments/test.rb +22 -0
  1346. data/test/stub/rails_apps/2.2/empty/config/initializers/inflections.rb +10 -0
  1347. data/test/stub/rails_apps/2.2/empty/config/initializers/mime_types.rb +5 -0
  1348. data/test/stub/rails_apps/2.2/empty/config/initializers/new_rails_defaults.rb +17 -0
  1349. data/test/stub/rails_apps/2.2/empty/config/locales/en.yml +5 -0
  1350. data/test/stub/rails_apps/2.2/empty/config/routes.rb +43 -0
  1351. data/test/stub/rails_apps/2.2/empty/doc/README_FOR_APP +5 -0
  1352. data/test/stub/rails_apps/2.2/empty/public/404.html +30 -0
  1353. data/test/stub/rails_apps/2.2/empty/public/422.html +30 -0
  1354. data/test/stub/rails_apps/2.2/empty/public/500.html +33 -0
  1355. data/test/stub/rails_apps/2.2/empty/public/dispatch.cgi +10 -0
  1356. data/test/stub/rails_apps/2.2/empty/public/dispatch.fcgi +24 -0
  1357. data/test/stub/rails_apps/2.2/empty/public/dispatch.rb +10 -0
  1358. data/test/stub/rails_apps/2.2/empty/public/favicon.ico +0 -0
  1359. data/test/stub/rails_apps/2.2/empty/public/images/rails.png +0 -0
  1360. data/test/stub/rails_apps/2.2/empty/public/robots.txt +5 -0
  1361. data/test/stub/rails_apps/2.2/empty/script/about +4 -0
  1362. data/test/stub/rails_apps/2.2/empty/script/console +3 -0
  1363. data/test/stub/rails_apps/2.2/empty/script/dbconsole +3 -0
  1364. data/test/stub/rails_apps/2.2/empty/script/destroy +3 -0
  1365. data/test/stub/rails_apps/2.2/empty/script/generate +3 -0
  1366. data/test/stub/rails_apps/2.2/empty/script/performance/benchmarker +3 -0
  1367. data/test/stub/rails_apps/2.2/empty/script/performance/profiler +3 -0
  1368. data/test/stub/rails_apps/2.2/empty/script/performance/request +3 -0
  1369. data/test/stub/rails_apps/2.2/empty/script/plugin +3 -0
  1370. data/test/stub/rails_apps/2.2/empty/script/process/inspector +3 -0
  1371. data/test/stub/rails_apps/2.2/empty/script/process/reaper +3 -0
  1372. data/test/stub/rails_apps/2.2/empty/script/process/spawner +3 -0
  1373. data/test/stub/rails_apps/2.2/empty/script/runner +3 -0
  1374. data/test/stub/rails_apps/2.2/empty/script/server +3 -0
  1375. data/test/stub/rails_apps/2.2/empty/test/performance/browsing_test.rb +9 -0
  1376. data/test/stub/rails_apps/2.2/empty/test/test_helper.rb +38 -0
  1377. data/test/stub/rails_apps/2.3/empty/Rakefile +10 -0
  1378. data/test/stub/rails_apps/2.3/empty/app/controllers/application_controller.rb +10 -0
  1379. data/test/stub/rails_apps/2.3/empty/app/helpers/application_helper.rb +3 -0
  1380. data/test/stub/rails_apps/2.3/empty/config/boot.rb +110 -0
  1381. data/test/stub/rails_apps/2.3/empty/config/database.yml +31 -0
  1382. data/test/stub/rails_apps/2.3/empty/config/environment.rb +41 -0
  1383. data/test/stub/rails_apps/2.3/empty/config/environments/development.rb +17 -0
  1384. data/test/stub/rails_apps/2.3/empty/config/environments/production.rb +28 -0
  1385. data/test/stub/rails_apps/2.3/empty/config/environments/staging.rb +28 -0
  1386. data/test/stub/rails_apps/2.3/empty/config/environments/test.rb +28 -0
  1387. data/test/stub/rails_apps/2.3/empty/config/initializers/backtrace_silencers.rb +7 -0
  1388. data/test/stub/rails_apps/2.3/empty/config/initializers/inflections.rb +10 -0
  1389. data/test/stub/rails_apps/2.3/empty/config/initializers/mime_types.rb +5 -0
  1390. data/test/stub/rails_apps/2.3/empty/config/initializers/new_rails_defaults.rb +21 -0
  1391. data/test/stub/rails_apps/2.3/empty/config/initializers/session_store.rb +15 -0
  1392. data/test/stub/rails_apps/2.3/empty/config/locales/en.yml +5 -0
  1393. data/test/stub/rails_apps/2.3/empty/config/routes.rb +43 -0
  1394. data/test/stub/rails_apps/2.3/empty/db/seeds.rb +7 -0
  1395. data/test/stub/rails_apps/2.3/empty/doc/README_FOR_APP +2 -0
  1396. data/test/stub/rails_apps/2.3/empty/public/404.html +30 -0
  1397. data/test/stub/rails_apps/2.3/empty/public/422.html +30 -0
  1398. data/test/stub/rails_apps/2.3/empty/public/500.html +30 -0
  1399. data/test/stub/rails_apps/2.3/empty/public/favicon.ico +0 -0
  1400. data/test/stub/rails_apps/2.3/empty/public/images/rails.png +0 -0
  1401. data/test/stub/rails_apps/2.3/empty/public/robots.txt +5 -0
  1402. data/test/stub/rails_apps/2.3/empty/script/about +4 -0
  1403. data/test/stub/rails_apps/2.3/empty/script/console +3 -0
  1404. data/test/stub/rails_apps/2.3/empty/script/dbconsole +3 -0
  1405. data/test/stub/rails_apps/2.3/empty/script/destroy +3 -0
  1406. data/test/stub/rails_apps/2.3/empty/script/generate +3 -0
  1407. data/test/stub/rails_apps/2.3/empty/script/performance/benchmarker +3 -0
  1408. data/test/stub/rails_apps/2.3/empty/script/performance/profiler +3 -0
  1409. data/test/stub/rails_apps/2.3/empty/script/plugin +3 -0
  1410. data/test/stub/rails_apps/2.3/empty/script/runner +3 -0
  1411. data/test/stub/rails_apps/2.3/empty/script/server +3 -0
  1412. data/test/stub/rails_apps/2.3/empty/test/performance/browsing_test.rb +9 -0
  1413. data/test/stub/rails_apps/2.3/empty/test/test_helper.rb +38 -0
  1414. data/test/stub/rails_apps/2.3/foobar/Rakefile +10 -0
  1415. data/test/stub/rails_apps/2.3/foobar/app/controllers/application_controller.rb +12 -0
  1416. data/test/stub/rails_apps/2.3/foobar/app/controllers/bar_controller_1.rb +5 -0
  1417. data/test/stub/rails_apps/2.3/foobar/app/controllers/bar_controller_2.rb +5 -0
  1418. data/test/stub/rails_apps/2.3/foobar/app/controllers/foo_controller.rb +21 -0
  1419. data/test/stub/rails_apps/2.3/foobar/app/helpers/application_helper.rb +3 -0
  1420. data/test/stub/rails_apps/2.3/foobar/config/boot.rb +110 -0
  1421. data/test/stub/rails_apps/2.3/foobar/config/database.yml +19 -0
  1422. data/test/stub/rails_apps/2.3/foobar/config/environment.rb +59 -0
  1423. data/test/stub/rails_apps/2.3/foobar/config/environments/development.rb +17 -0
  1424. data/test/stub/rails_apps/2.3/foobar/config/environments/production.rb +18 -0
  1425. data/test/stub/rails_apps/2.3/foobar/config/environments/staging.rb +18 -0
  1426. data/test/stub/rails_apps/2.3/foobar/config/initializers/inflections.rb +10 -0
  1427. data/test/stub/rails_apps/2.3/foobar/config/initializers/mime_types.rb +5 -0
  1428. data/test/stub/rails_apps/2.3/foobar/config/routes.rb +35 -0
  1429. data/test/stub/rails_apps/2.3/foobar/script/about +3 -0
  1430. data/test/stub/rails_apps/2.3/foobar/script/console +3 -0
  1431. data/test/stub/rails_apps/2.3/foobar/script/dbconsole +3 -0
  1432. data/test/stub/rails_apps/2.3/foobar/script/destroy +3 -0
  1433. data/test/stub/rails_apps/2.3/foobar/script/generate +3 -0
  1434. data/test/stub/rails_apps/2.3/foobar/script/performance/benchmarker +3 -0
  1435. data/test/stub/rails_apps/2.3/foobar/script/performance/profiler +3 -0
  1436. data/test/stub/rails_apps/2.3/foobar/script/performance/request +3 -0
  1437. data/test/stub/rails_apps/2.3/foobar/script/plugin +3 -0
  1438. data/test/stub/rails_apps/2.3/foobar/script/process/inspector +3 -0
  1439. data/test/stub/rails_apps/2.3/foobar/script/process/reaper +3 -0
  1440. data/test/stub/rails_apps/2.3/foobar/script/process/spawner +3 -0
  1441. data/test/stub/rails_apps/2.3/foobar/script/runner +3 -0
  1442. data/test/stub/rails_apps/2.3/foobar/script/server +3 -0
  1443. data/test/stub/rails_apps/2.3/mycook/Rakefile +10 -0
  1444. data/test/stub/rails_apps/2.3/mycook/app/controllers/application_controller.rb +12 -0
  1445. data/test/stub/rails_apps/2.3/mycook/app/controllers/recipes_controller.rb +5 -0
  1446. data/test/stub/rails_apps/2.3/mycook/app/controllers/uploads_controller.rb +15 -0
  1447. data/test/stub/rails_apps/2.3/mycook/app/controllers/welcome_controller.rb +71 -0
  1448. data/test/stub/rails_apps/2.3/mycook/app/helpers/application_helper.rb +3 -0
  1449. data/test/stub/rails_apps/2.3/mycook/app/views/layouts/default.rhtml +26 -0
  1450. data/test/stub/rails_apps/2.3/mycook/app/views/recipes/create.rhtml +13 -0
  1451. data/test/stub/rails_apps/2.3/mycook/app/views/recipes/index.rhtml +3 -0
  1452. data/test/stub/rails_apps/2.3/mycook/app/views/recipes/new.rhtml +8 -0
  1453. data/test/stub/rails_apps/2.3/mycook/app/views/uploads/index.rhtml +1 -0
  1454. data/test/stub/rails_apps/2.3/mycook/app/views/uploads/new.html.erb +8 -0
  1455. data/test/stub/rails_apps/2.3/mycook/app/views/welcome/cached.rhtml +1 -0
  1456. data/test/stub/rails_apps/2.3/mycook/app/views/welcome/index.rhtml +20 -0
  1457. data/test/stub/rails_apps/2.3/mycook/config/boot.rb +110 -0
  1458. data/test/stub/rails_apps/2.3/mycook/config/database.yml +19 -0
  1459. data/test/stub/rails_apps/2.3/mycook/config/environment.rb +61 -0
  1460. data/test/stub/rails_apps/2.3/mycook/config/environments/development.rb +18 -0
  1461. data/test/stub/rails_apps/2.3/mycook/config/environments/production.rb +19 -0
  1462. data/test/stub/rails_apps/2.3/mycook/config/initializers/inflections.rb +10 -0
  1463. data/test/stub/rails_apps/2.3/mycook/config/initializers/mime_types.rb +5 -0
  1464. data/test/stub/rails_apps/2.3/mycook/config/routes.rb +38 -0
  1465. data/test/stub/rails_apps/2.3/mycook/log/useless.txt +1 -0
  1466. data/test/stub/rails_apps/2.3/mycook/public/404.html +30 -0
  1467. data/test/stub/rails_apps/2.3/mycook/public/422.html +30 -0
  1468. data/test/stub/rails_apps/2.3/mycook/public/500.html +30 -0
  1469. data/test/stub/rails_apps/2.3/mycook/public/dispatch.cgi +10 -0
  1470. data/test/stub/rails_apps/2.3/mycook/public/dispatch.fcgi +24 -0
  1471. data/test/stub/rails_apps/2.3/mycook/public/dispatch.rb +10 -0
  1472. data/test/stub/rails_apps/2.3/mycook/public/favicon.ico +0 -0
  1473. data/test/stub/rails_apps/2.3/mycook/public/images/angrywizard.gif +0 -0
  1474. data/test/stub/rails_apps/2.3/mycook/public/images/cookbook.gif +0 -0
  1475. data/test/stub/rails_apps/2.3/mycook/public/images/header.png +0 -0
  1476. data/test/stub/rails_apps/2.3/mycook/public/images/rails.png +0 -0
  1477. data/test/stub/rails_apps/2.3/mycook/public/javascripts/application.js +2 -0
  1478. data/test/stub/rails_apps/2.3/mycook/public/javascripts/controls.js +963 -0
  1479. data/test/stub/rails_apps/2.3/mycook/public/javascripts/dragdrop.js +973 -0
  1480. data/test/stub/rails_apps/2.3/mycook/public/javascripts/effects.js +1128 -0
  1481. data/test/stub/rails_apps/2.3/mycook/public/javascripts/prototype.js +4320 -0
  1482. data/test/stub/rails_apps/2.3/mycook/public/robots.txt +5 -0
  1483. data/test/stub/rails_apps/2.3/mycook/public/uploads.html +26 -0
  1484. data/test/stub/rails_apps/2.3/mycook/public/welcome/cached.html +26 -0
  1485. data/test/stub/rails_apps/2.3/mycook/script/about +3 -0
  1486. data/test/stub/rails_apps/2.3/mycook/script/console +3 -0
  1487. data/test/stub/rails_apps/2.3/mycook/script/dbconsole +3 -0
  1488. data/test/stub/rails_apps/2.3/mycook/script/destroy +3 -0
  1489. data/test/stub/rails_apps/2.3/mycook/script/generate +3 -0
  1490. data/test/stub/rails_apps/2.3/mycook/script/performance/benchmarker +3 -0
  1491. data/test/stub/rails_apps/2.3/mycook/script/performance/profiler +3 -0
  1492. data/test/stub/rails_apps/2.3/mycook/script/performance/request +3 -0
  1493. data/test/stub/rails_apps/2.3/mycook/script/plugin +3 -0
  1494. data/test/stub/rails_apps/2.3/mycook/script/process/inspector +3 -0
  1495. data/test/stub/rails_apps/2.3/mycook/script/process/reaper +3 -0
  1496. data/test/stub/rails_apps/2.3/mycook/script/process/spawner +3 -0
  1497. data/test/stub/rails_apps/2.3/mycook/script/runner +3 -0
  1498. data/test/stub/rails_apps/2.3/mycook/script/server +3 -0
  1499. data/test/stub/rails_apps/2.3/mycook/sites/some.site/public/uploads.html +26 -0
  1500. data/test/stub/rails_apps/2.3/mycook/sites/some.site/public/welcome/cached.html +26 -0
  1501. data/test/stub/rails_apps/2.3/mycook/tmp/cache/useless.txt +1 -0
  1502. data/test/stub/rails_apps/2.3/mycook/tmp/pids/useless.txt +1 -0
  1503. data/test/stub/rails_apps/2.3/mycook/tmp/sessions/useless.txt +1 -0
  1504. data/test/stub/rails_apps/2.3/mycook/tmp/sockets/useless.txt +1 -0
  1505. data/test/stub/rails_apps/3.0/empty/Gemfile +22 -0
  1506. data/test/stub/rails_apps/3.0/empty/Gemfile.lock +73 -0
  1507. data/test/stub/rails_apps/3.0/empty/Rakefile +10 -0
  1508. data/test/stub/rails_apps/3.0/empty/app/controllers/application_controller.rb +4 -0
  1509. data/test/stub/rails_apps/3.0/empty/app/helpers/application_helper.rb +2 -0
  1510. data/test/stub/rails_apps/3.0/empty/app/views/layouts/application.html.erb +14 -0
  1511. data/test/stub/rails_apps/3.0/empty/config.ru +4 -0
  1512. data/test/stub/rails_apps/3.0/empty/config/application.rb +48 -0
  1513. data/test/stub/rails_apps/3.0/empty/config/boot.rb +13 -0
  1514. data/test/stub/rails_apps/3.0/empty/config/database.yml +22 -0
  1515. data/test/stub/rails_apps/3.0/empty/config/environment.rb +5 -0
  1516. data/test/stub/rails_apps/3.0/empty/config/environments/development.rb +19 -0
  1517. data/test/stub/rails_apps/3.0/empty/config/environments/production.rb +48 -0
  1518. data/test/stub/rails_apps/3.0/empty/config/environments/test.rb +32 -0
  1519. data/test/stub/rails_apps/3.0/empty/config/initializers/backtrace_silencers.rb +7 -0
  1520. data/test/stub/rails_apps/3.0/empty/config/initializers/inflections.rb +10 -0
  1521. data/test/stub/rails_apps/3.0/empty/config/initializers/mime_types.rb +5 -0
  1522. data/test/stub/rails_apps/3.0/empty/config/initializers/passenger.rb +1 -0
  1523. data/test/stub/rails_apps/3.0/empty/config/initializers/secret_token.rb +7 -0
  1524. data/test/stub/rails_apps/3.0/empty/config/initializers/session_store.rb +8 -0
  1525. data/test/stub/rails_apps/3.0/empty/config/locales/en.yml +5 -0
  1526. data/test/stub/rails_apps/3.0/empty/config/routes.rb +58 -0
  1527. data/test/stub/rails_apps/3.0/empty/db/seeds.rb +7 -0
  1528. data/test/stub/rails_apps/3.0/empty/doc/README_FOR_APP +2 -0
  1529. data/test/stub/rails_apps/3.0/empty/public/404.html +26 -0
  1530. data/test/stub/rails_apps/3.0/empty/public/422.html +26 -0
  1531. data/test/stub/rails_apps/3.0/empty/public/500.html +26 -0
  1532. data/test/stub/rails_apps/3.0/empty/public/favicon.ico +0 -0
  1533. data/test/stub/rails_apps/3.0/empty/public/index.html +279 -0
  1534. data/test/stub/rails_apps/3.0/empty/public/robots.txt +5 -0
  1535. data/test/stub/rails_apps/3.0/empty/script/rails +9 -0
  1536. data/test/stub/rails_apps/3.0/empty/test/performance/browsing_test.rb +9 -0
  1537. data/test/stub/rails_apps/3.0/empty/test/test_helper.rb +13 -0
  1538. data/test/stub/spawn_server.rb +22 -0
  1539. data/test/stub/upload_data.txt +494 -0
  1540. data/test/stub/vendor_rails/minimal/README +1 -0
  1541. data/test/stub/vendor_rails/minimal/actionmailer/lib/action_mailer.rb +0 -0
  1542. data/test/stub/vendor_rails/minimal/actionpack/lib/action_controller.rb +22 -0
  1543. data/test/stub/vendor_rails/minimal/actionpack/lib/action_pack.rb +0 -0
  1544. data/test/stub/vendor_rails/minimal/actionpack/lib/action_view.rb +0 -0
  1545. data/test/stub/vendor_rails/minimal/activerecord/lib/active_record.rb +7 -0
  1546. data/test/stub/vendor_rails/minimal/activeresource/lib/active_resource.rb +0 -0
  1547. data/test/stub/vendor_rails/minimal/activesupport/lib/active_support.rb +17 -0
  1548. data/test/stub/vendor_rails/minimal/activesupport/lib/active_support/whiny_nil.rb +0 -0
  1549. data/test/stub/vendor_rails/minimal/railties/lib/dispatcher.rb +0 -0
  1550. data/test/stub/vendor_rails/minimal/railties/lib/initializer.rb +57 -0
  1551. data/test/stub/vendor_rails/minimal/railties/lib/ruby_version_check.rb +1 -0
  1552. data/test/stub/wsgi/passenger_wsgi.py +3 -0
  1553. data/test/stub/wsgi/public/wsgi-snake.jpg +0 -0
  1554. data/test/stub/zsfa/header.png +0 -0
  1555. data/test/stub/zsfa/index.html +14 -0
  1556. data/test/stub/zsfa/zsfa.png +0 -0
  1557. data/test/support/allocate_memory.c +14 -0
  1558. data/test/support/apache2_controller.rb +258 -0
  1559. data/test/support/multipart.rb +62 -0
  1560. data/test/support/nginx_controller.rb +99 -0
  1561. data/test/support/test_helper.rb +448 -0
  1562. data/test/support/valgrind.h +2539 -0
  1563. data/test/tut/tut.h +1240 -0
  1564. data/test/tut/tut_reporter.h +256 -0
  1565. metadata +1703 -0
@@ -0,0 +1,3694 @@
1
+ /*
2
+ * libev event processing core, watcher management
3
+ *
4
+ * Copyright (c) 2007,2008,2009 Marc Alexander Lehmann <libev@schmorp.de>
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without modifica-
8
+ * tion, are permitted provided that the following conditions are met:
9
+ *
10
+ * 1. Redistributions of source code must retain the above copyright notice,
11
+ * this list of conditions and the following disclaimer.
12
+ *
13
+ * 2. Redistributions in binary form must reproduce the above copyright
14
+ * notice, this list of conditions and the following disclaimer in the
15
+ * documentation and/or other materials provided with the distribution.
16
+ *
17
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
18
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
19
+ * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
20
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
21
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
25
+ * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
26
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
27
+ *
28
+ * Alternatively, the contents of this file may be used under the terms of
29
+ * the GNU General Public License ("GPL") version 2 or any later version,
30
+ * in which case the provisions of the GPL are applicable instead of
31
+ * the above. If you wish to allow the use of your version of this file
32
+ * only under the terms of the GPL and not to allow others to use your
33
+ * version of this file under the BSD license, indicate your decision
34
+ * by deleting the provisions above and replace them with the notice
35
+ * and other provisions required by the GPL. If you do not delete the
36
+ * provisions above, a recipient may use your version of this file under
37
+ * either the BSD or the GPL.
38
+ */
39
+
40
+ #ifdef __cplusplus
41
+ extern "C" {
42
+ #endif
43
+
44
+ /* this big block deduces configuration from config.h */
45
+ #ifndef EV_STANDALONE
46
+ # ifdef EV_CONFIG_H
47
+ # include EV_CONFIG_H
48
+ # else
49
+ # include "config.h"
50
+ # endif
51
+
52
+ # if HAVE_CLOCK_SYSCALL
53
+ # ifndef EV_USE_CLOCK_SYSCALL
54
+ # define EV_USE_CLOCK_SYSCALL 1
55
+ # ifndef EV_USE_REALTIME
56
+ # define EV_USE_REALTIME 0
57
+ # endif
58
+ # ifndef EV_USE_MONOTONIC
59
+ # define EV_USE_MONOTONIC 1
60
+ # endif
61
+ # endif
62
+ # elif !defined(EV_USE_CLOCK_SYSCALL)
63
+ # define EV_USE_CLOCK_SYSCALL 0
64
+ # endif
65
+
66
+ # if HAVE_CLOCK_GETTIME
67
+ # ifndef EV_USE_MONOTONIC
68
+ # define EV_USE_MONOTONIC 1
69
+ # endif
70
+ # ifndef EV_USE_REALTIME
71
+ # define EV_USE_REALTIME 0
72
+ # endif
73
+ # else
74
+ # ifndef EV_USE_MONOTONIC
75
+ # define EV_USE_MONOTONIC 0
76
+ # endif
77
+ # ifndef EV_USE_REALTIME
78
+ # define EV_USE_REALTIME 0
79
+ # endif
80
+ # endif
81
+
82
+ # ifndef EV_USE_NANOSLEEP
83
+ # if HAVE_NANOSLEEP
84
+ # define EV_USE_NANOSLEEP 1
85
+ # else
86
+ # define EV_USE_NANOSLEEP 0
87
+ # endif
88
+ # endif
89
+
90
+ # ifndef EV_USE_SELECT
91
+ # if HAVE_SELECT && HAVE_SYS_SELECT_H
92
+ # define EV_USE_SELECT 1
93
+ # else
94
+ # define EV_USE_SELECT 0
95
+ # endif
96
+ # endif
97
+
98
+ # ifndef EV_USE_POLL
99
+ # if HAVE_POLL && HAVE_POLL_H
100
+ # define EV_USE_POLL 1
101
+ # else
102
+ # define EV_USE_POLL 0
103
+ # endif
104
+ # endif
105
+
106
+ # ifndef EV_USE_EPOLL
107
+ # if HAVE_EPOLL_CTL && HAVE_SYS_EPOLL_H
108
+ # define EV_USE_EPOLL 1
109
+ # else
110
+ # define EV_USE_EPOLL 0
111
+ # endif
112
+ # endif
113
+
114
+ # ifndef EV_USE_KQUEUE
115
+ # if HAVE_KQUEUE && HAVE_SYS_EVENT_H && HAVE_SYS_QUEUE_H
116
+ # define EV_USE_KQUEUE 1
117
+ # else
118
+ # define EV_USE_KQUEUE 0
119
+ # endif
120
+ # endif
121
+
122
+ # ifndef EV_USE_PORT
123
+ # if HAVE_PORT_H && HAVE_PORT_CREATE
124
+ # define EV_USE_PORT 1
125
+ # else
126
+ # define EV_USE_PORT 0
127
+ # endif
128
+ # endif
129
+
130
+ # ifndef EV_USE_INOTIFY
131
+ # if HAVE_INOTIFY_INIT && HAVE_SYS_INOTIFY_H
132
+ # define EV_USE_INOTIFY 1
133
+ # else
134
+ # define EV_USE_INOTIFY 0
135
+ # endif
136
+ # endif
137
+
138
+ # ifndef EV_USE_SIGNALFD
139
+ # if HAVE_SIGNALFD && HAVE_SYS_SIGNALFD_H
140
+ # define EV_USE_SIGNALFD 1
141
+ # else
142
+ # define EV_USE_SIGNALFD 0
143
+ # endif
144
+ # endif
145
+
146
+ # ifndef EV_USE_EVENTFD
147
+ # if HAVE_EVENTFD
148
+ # define EV_USE_EVENTFD 1
149
+ # else
150
+ # define EV_USE_EVENTFD 0
151
+ # endif
152
+ # endif
153
+
154
+ #endif
155
+
156
+ #include <math.h>
157
+ #include <stdlib.h>
158
+ #include <string.h>
159
+ #include <fcntl.h>
160
+ #include <stddef.h>
161
+
162
+ #include <stdio.h>
163
+
164
+ #include <assert.h>
165
+ #include <errno.h>
166
+ #include <sys/types.h>
167
+ #include <time.h>
168
+
169
+ #include <signal.h>
170
+
171
+ #ifdef EV_H
172
+ # include EV_H
173
+ #else
174
+ # include "ev.h"
175
+ #endif
176
+
177
+ #ifndef _WIN32
178
+ # include <sys/time.h>
179
+ # include <sys/wait.h>
180
+ # include <unistd.h>
181
+ #else
182
+ # include <io.h>
183
+ # define WIN32_LEAN_AND_MEAN
184
+ # include <windows.h>
185
+ # ifndef EV_SELECT_IS_WINSOCKET
186
+ # define EV_SELECT_IS_WINSOCKET 1
187
+ # endif
188
+ #endif
189
+
190
+ /* this block tries to deduce configuration from header-defined symbols and defaults */
191
+
192
+ /* try to deduce the maximum number of signals on this platform */
193
+ #if defined (EV_NSIG)
194
+ /* use what's provided */
195
+ #elif defined (NSIG)
196
+ # define EV_NSIG (NSIG)
197
+ #elif defined(_NSIG)
198
+ # define EV_NSIG (_NSIG)
199
+ #elif defined (SIGMAX)
200
+ # define EV_NSIG (SIGMAX+1)
201
+ #elif defined (SIG_MAX)
202
+ # define EV_NSIG (SIG_MAX+1)
203
+ #elif defined (_SIG_MAX)
204
+ # define EV_NSIG (_SIG_MAX+1)
205
+ #elif defined (MAXSIG)
206
+ # define EV_NSIG (MAXSIG+1)
207
+ #elif defined (MAX_SIG)
208
+ # define EV_NSIG (MAX_SIG+1)
209
+ #elif defined (SIGARRAYSIZE)
210
+ # define EV_NSIG SIGARRAYSIZE /* Assume ary[SIGARRAYSIZE] */
211
+ #elif defined (_sys_nsig)
212
+ # define EV_NSIG (_sys_nsig) /* Solaris 2.5 */
213
+ #else
214
+ # error "unable to find value for NSIG, please report"
215
+ /* to make it compile regardless, just remove the above line */
216
+ # define EV_NSIG 65
217
+ #endif
218
+
219
+ #ifndef EV_USE_CLOCK_SYSCALL
220
+ # if __linux && __GLIBC__ >= 2
221
+ # define EV_USE_CLOCK_SYSCALL 1
222
+ # else
223
+ # define EV_USE_CLOCK_SYSCALL 0
224
+ # endif
225
+ #endif
226
+
227
+ #ifndef EV_USE_MONOTONIC
228
+ # if defined (_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0
229
+ # define EV_USE_MONOTONIC 1
230
+ # else
231
+ # define EV_USE_MONOTONIC 0
232
+ # endif
233
+ #endif
234
+
235
+ #ifndef EV_USE_REALTIME
236
+ # define EV_USE_REALTIME !EV_USE_CLOCK_SYSCALL
237
+ #endif
238
+
239
+ #ifndef EV_USE_NANOSLEEP
240
+ # if _POSIX_C_SOURCE >= 199309L
241
+ # define EV_USE_NANOSLEEP 1
242
+ # else
243
+ # define EV_USE_NANOSLEEP 0
244
+ # endif
245
+ #endif
246
+
247
+ #ifndef EV_USE_SELECT
248
+ # define EV_USE_SELECT 1
249
+ #endif
250
+
251
+ #ifndef EV_USE_POLL
252
+ # ifdef _WIN32
253
+ # define EV_USE_POLL 0
254
+ # else
255
+ # define EV_USE_POLL 1
256
+ # endif
257
+ #endif
258
+
259
+ #ifndef EV_USE_EPOLL
260
+ # if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4))
261
+ # define EV_USE_EPOLL 1
262
+ # else
263
+ # define EV_USE_EPOLL 0
264
+ # endif
265
+ #endif
266
+
267
+ #ifndef EV_USE_KQUEUE
268
+ # define EV_USE_KQUEUE 0
269
+ #endif
270
+
271
+ #ifndef EV_USE_PORT
272
+ # define EV_USE_PORT 0
273
+ #endif
274
+
275
+ #ifndef EV_USE_INOTIFY
276
+ # if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4))
277
+ # define EV_USE_INOTIFY 1
278
+ # else
279
+ # define EV_USE_INOTIFY 0
280
+ # endif
281
+ #endif
282
+
283
+ #ifndef EV_PID_HASHSIZE
284
+ # if EV_MINIMAL
285
+ # define EV_PID_HASHSIZE 1
286
+ # else
287
+ # define EV_PID_HASHSIZE 16
288
+ # endif
289
+ #endif
290
+
291
+ #ifndef EV_INOTIFY_HASHSIZE
292
+ # if EV_MINIMAL
293
+ # define EV_INOTIFY_HASHSIZE 1
294
+ # else
295
+ # define EV_INOTIFY_HASHSIZE 16
296
+ # endif
297
+ #endif
298
+
299
+ #ifndef EV_USE_EVENTFD
300
+ # if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))
301
+ # define EV_USE_EVENTFD 1
302
+ # else
303
+ # define EV_USE_EVENTFD 0
304
+ # endif
305
+ #endif
306
+
307
+ #ifndef EV_USE_SIGNALFD
308
+ # if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))
309
+ # define EV_USE_SIGNALFD 1
310
+ # else
311
+ # define EV_USE_SIGNALFD 0
312
+ # endif
313
+ #endif
314
+
315
+ #if 0 /* debugging */
316
+ # define EV_VERIFY 3
317
+ # define EV_USE_4HEAP 1
318
+ # define EV_HEAP_CACHE_AT 1
319
+ #endif
320
+
321
+ #ifndef EV_VERIFY
322
+ # define EV_VERIFY !EV_MINIMAL
323
+ #endif
324
+
325
+ #ifndef EV_USE_4HEAP
326
+ # define EV_USE_4HEAP !EV_MINIMAL
327
+ #endif
328
+
329
+ #ifndef EV_HEAP_CACHE_AT
330
+ # define EV_HEAP_CACHE_AT !EV_MINIMAL
331
+ #endif
332
+
333
+ /* on linux, we can use a (slow) syscall to avoid a dependency on pthread, */
334
+ /* which makes programs even slower. might work on other unices, too. */
335
+ #if EV_USE_CLOCK_SYSCALL
336
+ # include <syscall.h>
337
+ # ifdef SYS_clock_gettime
338
+ # define clock_gettime(id, ts) syscall (SYS_clock_gettime, (id), (ts))
339
+ # undef EV_USE_MONOTONIC
340
+ # define EV_USE_MONOTONIC 1
341
+ # else
342
+ # undef EV_USE_CLOCK_SYSCALL
343
+ # define EV_USE_CLOCK_SYSCALL 0
344
+ # endif
345
+ #endif
346
+
347
+ /* this block fixes any misconfiguration where we know we run into trouble otherwise */
348
+
349
+ #ifndef CLOCK_MONOTONIC
350
+ # undef EV_USE_MONOTONIC
351
+ # define EV_USE_MONOTONIC 0
352
+ #endif
353
+
354
+ #ifndef CLOCK_REALTIME
355
+ # undef EV_USE_REALTIME
356
+ # define EV_USE_REALTIME 0
357
+ #endif
358
+
359
+ #if !EV_STAT_ENABLE
360
+ # undef EV_USE_INOTIFY
361
+ # define EV_USE_INOTIFY 0
362
+ #endif
363
+
364
+ #if !EV_USE_NANOSLEEP
365
+ # ifndef _WIN32
366
+ # include <sys/select.h>
367
+ # endif
368
+ #endif
369
+
370
+ #if EV_USE_INOTIFY
371
+ # include <sys/utsname.h>
372
+ # include <sys/statfs.h>
373
+ # include <sys/inotify.h>
374
+ /* some very old inotify.h headers don't have IN_DONT_FOLLOW */
375
+ # ifndef IN_DONT_FOLLOW
376
+ # undef EV_USE_INOTIFY
377
+ # define EV_USE_INOTIFY 0
378
+ # endif
379
+ #endif
380
+
381
+ #if EV_SELECT_IS_WINSOCKET
382
+ # include <winsock.h>
383
+ #endif
384
+
385
+ #if EV_USE_EVENTFD
386
+ /* our minimum requirement is glibc 2.7 which has the stub, but not the header */
387
+ # include <stdint.h>
388
+ # ifndef EFD_NONBLOCK
389
+ # define EFD_NONBLOCK O_NONBLOCK
390
+ # endif
391
+ # ifndef EFD_CLOEXEC
392
+ # ifdef O_CLOEXEC
393
+ # define EFD_CLOEXEC O_CLOEXEC
394
+ # else
395
+ # define EFD_CLOEXEC 02000000
396
+ # endif
397
+ # endif
398
+ # ifdef __cplusplus
399
+ extern "C" {
400
+ # endif
401
+ int eventfd (unsigned int initval, int flags);
402
+ # ifdef __cplusplus
403
+ }
404
+ # endif
405
+ #endif
406
+
407
+ #if EV_USE_SIGNALFD
408
+ /* our minimum requirement is glibc 2.7 which has the stub, but not the header */
409
+ # include <stdint.h>
410
+ # ifndef SFD_NONBLOCK
411
+ # define SFD_NONBLOCK O_NONBLOCK
412
+ # endif
413
+ # ifndef SFD_CLOEXEC
414
+ # ifdef O_CLOEXEC
415
+ # define SFD_CLOEXEC O_CLOEXEC
416
+ # else
417
+ # define SFD_CLOEXEC 02000000
418
+ # endif
419
+ # endif
420
+ # ifdef __cplusplus
421
+ extern "C" {
422
+ # endif
423
+ int signalfd (int fd, const sigset_t *mask, int flags);
424
+
425
+ struct signalfd_siginfo
426
+ {
427
+ uint32_t ssi_signo;
428
+ char pad[128 - sizeof (uint32_t)];
429
+ };
430
+ # ifdef __cplusplus
431
+ }
432
+ # endif
433
+ #endif
434
+
435
+
436
+ /**/
437
+
438
+ #if EV_VERIFY >= 3
439
+ # define EV_FREQUENT_CHECK ev_loop_verify (EV_A)
440
+ #else
441
+ # define EV_FREQUENT_CHECK do { } while (0)
442
+ #endif
443
+
444
+ /*
445
+ * This is used to avoid floating point rounding problems.
446
+ * It is added to ev_rt_now when scheduling periodics
447
+ * to ensure progress, time-wise, even when rounding
448
+ * errors are against us.
449
+ * This value is good at least till the year 4000.
450
+ * Better solutions welcome.
451
+ */
452
+ #define TIME_EPSILON 0.0001220703125 /* 1/8192 */
453
+
454
+ #define MIN_TIMEJUMP 1. /* minimum timejump that gets detected (if monotonic clock available) */
455
+ #define MAX_BLOCKTIME 59.743 /* never wait longer than this time (to detect time jumps) */
456
+
457
+ #if __GNUC__ >= 4
458
+ # define expect(expr,value) __builtin_expect ((expr),(value))
459
+ # define noinline __attribute__ ((noinline))
460
+ #else
461
+ # define expect(expr,value) (expr)
462
+ # define noinline
463
+ # if __STDC_VERSION__ < 199901L && __GNUC__ < 2
464
+ # define inline
465
+ # endif
466
+ #endif
467
+
468
+ #define expect_false(expr) expect ((expr) != 0, 0)
469
+ #define expect_true(expr) expect ((expr) != 0, 1)
470
+ #define inline_size static inline
471
+
472
+ #if EV_MINIMAL
473
+ # define inline_speed static noinline
474
+ #else
475
+ # define inline_speed static inline
476
+ #endif
477
+
478
+ #define NUMPRI (EV_MAXPRI - EV_MINPRI + 1)
479
+
480
+ #if EV_MINPRI == EV_MAXPRI
481
+ # define ABSPRI(w) (((W)w), 0)
482
+ #else
483
+ # define ABSPRI(w) (((W)w)->priority - EV_MINPRI)
484
+ #endif
485
+
486
+ #define EMPTY /* required for microsofts broken pseudo-c compiler */
487
+ #define EMPTY2(a,b) /* used to suppress some warnings */
488
+
489
+ typedef ev_watcher *W;
490
+ typedef ev_watcher_list *WL;
491
+ typedef ev_watcher_time *WT;
492
+
493
+ #define ev_active(w) ((W)(w))->active
494
+ #define ev_at(w) ((WT)(w))->at
495
+
496
+ #if EV_USE_REALTIME
497
+ /* sig_atomic_t is used to avoid per-thread variables or locking but still */
498
+ /* giving it a reasonably high chance of working on typical architetcures */
499
+ static EV_ATOMIC_T have_realtime; /* did clock_gettime (CLOCK_REALTIME) work? */
500
+ #endif
501
+
502
+ #if EV_USE_MONOTONIC
503
+ static EV_ATOMIC_T have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */
504
+ #endif
505
+
506
+ #ifndef EV_FD_TO_WIN32_HANDLE
507
+ # define EV_FD_TO_WIN32_HANDLE(fd) _get_osfhandle (fd)
508
+ #endif
509
+ #ifndef EV_WIN32_HANDLE_TO_FD
510
+ # define EV_WIN32_HANDLE_TO_FD(handle) _open_osfhandle (fd, 0)
511
+ #endif
512
+ #ifndef EV_WIN32_CLOSE_FD
513
+ # define EV_WIN32_CLOSE_FD(fd) close (fd)
514
+ #endif
515
+
516
+ #ifdef _WIN32
517
+ # include "ev_win32.c"
518
+ #endif
519
+
520
+ /*****************************************************************************/
521
+
522
+ static void (*syserr_cb)(const char *msg);
523
+
524
+ void
525
+ ev_set_syserr_cb (void (*cb)(const char *msg))
526
+ {
527
+ syserr_cb = cb;
528
+ }
529
+
530
+ static void noinline
531
+ ev_syserr (const char *msg)
532
+ {
533
+ if (!msg)
534
+ msg = "(libev) system error";
535
+
536
+ if (syserr_cb)
537
+ syserr_cb (msg);
538
+ else
539
+ {
540
+ perror (msg);
541
+ abort ();
542
+ }
543
+ }
544
+
545
+ static void *
546
+ ev_realloc_emul (void *ptr, long size)
547
+ {
548
+ /* some systems, notably openbsd and darwin, fail to properly
549
+ * implement realloc (x, 0) (as required by both ansi c-98 and
550
+ * the single unix specification, so work around them here.
551
+ */
552
+
553
+ if (size)
554
+ return realloc (ptr, size);
555
+
556
+ free (ptr);
557
+ return 0;
558
+ }
559
+
560
+ static void *(*alloc)(void *ptr, long size) = ev_realloc_emul;
561
+
562
+ void
563
+ ev_set_allocator (void *(*cb)(void *ptr, long size))
564
+ {
565
+ alloc = cb;
566
+ }
567
+
568
+ inline_speed void *
569
+ ev_realloc (void *ptr, long size)
570
+ {
571
+ ptr = alloc (ptr, size);
572
+
573
+ if (!ptr && size)
574
+ {
575
+ fprintf (stderr, "libev: cannot allocate %ld bytes, aborting.", size);
576
+ abort ();
577
+ }
578
+
579
+ return ptr;
580
+ }
581
+
582
+ #define ev_malloc(size) ev_realloc (0, (size))
583
+ #define ev_free(ptr) ev_realloc ((ptr), 0)
584
+
585
+ /*****************************************************************************/
586
+
587
+ /* set in reify when reification needed */
588
+ #define EV_ANFD_REIFY 1
589
+
590
+ /* file descriptor info structure */
591
+ typedef struct
592
+ {
593
+ WL head;
594
+ unsigned char events; /* the events watched for */
595
+ unsigned char reify; /* flag set when this ANFD needs reification (EV_ANFD_REIFY, EV__IOFDSET) */
596
+ unsigned char emask; /* the epoll backend stores the actual kernel mask in here */
597
+ unsigned char unused;
598
+ #if EV_USE_EPOLL
599
+ unsigned int egen; /* generation counter to counter epoll bugs */
600
+ #endif
601
+ #if EV_SELECT_IS_WINSOCKET
602
+ SOCKET handle;
603
+ #endif
604
+ } ANFD;
605
+
606
+ /* stores the pending event set for a given watcher */
607
+ typedef struct
608
+ {
609
+ W w;
610
+ int events; /* the pending event set for the given watcher */
611
+ } ANPENDING;
612
+
613
+ #if EV_USE_INOTIFY
614
+ /* hash table entry per inotify-id */
615
+ typedef struct
616
+ {
617
+ WL head;
618
+ } ANFS;
619
+ #endif
620
+
621
+ /* Heap Entry */
622
+ #if EV_HEAP_CACHE_AT
623
+ /* a heap element */
624
+ typedef struct {
625
+ ev_tstamp at;
626
+ WT w;
627
+ } ANHE;
628
+
629
+ #define ANHE_w(he) (he).w /* access watcher, read-write */
630
+ #define ANHE_at(he) (he).at /* access cached at, read-only */
631
+ #define ANHE_at_cache(he) (he).at = (he).w->at /* update at from watcher */
632
+ #else
633
+ /* a heap element */
634
+ typedef WT ANHE;
635
+
636
+ #define ANHE_w(he) (he)
637
+ #define ANHE_at(he) (he)->at
638
+ #define ANHE_at_cache(he)
639
+ #endif
640
+
641
+ #if EV_MULTIPLICITY
642
+
643
+ struct ev_loop
644
+ {
645
+ ev_tstamp ev_rt_now;
646
+ #define ev_rt_now ((loop)->ev_rt_now)
647
+ #define VAR(name,decl) decl;
648
+ #include "ev_vars.h"
649
+ #undef VAR
650
+ };
651
+ #include "ev_wrap.h"
652
+
653
+ static struct ev_loop default_loop_struct;
654
+ struct ev_loop *ev_default_loop_ptr;
655
+
656
+ #else
657
+
658
+ ev_tstamp ev_rt_now;
659
+ #define VAR(name,decl) static decl;
660
+ #include "ev_vars.h"
661
+ #undef VAR
662
+
663
+ static int ev_default_loop_ptr;
664
+
665
+ #endif
666
+
667
+ #if EV_MINIMAL < 2
668
+ # define EV_RELEASE_CB if (expect_false (release_cb)) release_cb (EV_A)
669
+ # define EV_ACQUIRE_CB if (expect_false (acquire_cb)) acquire_cb (EV_A)
670
+ # define EV_INVOKE_PENDING invoke_cb (EV_A)
671
+ #else
672
+ # define EV_RELEASE_CB (void)0
673
+ # define EV_ACQUIRE_CB (void)0
674
+ # define EV_INVOKE_PENDING ev_invoke_pending (EV_A)
675
+ #endif
676
+
677
+ #define EVUNLOOP_RECURSE 0x80
678
+
679
+ /*****************************************************************************/
680
+
681
+ #ifndef EV_HAVE_EV_TIME
682
+ ev_tstamp
683
+ ev_time (void)
684
+ {
685
+ #if EV_USE_REALTIME
686
+ if (expect_true (have_realtime))
687
+ {
688
+ struct timespec ts;
689
+ clock_gettime (CLOCK_REALTIME, &ts);
690
+ return ts.tv_sec + ts.tv_nsec * 1e-9;
691
+ }
692
+ #endif
693
+
694
+ struct timeval tv;
695
+ gettimeofday (&tv, 0);
696
+ return tv.tv_sec + tv.tv_usec * 1e-6;
697
+ }
698
+ #endif
699
+
700
+ inline_size ev_tstamp
701
+ get_clock (void)
702
+ {
703
+ #if EV_USE_MONOTONIC
704
+ if (expect_true (have_monotonic))
705
+ {
706
+ struct timespec ts;
707
+ clock_gettime (CLOCK_MONOTONIC, &ts);
708
+ return ts.tv_sec + ts.tv_nsec * 1e-9;
709
+ }
710
+ #endif
711
+
712
+ return ev_time ();
713
+ }
714
+
715
+ #if EV_MULTIPLICITY
716
+ ev_tstamp
717
+ ev_now (EV_P)
718
+ {
719
+ return ev_rt_now;
720
+ }
721
+ #endif
722
+
723
+ void
724
+ ev_sleep (ev_tstamp delay)
725
+ {
726
+ if (delay > 0.)
727
+ {
728
+ #if EV_USE_NANOSLEEP
729
+ struct timespec ts;
730
+
731
+ ts.tv_sec = (time_t)delay;
732
+ ts.tv_nsec = (long)((delay - (ev_tstamp)(ts.tv_sec)) * 1e9);
733
+
734
+ nanosleep (&ts, 0);
735
+ #elif defined(_WIN32)
736
+ Sleep ((unsigned long)(delay * 1e3));
737
+ #else
738
+ struct timeval tv;
739
+
740
+ tv.tv_sec = (time_t)delay;
741
+ tv.tv_usec = (long)((delay - (ev_tstamp)(tv.tv_sec)) * 1e6);
742
+
743
+ /* here we rely on sys/time.h + sys/types.h + unistd.h providing select */
744
+ /* something not guaranteed by newer posix versions, but guaranteed */
745
+ /* by older ones */
746
+ select (0, 0, 0, 0, &tv);
747
+ #endif
748
+ }
749
+ }
750
+
751
+ /*****************************************************************************/
752
+
753
+ #define MALLOC_ROUND 4096 /* prefer to allocate in chunks of this size, must be 2**n and >> 4 longs */
754
+
755
+ /* find a suitable new size for the given array, */
756
+ /* hopefully by rounding to a ncie-to-malloc size */
757
+ inline_size int
758
+ array_nextsize (int elem, int cur, int cnt)
759
+ {
760
+ int ncur = cur + 1;
761
+
762
+ do
763
+ ncur <<= 1;
764
+ while (cnt > ncur);
765
+
766
+ /* if size is large, round to MALLOC_ROUND - 4 * longs to accomodate malloc overhead */
767
+ if (elem * ncur > MALLOC_ROUND - sizeof (void *) * 4)
768
+ {
769
+ ncur *= elem;
770
+ ncur = (ncur + elem + (MALLOC_ROUND - 1) + sizeof (void *) * 4) & ~(MALLOC_ROUND - 1);
771
+ ncur = ncur - sizeof (void *) * 4;
772
+ ncur /= elem;
773
+ }
774
+
775
+ return ncur;
776
+ }
777
+
778
+ static noinline void *
779
+ array_realloc (int elem, void *base, int *cur, int cnt)
780
+ {
781
+ *cur = array_nextsize (elem, *cur, cnt);
782
+ return ev_realloc (base, elem * *cur);
783
+ }
784
+
785
+ #define array_init_zero(base,count) \
786
+ memset ((void *)(base), 0, sizeof (*(base)) * (count))
787
+
788
+ #define array_needsize(type,base,cur,cnt,init) \
789
+ if (expect_false ((cnt) > (cur))) \
790
+ { \
791
+ int ocur_ = (cur); \
792
+ (base) = (type *)array_realloc \
793
+ (sizeof (type), (base), &(cur), (cnt)); \
794
+ init ((base) + (ocur_), (cur) - ocur_); \
795
+ }
796
+
797
+ #if 0
798
+ #define array_slim(type,stem) \
799
+ if (stem ## max < array_roundsize (stem ## cnt >> 2)) \
800
+ { \
801
+ stem ## max = array_roundsize (stem ## cnt >> 1); \
802
+ base = (type *)ev_realloc (base, sizeof (type) * (stem ## max));\
803
+ fprintf (stderr, "slimmed down " # stem " to %d\n", stem ## max);/*D*/\
804
+ }
805
+ #endif
806
+
807
+ #define array_free(stem, idx) \
808
+ ev_free (stem ## s idx); stem ## cnt idx = stem ## max idx = 0; stem ## s idx = 0
809
+
810
+ /*****************************************************************************/
811
+
812
+ /* dummy callback for pending events */
813
+ static void noinline
814
+ pendingcb (EV_P_ ev_prepare *w, int revents)
815
+ {
816
+ }
817
+
818
+ void noinline
819
+ ev_feed_event (EV_P_ void *w, int revents)
820
+ {
821
+ W w_ = (W)w;
822
+ int pri = ABSPRI (w_);
823
+
824
+ if (expect_false (w_->pending))
825
+ pendings [pri][w_->pending - 1].events |= revents;
826
+ else
827
+ {
828
+ w_->pending = ++pendingcnt [pri];
829
+ array_needsize (ANPENDING, pendings [pri], pendingmax [pri], w_->pending, EMPTY2);
830
+ pendings [pri][w_->pending - 1].w = w_;
831
+ pendings [pri][w_->pending - 1].events = revents;
832
+ }
833
+ }
834
+
835
+ inline_speed void
836
+ feed_reverse (EV_P_ W w)
837
+ {
838
+ array_needsize (W, rfeeds, rfeedmax, rfeedcnt + 1, EMPTY2);
839
+ rfeeds [rfeedcnt++] = w;
840
+ }
841
+
842
+ inline_size void
843
+ feed_reverse_done (EV_P_ int revents)
844
+ {
845
+ do
846
+ ev_feed_event (EV_A_ rfeeds [--rfeedcnt], revents);
847
+ while (rfeedcnt);
848
+ }
849
+
850
+ inline_speed void
851
+ queue_events (EV_P_ W *events, int eventcnt, int type)
852
+ {
853
+ int i;
854
+
855
+ for (i = 0; i < eventcnt; ++i)
856
+ ev_feed_event (EV_A_ events [i], type);
857
+ }
858
+
859
+ /*****************************************************************************/
860
+
861
+ inline_speed void
862
+ fd_event_nc (EV_P_ int fd, int revents)
863
+ {
864
+ ANFD *anfd = anfds + fd;
865
+ ev_io *w;
866
+
867
+ for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next)
868
+ {
869
+ int ev = w->events & revents;
870
+
871
+ if (ev)
872
+ ev_feed_event (EV_A_ (W)w, ev);
873
+ }
874
+ }
875
+
876
+ /* do not submit kernel events for fds that have reify set */
877
+ /* because that means they changed while we were polling for new events */
878
+ inline_speed void
879
+ fd_event (EV_P_ int fd, int revents)
880
+ {
881
+ ANFD *anfd = anfds + fd;
882
+
883
+ if (expect_true (!anfd->reify))
884
+ fd_event_nc (EV_A_ fd, revents);
885
+ }
886
+
887
+ void
888
+ ev_feed_fd_event (EV_P_ int fd, int revents)
889
+ {
890
+ if (fd >= 0 && fd < anfdmax)
891
+ fd_event_nc (EV_A_ fd, revents);
892
+ }
893
+
894
+ /* make sure the external fd watch events are in-sync */
895
+ /* with the kernel/libev internal state */
896
+ inline_size void
897
+ fd_reify (EV_P)
898
+ {
899
+ int i;
900
+
901
+ for (i = 0; i < fdchangecnt; ++i)
902
+ {
903
+ int fd = fdchanges [i];
904
+ ANFD *anfd = anfds + fd;
905
+ ev_io *w;
906
+
907
+ unsigned char events = 0;
908
+
909
+ for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next)
910
+ events |= (unsigned char)w->events;
911
+
912
+ #if EV_SELECT_IS_WINSOCKET
913
+ if (events)
914
+ {
915
+ unsigned long arg;
916
+ anfd->handle = EV_FD_TO_WIN32_HANDLE (fd);
917
+ assert (("libev: only socket fds supported in this configuration", ioctlsocket (anfd->handle, FIONREAD, &arg) == 0));
918
+ }
919
+ #endif
920
+
921
+ {
922
+ unsigned char o_events = anfd->events;
923
+ unsigned char o_reify = anfd->reify;
924
+
925
+ anfd->reify = 0;
926
+ anfd->events = events;
927
+
928
+ if (o_events != events || o_reify & EV__IOFDSET)
929
+ backend_modify (EV_A_ fd, o_events, events);
930
+ }
931
+ }
932
+
933
+ fdchangecnt = 0;
934
+ }
935
+
936
+ /* something about the given fd changed */
937
+ inline_size void
938
+ fd_change (EV_P_ int fd, int flags)
939
+ {
940
+ unsigned char reify = anfds [fd].reify;
941
+ anfds [fd].reify |= flags;
942
+
943
+ if (expect_true (!reify))
944
+ {
945
+ ++fdchangecnt;
946
+ array_needsize (int, fdchanges, fdchangemax, fdchangecnt, EMPTY2);
947
+ fdchanges [fdchangecnt - 1] = fd;
948
+ }
949
+ }
950
+
951
+ /* the given fd is invalid/unusable, so make sure it doesn't hurt us anymore */
952
+ inline_speed void
953
+ fd_kill (EV_P_ int fd)
954
+ {
955
+ ev_io *w;
956
+
957
+ while ((w = (ev_io *)anfds [fd].head))
958
+ {
959
+ ev_io_stop (EV_A_ w);
960
+ ev_feed_event (EV_A_ (W)w, EV_ERROR | EV_READ | EV_WRITE);
961
+ }
962
+ }
963
+
964
+ /* check whether the given fd is atcually valid, for error recovery */
965
+ inline_size int
966
+ fd_valid (int fd)
967
+ {
968
+ #ifdef _WIN32
969
+ return _get_osfhandle (fd) != -1;
970
+ #else
971
+ return fcntl (fd, F_GETFD) != -1;
972
+ #endif
973
+ }
974
+
975
+ /* called on EBADF to verify fds */
976
+ static void noinline
977
+ fd_ebadf (EV_P)
978
+ {
979
+ int fd;
980
+
981
+ for (fd = 0; fd < anfdmax; ++fd)
982
+ if (anfds [fd].events)
983
+ if (!fd_valid (fd) && errno == EBADF)
984
+ fd_kill (EV_A_ fd);
985
+ }
986
+
987
+ /* called on ENOMEM in select/poll to kill some fds and retry */
988
+ static void noinline
989
+ fd_enomem (EV_P)
990
+ {
991
+ int fd;
992
+
993
+ for (fd = anfdmax; fd--; )
994
+ if (anfds [fd].events)
995
+ {
996
+ fd_kill (EV_A_ fd);
997
+ break;
998
+ }
999
+ }
1000
+
1001
+ /* usually called after fork if backend needs to re-arm all fds from scratch */
1002
+ static void noinline
1003
+ fd_rearm_all (EV_P)
1004
+ {
1005
+ int fd;
1006
+
1007
+ for (fd = 0; fd < anfdmax; ++fd)
1008
+ if (anfds [fd].events)
1009
+ {
1010
+ anfds [fd].events = 0;
1011
+ anfds [fd].emask = 0;
1012
+ fd_change (EV_A_ fd, EV__IOFDSET | EV_ANFD_REIFY);
1013
+ }
1014
+ }
1015
+
1016
+ /*****************************************************************************/
1017
+
1018
+ /*
1019
+ * the heap functions want a real array index. array index 0 uis guaranteed to not
1020
+ * be in-use at any time. the first heap entry is at array [HEAP0]. DHEAP gives
1021
+ * the branching factor of the d-tree.
1022
+ */
1023
+
1024
+ /*
1025
+ * at the moment we allow libev the luxury of two heaps,
1026
+ * a small-code-size 2-heap one and a ~1.5kb larger 4-heap
1027
+ * which is more cache-efficient.
1028
+ * the difference is about 5% with 50000+ watchers.
1029
+ */
1030
+ #if EV_USE_4HEAP
1031
+
1032
+ #define DHEAP 4
1033
+ #define HEAP0 (DHEAP - 1) /* index of first element in heap */
1034
+ #define HPARENT(k) ((((k) - HEAP0 - 1) / DHEAP) + HEAP0)
1035
+ #define UPHEAP_DONE(p,k) ((p) == (k))
1036
+
1037
+ /* away from the root */
1038
+ inline_speed void
1039
+ downheap (ANHE *heap, int N, int k)
1040
+ {
1041
+ ANHE he = heap [k];
1042
+ ANHE *E = heap + N + HEAP0;
1043
+
1044
+ for (;;)
1045
+ {
1046
+ ev_tstamp minat;
1047
+ ANHE *minpos;
1048
+ ANHE *pos = heap + DHEAP * (k - HEAP0) + HEAP0 + 1;
1049
+
1050
+ /* find minimum child */
1051
+ if (expect_true (pos + DHEAP - 1 < E))
1052
+ {
1053
+ /* fast path */ (minpos = pos + 0), (minat = ANHE_at (*minpos));
1054
+ if ( ANHE_at (pos [1]) < minat) (minpos = pos + 1), (minat = ANHE_at (*minpos));
1055
+ if ( ANHE_at (pos [2]) < minat) (minpos = pos + 2), (minat = ANHE_at (*minpos));
1056
+ if ( ANHE_at (pos [3]) < minat) (minpos = pos + 3), (minat = ANHE_at (*minpos));
1057
+ }
1058
+ else if (pos < E)
1059
+ {
1060
+ /* slow path */ (minpos = pos + 0), (minat = ANHE_at (*minpos));
1061
+ if (pos + 1 < E && ANHE_at (pos [1]) < minat) (minpos = pos + 1), (minat = ANHE_at (*minpos));
1062
+ if (pos + 2 < E && ANHE_at (pos [2]) < minat) (minpos = pos + 2), (minat = ANHE_at (*minpos));
1063
+ if (pos + 3 < E && ANHE_at (pos [3]) < minat) (minpos = pos + 3), (minat = ANHE_at (*minpos));
1064
+ }
1065
+ else
1066
+ break;
1067
+
1068
+ if (ANHE_at (he) <= minat)
1069
+ break;
1070
+
1071
+ heap [k] = *minpos;
1072
+ ev_active (ANHE_w (*minpos)) = k;
1073
+
1074
+ k = minpos - heap;
1075
+ }
1076
+
1077
+ heap [k] = he;
1078
+ ev_active (ANHE_w (he)) = k;
1079
+ }
1080
+
1081
+ #else /* 4HEAP */
1082
+
1083
+ #define HEAP0 1
1084
+ #define HPARENT(k) ((k) >> 1)
1085
+ #define UPHEAP_DONE(p,k) (!(p))
1086
+
1087
+ /* away from the root */
1088
+ inline_speed void
1089
+ downheap (ANHE *heap, int N, int k)
1090
+ {
1091
+ ANHE he = heap [k];
1092
+
1093
+ for (;;)
1094
+ {
1095
+ int c = k << 1;
1096
+
1097
+ if (c >= N + HEAP0)
1098
+ break;
1099
+
1100
+ c += c + 1 < N + HEAP0 && ANHE_at (heap [c]) > ANHE_at (heap [c + 1])
1101
+ ? 1 : 0;
1102
+
1103
+ if (ANHE_at (he) <= ANHE_at (heap [c]))
1104
+ break;
1105
+
1106
+ heap [k] = heap [c];
1107
+ ev_active (ANHE_w (heap [k])) = k;
1108
+
1109
+ k = c;
1110
+ }
1111
+
1112
+ heap [k] = he;
1113
+ ev_active (ANHE_w (he)) = k;
1114
+ }
1115
+ #endif
1116
+
1117
+ /* towards the root */
1118
+ inline_speed void
1119
+ upheap (ANHE *heap, int k)
1120
+ {
1121
+ ANHE he = heap [k];
1122
+
1123
+ for (;;)
1124
+ {
1125
+ int p = HPARENT (k);
1126
+
1127
+ if (UPHEAP_DONE (p, k) || ANHE_at (heap [p]) <= ANHE_at (he))
1128
+ break;
1129
+
1130
+ heap [k] = heap [p];
1131
+ ev_active (ANHE_w (heap [k])) = k;
1132
+ k = p;
1133
+ }
1134
+
1135
+ heap [k] = he;
1136
+ ev_active (ANHE_w (he)) = k;
1137
+ }
1138
+
1139
+ /* move an element suitably so it is in a correct place */
1140
+ inline_size void
1141
+ adjustheap (ANHE *heap, int N, int k)
1142
+ {
1143
+ if (k > HEAP0 && ANHE_at (heap [k]) <= ANHE_at (heap [HPARENT (k)]))
1144
+ upheap (heap, k);
1145
+ else
1146
+ downheap (heap, N, k);
1147
+ }
1148
+
1149
+ /* rebuild the heap: this function is used only once and executed rarely */
1150
+ inline_size void
1151
+ reheap (ANHE *heap, int N)
1152
+ {
1153
+ int i;
1154
+
1155
+ /* we don't use floyds algorithm, upheap is simpler and is more cache-efficient */
1156
+ /* also, this is easy to implement and correct for both 2-heaps and 4-heaps */
1157
+ for (i = 0; i < N; ++i)
1158
+ upheap (heap, i + HEAP0);
1159
+ }
1160
+
1161
+ /*****************************************************************************/
1162
+
1163
+ /* associate signal watchers to a signal signal */
1164
+ typedef struct
1165
+ {
1166
+ EV_ATOMIC_T pending;
1167
+ #if EV_MULTIPLICITY
1168
+ EV_P;
1169
+ #endif
1170
+ WL head;
1171
+ } ANSIG;
1172
+
1173
+ static ANSIG signals [EV_NSIG - 1];
1174
+
1175
+ /*****************************************************************************/
1176
+
1177
+ /* used to prepare libev internal fd's */
1178
+ /* this is not fork-safe */
1179
+ inline_speed void
1180
+ fd_intern (int fd)
1181
+ {
1182
+ #ifdef _WIN32
1183
+ unsigned long arg = 1;
1184
+ ioctlsocket (_get_osfhandle (fd), FIONBIO, &arg);
1185
+ #else
1186
+ fcntl (fd, F_SETFD, FD_CLOEXEC);
1187
+ fcntl (fd, F_SETFL, O_NONBLOCK);
1188
+ #endif
1189
+ }
1190
+
1191
+ static void noinline
1192
+ evpipe_init (EV_P)
1193
+ {
1194
+ if (!ev_is_active (&pipe_w))
1195
+ {
1196
+ #if EV_USE_EVENTFD
1197
+ evfd = eventfd (0, EFD_NONBLOCK | EFD_CLOEXEC);
1198
+ if (evfd < 0 && errno == EINVAL)
1199
+ evfd = eventfd (0, 0);
1200
+
1201
+ if (evfd >= 0)
1202
+ {
1203
+ evpipe [0] = -1;
1204
+ fd_intern (evfd); /* doing it twice doesn't hurt */
1205
+ ev_io_set (&pipe_w, evfd, EV_READ);
1206
+ }
1207
+ else
1208
+ #endif
1209
+ {
1210
+ while (pipe (evpipe))
1211
+ ev_syserr ("(libev) error creating signal/async pipe");
1212
+
1213
+ fd_intern (evpipe [0]);
1214
+ fd_intern (evpipe [1]);
1215
+ ev_io_set (&pipe_w, evpipe [0], EV_READ);
1216
+ }
1217
+
1218
+ ev_io_start (EV_A_ &pipe_w);
1219
+ ev_unref (EV_A); /* watcher should not keep loop alive */
1220
+ }
1221
+ }
1222
+
1223
+ inline_size void
1224
+ evpipe_write (EV_P_ EV_ATOMIC_T *flag)
1225
+ {
1226
+ if (!*flag)
1227
+ {
1228
+ int old_errno = errno; /* save errno because write might clobber it */
1229
+
1230
+ *flag = 1;
1231
+
1232
+ #if EV_USE_EVENTFD
1233
+ if (evfd >= 0)
1234
+ {
1235
+ uint64_t counter = 1;
1236
+ write (evfd, &counter, sizeof (uint64_t));
1237
+ }
1238
+ else
1239
+ #endif
1240
+ write (evpipe [1], &old_errno, 1);
1241
+
1242
+ errno = old_errno;
1243
+ }
1244
+ }
1245
+
1246
+ /* called whenever the libev signal pipe */
1247
+ /* got some events (signal, async) */
1248
+ static void
1249
+ pipecb (EV_P_ ev_io *iow, int revents)
1250
+ {
1251
+ int i;
1252
+
1253
+ #if EV_USE_EVENTFD
1254
+ if (evfd >= 0)
1255
+ {
1256
+ uint64_t counter;
1257
+ read (evfd, &counter, sizeof (uint64_t));
1258
+ }
1259
+ else
1260
+ #endif
1261
+ {
1262
+ char dummy;
1263
+ read (evpipe [0], &dummy, 1);
1264
+ }
1265
+
1266
+ if (sig_pending)
1267
+ {
1268
+ sig_pending = 0;
1269
+
1270
+ for (i = EV_NSIG - 1; i--; )
1271
+ if (expect_false (signals [i].pending))
1272
+ ev_feed_signal_event (EV_A_ i + 1);
1273
+ }
1274
+
1275
+ #if EV_ASYNC_ENABLE
1276
+ if (async_pending)
1277
+ {
1278
+ async_pending = 0;
1279
+
1280
+ for (i = asynccnt; i--; )
1281
+ if (asyncs [i]->sent)
1282
+ {
1283
+ asyncs [i]->sent = 0;
1284
+ ev_feed_event (EV_A_ asyncs [i], EV_ASYNC);
1285
+ }
1286
+ }
1287
+ #endif
1288
+ }
1289
+
1290
+ /*****************************************************************************/
1291
+
1292
+ static void
1293
+ ev_sighandler (int signum)
1294
+ {
1295
+ #if EV_MULTIPLICITY
1296
+ EV_P = signals [signum - 1].loop;
1297
+ #endif
1298
+
1299
+ #if _WIN32
1300
+ signal (signum, ev_sighandler);
1301
+ #endif
1302
+
1303
+ signals [signum - 1].pending = 1;
1304
+ evpipe_write (EV_A_ &sig_pending);
1305
+ }
1306
+
1307
+ void noinline
1308
+ ev_feed_signal_event (EV_P_ int signum)
1309
+ {
1310
+ WL w;
1311
+
1312
+ if (expect_false (signum <= 0 || signum > EV_NSIG))
1313
+ return;
1314
+
1315
+ --signum;
1316
+
1317
+ #if EV_MULTIPLICITY
1318
+ /* it is permissible to try to feed a signal to the wrong loop */
1319
+ /* or, likely more useful, feeding a signal nobody is waiting for */
1320
+
1321
+ if (expect_false (signals [signum].loop != EV_A))
1322
+ return;
1323
+ #endif
1324
+
1325
+ signals [signum].pending = 0;
1326
+
1327
+ for (w = signals [signum].head; w; w = w->next)
1328
+ ev_feed_event (EV_A_ (W)w, EV_SIGNAL);
1329
+ }
1330
+
1331
+ #if EV_USE_SIGNALFD
1332
+ static void
1333
+ sigfdcb (EV_P_ ev_io *iow, int revents)
1334
+ {
1335
+ struct signalfd_siginfo si[2], *sip; /* these structs are big */
1336
+
1337
+ for (;;)
1338
+ {
1339
+ ssize_t res = read (sigfd, si, sizeof (si));
1340
+
1341
+ /* not ISO-C, as res might be -1, but works with SuS */
1342
+ for (sip = si; (char *)sip < (char *)si + res; ++sip)
1343
+ ev_feed_signal_event (EV_A_ sip->ssi_signo);
1344
+
1345
+ if (res < (ssize_t)sizeof (si))
1346
+ break;
1347
+ }
1348
+ }
1349
+ #endif
1350
+
1351
+ /*****************************************************************************/
1352
+
1353
+ static WL childs [EV_PID_HASHSIZE];
1354
+
1355
+ #ifndef _WIN32
1356
+
1357
+ static ev_signal childev;
1358
+
1359
+ #ifndef WIFCONTINUED
1360
+ # define WIFCONTINUED(status) 0
1361
+ #endif
1362
+
1363
+ /* handle a single child status event */
1364
+ inline_speed void
1365
+ child_reap (EV_P_ int chain, int pid, int status)
1366
+ {
1367
+ ev_child *w;
1368
+ int traced = WIFSTOPPED (status) || WIFCONTINUED (status);
1369
+
1370
+ for (w = (ev_child *)childs [chain & (EV_PID_HASHSIZE - 1)]; w; w = (ev_child *)((WL)w)->next)
1371
+ {
1372
+ if ((w->pid == pid || !w->pid)
1373
+ && (!traced || (w->flags & 1)))
1374
+ {
1375
+ ev_set_priority (w, EV_MAXPRI); /* need to do it *now*, this *must* be the same prio as the signal watcher itself */
1376
+ w->rpid = pid;
1377
+ w->rstatus = status;
1378
+ ev_feed_event (EV_A_ (W)w, EV_CHILD);
1379
+ }
1380
+ }
1381
+ }
1382
+
1383
+ #ifndef WCONTINUED
1384
+ # define WCONTINUED 0
1385
+ #endif
1386
+
1387
+ /* called on sigchld etc., calls waitpid */
1388
+ static void
1389
+ childcb (EV_P_ ev_signal *sw, int revents)
1390
+ {
1391
+ int pid, status;
1392
+
1393
+ /* some systems define WCONTINUED but then fail to support it (linux 2.4) */
1394
+ if (0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED | WCONTINUED)))
1395
+ if (!WCONTINUED
1396
+ || errno != EINVAL
1397
+ || 0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED)))
1398
+ return;
1399
+
1400
+ /* make sure we are called again until all children have been reaped */
1401
+ /* we need to do it this way so that the callback gets called before we continue */
1402
+ ev_feed_event (EV_A_ (W)sw, EV_SIGNAL);
1403
+
1404
+ child_reap (EV_A_ pid, pid, status);
1405
+ if (EV_PID_HASHSIZE > 1)
1406
+ child_reap (EV_A_ 0, pid, status); /* this might trigger a watcher twice, but feed_event catches that */
1407
+ }
1408
+
1409
+ #endif
1410
+
1411
+ /*****************************************************************************/
1412
+
1413
+ #if EV_USE_PORT
1414
+ # include "ev_port.c"
1415
+ #endif
1416
+ #if EV_USE_KQUEUE
1417
+ # include "ev_kqueue.c"
1418
+ #endif
1419
+ #if EV_USE_EPOLL
1420
+ # include "ev_epoll.c"
1421
+ #endif
1422
+ #if EV_USE_POLL
1423
+ # include "ev_poll.c"
1424
+ #endif
1425
+ #if EV_USE_SELECT
1426
+ # include "ev_select.c"
1427
+ #endif
1428
+
1429
+ int
1430
+ ev_version_major (void)
1431
+ {
1432
+ return EV_VERSION_MAJOR;
1433
+ }
1434
+
1435
+ int
1436
+ ev_version_minor (void)
1437
+ {
1438
+ return EV_VERSION_MINOR;
1439
+ }
1440
+
1441
+ /* return true if we are running with elevated privileges and should ignore env variables */
1442
+ int inline_size
1443
+ enable_secure (void)
1444
+ {
1445
+ #ifdef _WIN32
1446
+ return 0;
1447
+ #else
1448
+ return getuid () != geteuid ()
1449
+ || getgid () != getegid ();
1450
+ #endif
1451
+ }
1452
+
1453
+ unsigned int
1454
+ ev_supported_backends (void)
1455
+ {
1456
+ unsigned int flags = 0;
1457
+
1458
+ if (EV_USE_PORT ) flags |= EVBACKEND_PORT;
1459
+ if (EV_USE_KQUEUE) flags |= EVBACKEND_KQUEUE;
1460
+ if (EV_USE_EPOLL ) flags |= EVBACKEND_EPOLL;
1461
+ if (EV_USE_POLL ) flags |= EVBACKEND_POLL;
1462
+ if (EV_USE_SELECT) flags |= EVBACKEND_SELECT;
1463
+
1464
+ return flags;
1465
+ }
1466
+
1467
+ unsigned int
1468
+ ev_recommended_backends (void)
1469
+ {
1470
+ unsigned int flags = ev_supported_backends ();
1471
+
1472
+ #ifndef __NetBSD__
1473
+ /* kqueue is borked on everything but netbsd apparently */
1474
+ /* it usually doesn't work correctly on anything but sockets and pipes */
1475
+ flags &= ~EVBACKEND_KQUEUE;
1476
+ #endif
1477
+ #ifdef __APPLE__
1478
+ /* only select works correctly on that "unix-certified" platform */
1479
+ flags &= ~EVBACKEND_KQUEUE; /* horribly broken, even for sockets */
1480
+ flags &= ~EVBACKEND_POLL; /* poll is based on kqueue from 10.5 onwards */
1481
+ #endif
1482
+
1483
+ return flags;
1484
+ }
1485
+
1486
+ unsigned int
1487
+ ev_embeddable_backends (void)
1488
+ {
1489
+ int flags = EVBACKEND_EPOLL | EVBACKEND_KQUEUE | EVBACKEND_PORT;
1490
+
1491
+ /* epoll embeddability broken on all linux versions up to at least 2.6.23 */
1492
+ /* please fix it and tell me how to detect the fix */
1493
+ flags &= ~EVBACKEND_EPOLL;
1494
+
1495
+ return flags;
1496
+ }
1497
+
1498
+ unsigned int
1499
+ ev_backend (EV_P)
1500
+ {
1501
+ return backend;
1502
+ }
1503
+
1504
+ #if EV_MINIMAL < 2
1505
+ unsigned int
1506
+ ev_loop_count (EV_P)
1507
+ {
1508
+ return loop_count;
1509
+ }
1510
+
1511
+ unsigned int
1512
+ ev_loop_depth (EV_P)
1513
+ {
1514
+ return loop_depth;
1515
+ }
1516
+
1517
+ void
1518
+ ev_set_io_collect_interval (EV_P_ ev_tstamp interval)
1519
+ {
1520
+ io_blocktime = interval;
1521
+ }
1522
+
1523
+ void
1524
+ ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval)
1525
+ {
1526
+ timeout_blocktime = interval;
1527
+ }
1528
+
1529
+ void
1530
+ ev_set_userdata (EV_P_ void *data)
1531
+ {
1532
+ userdata = data;
1533
+ }
1534
+
1535
+ void *
1536
+ ev_userdata (EV_P)
1537
+ {
1538
+ return userdata;
1539
+ }
1540
+
1541
+ void ev_set_invoke_pending_cb (EV_P_ void (*invoke_pending_cb)(EV_P))
1542
+ {
1543
+ invoke_cb = invoke_pending_cb;
1544
+ }
1545
+
1546
+ void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P), void (*acquire)(EV_P))
1547
+ {
1548
+ release_cb = release;
1549
+ acquire_cb = acquire;
1550
+ }
1551
+ #endif
1552
+
1553
+ /* initialise a loop structure, must be zero-initialised */
1554
+ static void noinline
1555
+ loop_init (EV_P_ unsigned int flags)
1556
+ {
1557
+ if (!backend)
1558
+ {
1559
+ #if EV_USE_REALTIME
1560
+ if (!have_realtime)
1561
+ {
1562
+ struct timespec ts;
1563
+
1564
+ if (!clock_gettime (CLOCK_REALTIME, &ts))
1565
+ have_realtime = 1;
1566
+ }
1567
+ #endif
1568
+
1569
+ #if EV_USE_MONOTONIC
1570
+ if (!have_monotonic)
1571
+ {
1572
+ struct timespec ts;
1573
+
1574
+ if (!clock_gettime (CLOCK_MONOTONIC, &ts))
1575
+ have_monotonic = 1;
1576
+ }
1577
+ #endif
1578
+
1579
+ /* pid check not overridable via env */
1580
+ #ifndef _WIN32
1581
+ if (flags & EVFLAG_FORKCHECK)
1582
+ curpid = getpid ();
1583
+ #endif
1584
+
1585
+ if (!(flags & EVFLAG_NOENV)
1586
+ && !enable_secure ()
1587
+ && getenv ("LIBEV_FLAGS"))
1588
+ flags = atoi (getenv ("LIBEV_FLAGS"));
1589
+
1590
+ ev_rt_now = ev_time ();
1591
+ mn_now = get_clock ();
1592
+ now_floor = mn_now;
1593
+ rtmn_diff = ev_rt_now - mn_now;
1594
+ #if EV_MINIMAL < 2
1595
+ invoke_cb = ev_invoke_pending;
1596
+ #endif
1597
+
1598
+ io_blocktime = 0.;
1599
+ timeout_blocktime = 0.;
1600
+ backend = 0;
1601
+ backend_fd = -1;
1602
+ sig_pending = 0;
1603
+ #if EV_ASYNC_ENABLE
1604
+ async_pending = 0;
1605
+ #endif
1606
+ #if EV_USE_INOTIFY
1607
+ fs_fd = flags & EVFLAG_NOINOTIFY ? -1 : -2;
1608
+ #endif
1609
+ #if EV_USE_SIGNALFD
1610
+ sigfd = flags & EVFLAG_SIGNALFD ? -2 : -1;
1611
+ #endif
1612
+
1613
+ if (!(flags & 0x0000ffffU))
1614
+ flags |= ev_recommended_backends ();
1615
+
1616
+ #if EV_USE_PORT
1617
+ if (!backend && (flags & EVBACKEND_PORT )) backend = port_init (EV_A_ flags);
1618
+ #endif
1619
+ #if EV_USE_KQUEUE
1620
+ if (!backend && (flags & EVBACKEND_KQUEUE)) backend = kqueue_init (EV_A_ flags);
1621
+ #endif
1622
+ #if EV_USE_EPOLL
1623
+ if (!backend && (flags & EVBACKEND_EPOLL )) backend = epoll_init (EV_A_ flags);
1624
+ #endif
1625
+ #if EV_USE_POLL
1626
+ if (!backend && (flags & EVBACKEND_POLL )) backend = poll_init (EV_A_ flags);
1627
+ #endif
1628
+ #if EV_USE_SELECT
1629
+ if (!backend && (flags & EVBACKEND_SELECT)) backend = select_init (EV_A_ flags);
1630
+ #endif
1631
+
1632
+ ev_prepare_init (&pending_w, pendingcb);
1633
+
1634
+ ev_init (&pipe_w, pipecb);
1635
+ ev_set_priority (&pipe_w, EV_MAXPRI);
1636
+ }
1637
+ }
1638
+
1639
+ /* free up a loop structure */
1640
+ static void noinline
1641
+ loop_destroy (EV_P)
1642
+ {
1643
+ int i;
1644
+
1645
+ if (ev_is_active (&pipe_w))
1646
+ {
1647
+ /*ev_ref (EV_A);*/
1648
+ /*ev_io_stop (EV_A_ &pipe_w);*/
1649
+
1650
+ #if EV_USE_EVENTFD
1651
+ if (evfd >= 0)
1652
+ close (evfd);
1653
+ #endif
1654
+
1655
+ if (evpipe [0] >= 0)
1656
+ {
1657
+ EV_WIN32_CLOSE_FD (evpipe [0]);
1658
+ EV_WIN32_CLOSE_FD (evpipe [1]);
1659
+ }
1660
+ }
1661
+
1662
+ #if EV_USE_SIGNALFD
1663
+ if (ev_is_active (&sigfd_w))
1664
+ close (sigfd);
1665
+ #endif
1666
+
1667
+ #if EV_USE_INOTIFY
1668
+ if (fs_fd >= 0)
1669
+ close (fs_fd);
1670
+ #endif
1671
+
1672
+ if (backend_fd >= 0)
1673
+ close (backend_fd);
1674
+
1675
+ #if EV_USE_PORT
1676
+ if (backend == EVBACKEND_PORT ) port_destroy (EV_A);
1677
+ #endif
1678
+ #if EV_USE_KQUEUE
1679
+ if (backend == EVBACKEND_KQUEUE) kqueue_destroy (EV_A);
1680
+ #endif
1681
+ #if EV_USE_EPOLL
1682
+ if (backend == EVBACKEND_EPOLL ) epoll_destroy (EV_A);
1683
+ #endif
1684
+ #if EV_USE_POLL
1685
+ if (backend == EVBACKEND_POLL ) poll_destroy (EV_A);
1686
+ #endif
1687
+ #if EV_USE_SELECT
1688
+ if (backend == EVBACKEND_SELECT) select_destroy (EV_A);
1689
+ #endif
1690
+
1691
+ for (i = NUMPRI; i--; )
1692
+ {
1693
+ array_free (pending, [i]);
1694
+ #if EV_IDLE_ENABLE
1695
+ array_free (idle, [i]);
1696
+ #endif
1697
+ }
1698
+
1699
+ ev_free (anfds); anfds = 0; anfdmax = 0;
1700
+
1701
+ /* have to use the microsoft-never-gets-it-right macro */
1702
+ array_free (rfeed, EMPTY);
1703
+ array_free (fdchange, EMPTY);
1704
+ array_free (timer, EMPTY);
1705
+ #if EV_PERIODIC_ENABLE
1706
+ array_free (periodic, EMPTY);
1707
+ #endif
1708
+ #if EV_FORK_ENABLE
1709
+ array_free (fork, EMPTY);
1710
+ #endif
1711
+ array_free (prepare, EMPTY);
1712
+ array_free (check, EMPTY);
1713
+ #if EV_ASYNC_ENABLE
1714
+ array_free (async, EMPTY);
1715
+ #endif
1716
+
1717
+ backend = 0;
1718
+ }
1719
+
1720
+ #if EV_USE_INOTIFY
1721
+ inline_size void infy_fork (EV_P);
1722
+ #endif
1723
+
1724
+ inline_size void
1725
+ loop_fork (EV_P)
1726
+ {
1727
+ #if EV_USE_PORT
1728
+ if (backend == EVBACKEND_PORT ) port_fork (EV_A);
1729
+ #endif
1730
+ #if EV_USE_KQUEUE
1731
+ if (backend == EVBACKEND_KQUEUE) kqueue_fork (EV_A);
1732
+ #endif
1733
+ #if EV_USE_EPOLL
1734
+ if (backend == EVBACKEND_EPOLL ) epoll_fork (EV_A);
1735
+ #endif
1736
+ #if EV_USE_INOTIFY
1737
+ infy_fork (EV_A);
1738
+ #endif
1739
+
1740
+ if (ev_is_active (&pipe_w))
1741
+ {
1742
+ /* this "locks" the handlers against writing to the pipe */
1743
+ /* while we modify the fd vars */
1744
+ sig_pending = 1;
1745
+ #if EV_ASYNC_ENABLE
1746
+ async_pending = 1;
1747
+ #endif
1748
+
1749
+ ev_ref (EV_A);
1750
+ ev_io_stop (EV_A_ &pipe_w);
1751
+
1752
+ #if EV_USE_EVENTFD
1753
+ if (evfd >= 0)
1754
+ close (evfd);
1755
+ #endif
1756
+
1757
+ if (evpipe [0] >= 0)
1758
+ {
1759
+ EV_WIN32_CLOSE_FD (evpipe [0]);
1760
+ EV_WIN32_CLOSE_FD (evpipe [1]);
1761
+ }
1762
+
1763
+ evpipe_init (EV_A);
1764
+ /* now iterate over everything, in case we missed something */
1765
+ pipecb (EV_A_ &pipe_w, EV_READ);
1766
+ }
1767
+
1768
+ postfork = 0;
1769
+ }
1770
+
1771
+ #if EV_MULTIPLICITY
1772
+
1773
+ struct ev_loop *
1774
+ ev_loop_new (unsigned int flags)
1775
+ {
1776
+ EV_P = (struct ev_loop *)ev_malloc (sizeof (struct ev_loop));
1777
+
1778
+ memset (EV_A, 0, sizeof (struct ev_loop));
1779
+ loop_init (EV_A_ flags);
1780
+
1781
+ if (ev_backend (EV_A))
1782
+ return EV_A;
1783
+
1784
+ return 0;
1785
+ }
1786
+
1787
+ void
1788
+ ev_loop_destroy (EV_P)
1789
+ {
1790
+ loop_destroy (EV_A);
1791
+ ev_free (loop);
1792
+ }
1793
+
1794
+ void
1795
+ ev_loop_fork (EV_P)
1796
+ {
1797
+ postfork = 1; /* must be in line with ev_default_fork */
1798
+ }
1799
+ #endif /* multiplicity */
1800
+
1801
+ #if EV_VERIFY
1802
+ static void noinline
1803
+ verify_watcher (EV_P_ W w)
1804
+ {
1805
+ assert (("libev: watcher has invalid priority", ABSPRI (w) >= 0 && ABSPRI (w) < NUMPRI));
1806
+
1807
+ if (w->pending)
1808
+ assert (("libev: pending watcher not on pending queue", pendings [ABSPRI (w)][w->pending - 1].w == w));
1809
+ }
1810
+
1811
+ static void noinline
1812
+ verify_heap (EV_P_ ANHE *heap, int N)
1813
+ {
1814
+ int i;
1815
+
1816
+ for (i = HEAP0; i < N + HEAP0; ++i)
1817
+ {
1818
+ assert (("libev: active index mismatch in heap", ev_active (ANHE_w (heap [i])) == i));
1819
+ assert (("libev: heap condition violated", i == HEAP0 || ANHE_at (heap [HPARENT (i)]) <= ANHE_at (heap [i])));
1820
+ assert (("libev: heap at cache mismatch", ANHE_at (heap [i]) == ev_at (ANHE_w (heap [i]))));
1821
+
1822
+ verify_watcher (EV_A_ (W)ANHE_w (heap [i]));
1823
+ }
1824
+ }
1825
+
1826
+ static void noinline
1827
+ array_verify (EV_P_ W *ws, int cnt)
1828
+ {
1829
+ while (cnt--)
1830
+ {
1831
+ assert (("libev: active index mismatch", ev_active (ws [cnt]) == cnt + 1));
1832
+ verify_watcher (EV_A_ ws [cnt]);
1833
+ }
1834
+ }
1835
+ #endif
1836
+
1837
+ #if EV_MINIMAL < 2
1838
+ void
1839
+ ev_loop_verify (EV_P)
1840
+ {
1841
+ #if EV_VERIFY
1842
+ int i;
1843
+ WL w;
1844
+
1845
+ assert (activecnt >= -1);
1846
+
1847
+ assert (fdchangemax >= fdchangecnt);
1848
+ for (i = 0; i < fdchangecnt; ++i)
1849
+ assert (("libev: negative fd in fdchanges", fdchanges [i] >= 0));
1850
+
1851
+ assert (anfdmax >= 0);
1852
+ for (i = 0; i < anfdmax; ++i)
1853
+ for (w = anfds [i].head; w; w = w->next)
1854
+ {
1855
+ verify_watcher (EV_A_ (W)w);
1856
+ assert (("libev: inactive fd watcher on anfd list", ev_active (w) == 1));
1857
+ assert (("libev: fd mismatch between watcher and anfd", ((ev_io *)w)->fd == i));
1858
+ }
1859
+
1860
+ assert (timermax >= timercnt);
1861
+ verify_heap (EV_A_ timers, timercnt);
1862
+
1863
+ #if EV_PERIODIC_ENABLE
1864
+ assert (periodicmax >= periodiccnt);
1865
+ verify_heap (EV_A_ periodics, periodiccnt);
1866
+ #endif
1867
+
1868
+ for (i = NUMPRI; i--; )
1869
+ {
1870
+ assert (pendingmax [i] >= pendingcnt [i]);
1871
+ #if EV_IDLE_ENABLE
1872
+ assert (idleall >= 0);
1873
+ assert (idlemax [i] >= idlecnt [i]);
1874
+ array_verify (EV_A_ (W *)idles [i], idlecnt [i]);
1875
+ #endif
1876
+ }
1877
+
1878
+ #if EV_FORK_ENABLE
1879
+ assert (forkmax >= forkcnt);
1880
+ array_verify (EV_A_ (W *)forks, forkcnt);
1881
+ #endif
1882
+
1883
+ #if EV_ASYNC_ENABLE
1884
+ assert (asyncmax >= asynccnt);
1885
+ array_verify (EV_A_ (W *)asyncs, asynccnt);
1886
+ #endif
1887
+
1888
+ assert (preparemax >= preparecnt);
1889
+ array_verify (EV_A_ (W *)prepares, preparecnt);
1890
+
1891
+ assert (checkmax >= checkcnt);
1892
+ array_verify (EV_A_ (W *)checks, checkcnt);
1893
+
1894
+ # if 0
1895
+ for (w = (ev_child *)childs [chain & (EV_PID_HASHSIZE - 1)]; w; w = (ev_child *)((WL)w)->next)
1896
+ for (signum = EV_NSIG; signum--; ) if (signals [signum].pending)
1897
+ # endif
1898
+ #endif
1899
+ }
1900
+ #endif
1901
+
1902
+ #if EV_MULTIPLICITY
1903
+ struct ev_loop *
1904
+ ev_default_loop_init (unsigned int flags)
1905
+ #else
1906
+ int
1907
+ ev_default_loop (unsigned int flags)
1908
+ #endif
1909
+ {
1910
+ if (!ev_default_loop_ptr)
1911
+ {
1912
+ #if EV_MULTIPLICITY
1913
+ EV_P = ev_default_loop_ptr = &default_loop_struct;
1914
+ #else
1915
+ ev_default_loop_ptr = 1;
1916
+ #endif
1917
+
1918
+ loop_init (EV_A_ flags);
1919
+
1920
+ if (ev_backend (EV_A))
1921
+ {
1922
+ #ifndef _WIN32
1923
+ ev_signal_init (&childev, childcb, SIGCHLD);
1924
+ ev_set_priority (&childev, EV_MAXPRI);
1925
+ ev_signal_start (EV_A_ &childev);
1926
+ ev_unref (EV_A); /* child watcher should not keep loop alive */
1927
+ #endif
1928
+ }
1929
+ else
1930
+ ev_default_loop_ptr = 0;
1931
+ }
1932
+
1933
+ return ev_default_loop_ptr;
1934
+ }
1935
+
1936
+ void
1937
+ ev_default_destroy (void)
1938
+ {
1939
+ #if EV_MULTIPLICITY
1940
+ EV_P = ev_default_loop_ptr;
1941
+ #endif
1942
+
1943
+ ev_default_loop_ptr = 0;
1944
+
1945
+ #ifndef _WIN32
1946
+ ev_ref (EV_A); /* child watcher */
1947
+ ev_signal_stop (EV_A_ &childev);
1948
+ #endif
1949
+
1950
+ loop_destroy (EV_A);
1951
+ }
1952
+
1953
+ void
1954
+ ev_default_fork (void)
1955
+ {
1956
+ #if EV_MULTIPLICITY
1957
+ EV_P = ev_default_loop_ptr;
1958
+ #endif
1959
+
1960
+ postfork = 1; /* must be in line with ev_loop_fork */
1961
+ }
1962
+
1963
+ /*****************************************************************************/
1964
+
1965
+ void
1966
+ ev_invoke (EV_P_ void *w, int revents)
1967
+ {
1968
+ EV_CB_INVOKE ((W)w, revents);
1969
+ }
1970
+
1971
+ unsigned int
1972
+ ev_pending_count (EV_P)
1973
+ {
1974
+ int pri;
1975
+ unsigned int count = 0;
1976
+
1977
+ for (pri = NUMPRI; pri--; )
1978
+ count += pendingcnt [pri];
1979
+
1980
+ return count;
1981
+ }
1982
+
1983
+ void noinline
1984
+ ev_invoke_pending (EV_P)
1985
+ {
1986
+ int pri;
1987
+
1988
+ for (pri = NUMPRI; pri--; )
1989
+ while (pendingcnt [pri])
1990
+ {
1991
+ ANPENDING *p = pendings [pri] + --pendingcnt [pri];
1992
+
1993
+ /*assert (("libev: non-pending watcher on pending list", p->w->pending));*/
1994
+ /* ^ this is no longer true, as pending_w could be here */
1995
+
1996
+ p->w->pending = 0;
1997
+ EV_CB_INVOKE (p->w, p->events);
1998
+ EV_FREQUENT_CHECK;
1999
+ }
2000
+ }
2001
+
2002
+ #if EV_IDLE_ENABLE
2003
+ /* make idle watchers pending. this handles the "call-idle */
2004
+ /* only when higher priorities are idle" logic */
2005
+ inline_size void
2006
+ idle_reify (EV_P)
2007
+ {
2008
+ if (expect_false (idleall))
2009
+ {
2010
+ int pri;
2011
+
2012
+ for (pri = NUMPRI; pri--; )
2013
+ {
2014
+ if (pendingcnt [pri])
2015
+ break;
2016
+
2017
+ if (idlecnt [pri])
2018
+ {
2019
+ queue_events (EV_A_ (W *)idles [pri], idlecnt [pri], EV_IDLE);
2020
+ break;
2021
+ }
2022
+ }
2023
+ }
2024
+ }
2025
+ #endif
2026
+
2027
+ /* make timers pending */
2028
+ inline_size void
2029
+ timers_reify (EV_P)
2030
+ {
2031
+ EV_FREQUENT_CHECK;
2032
+
2033
+ if (timercnt && ANHE_at (timers [HEAP0]) < mn_now)
2034
+ {
2035
+ do
2036
+ {
2037
+ ev_timer *w = (ev_timer *)ANHE_w (timers [HEAP0]);
2038
+
2039
+ /*assert (("libev: inactive timer on timer heap detected", ev_is_active (w)));*/
2040
+
2041
+ /* first reschedule or stop timer */
2042
+ if (w->repeat)
2043
+ {
2044
+ ev_at (w) += w->repeat;
2045
+ if (ev_at (w) < mn_now)
2046
+ ev_at (w) = mn_now;
2047
+
2048
+ assert (("libev: negative ev_timer repeat value found while processing timers", w->repeat > 0.));
2049
+
2050
+ ANHE_at_cache (timers [HEAP0]);
2051
+ downheap (timers, timercnt, HEAP0);
2052
+ }
2053
+ else
2054
+ ev_timer_stop (EV_A_ w); /* nonrepeating: stop timer */
2055
+
2056
+ EV_FREQUENT_CHECK;
2057
+ feed_reverse (EV_A_ (W)w);
2058
+ }
2059
+ while (timercnt && ANHE_at (timers [HEAP0]) < mn_now);
2060
+
2061
+ feed_reverse_done (EV_A_ EV_TIMEOUT);
2062
+ }
2063
+ }
2064
+
2065
+ #if EV_PERIODIC_ENABLE
2066
+ /* make periodics pending */
2067
+ inline_size void
2068
+ periodics_reify (EV_P)
2069
+ {
2070
+ EV_FREQUENT_CHECK;
2071
+
2072
+ while (periodiccnt && ANHE_at (periodics [HEAP0]) < ev_rt_now)
2073
+ {
2074
+ int feed_count = 0;
2075
+
2076
+ do
2077
+ {
2078
+ ev_periodic *w = (ev_periodic *)ANHE_w (periodics [HEAP0]);
2079
+
2080
+ /*assert (("libev: inactive timer on periodic heap detected", ev_is_active (w)));*/
2081
+
2082
+ /* first reschedule or stop timer */
2083
+ if (w->reschedule_cb)
2084
+ {
2085
+ ev_at (w) = w->reschedule_cb (w, ev_rt_now);
2086
+
2087
+ assert (("libev: ev_periodic reschedule callback returned time in the past", ev_at (w) >= ev_rt_now));
2088
+
2089
+ ANHE_at_cache (periodics [HEAP0]);
2090
+ downheap (periodics, periodiccnt, HEAP0);
2091
+ }
2092
+ else if (w->interval)
2093
+ {
2094
+ ev_at (w) = w->offset + ceil ((ev_rt_now - w->offset) / w->interval) * w->interval;
2095
+ /* if next trigger time is not sufficiently in the future, put it there */
2096
+ /* this might happen because of floating point inexactness */
2097
+ if (ev_at (w) - ev_rt_now < TIME_EPSILON)
2098
+ {
2099
+ ev_at (w) += w->interval;
2100
+
2101
+ /* if interval is unreasonably low we might still have a time in the past */
2102
+ /* so correct this. this will make the periodic very inexact, but the user */
2103
+ /* has effectively asked to get triggered more often than possible */
2104
+ if (ev_at (w) < ev_rt_now)
2105
+ ev_at (w) = ev_rt_now;
2106
+ }
2107
+
2108
+ ANHE_at_cache (periodics [HEAP0]);
2109
+ downheap (periodics, periodiccnt, HEAP0);
2110
+ }
2111
+ else
2112
+ ev_periodic_stop (EV_A_ w); /* nonrepeating: stop timer */
2113
+
2114
+ EV_FREQUENT_CHECK;
2115
+ feed_reverse (EV_A_ (W)w);
2116
+ }
2117
+ while (periodiccnt && ANHE_at (periodics [HEAP0]) < ev_rt_now);
2118
+
2119
+ feed_reverse_done (EV_A_ EV_PERIODIC);
2120
+ }
2121
+ }
2122
+
2123
+ /* simply recalculate all periodics */
2124
+ /* TODO: maybe ensure that at leats one event happens when jumping forward? */
2125
+ static void noinline
2126
+ periodics_reschedule (EV_P)
2127
+ {
2128
+ int i;
2129
+
2130
+ /* adjust periodics after time jump */
2131
+ for (i = HEAP0; i < periodiccnt + HEAP0; ++i)
2132
+ {
2133
+ ev_periodic *w = (ev_periodic *)ANHE_w (periodics [i]);
2134
+
2135
+ if (w->reschedule_cb)
2136
+ ev_at (w) = w->reschedule_cb (w, ev_rt_now);
2137
+ else if (w->interval)
2138
+ ev_at (w) = w->offset + ceil ((ev_rt_now - w->offset) / w->interval) * w->interval;
2139
+
2140
+ ANHE_at_cache (periodics [i]);
2141
+ }
2142
+
2143
+ reheap (periodics, periodiccnt);
2144
+ }
2145
+ #endif
2146
+
2147
+ /* adjust all timers by a given offset */
2148
+ static void noinline
2149
+ timers_reschedule (EV_P_ ev_tstamp adjust)
2150
+ {
2151
+ int i;
2152
+
2153
+ for (i = 0; i < timercnt; ++i)
2154
+ {
2155
+ ANHE *he = timers + i + HEAP0;
2156
+ ANHE_w (*he)->at += adjust;
2157
+ ANHE_at_cache (*he);
2158
+ }
2159
+ }
2160
+
2161
+ /* fetch new monotonic and realtime times from the kernel */
2162
+ /* also detetc if there was a timejump, and act accordingly */
2163
+ inline_speed void
2164
+ time_update (EV_P_ ev_tstamp max_block)
2165
+ {
2166
+ #if EV_USE_MONOTONIC
2167
+ if (expect_true (have_monotonic))
2168
+ {
2169
+ int i;
2170
+ ev_tstamp odiff = rtmn_diff;
2171
+
2172
+ mn_now = get_clock ();
2173
+
2174
+ /* only fetch the realtime clock every 0.5*MIN_TIMEJUMP seconds */
2175
+ /* interpolate in the meantime */
2176
+ if (expect_true (mn_now - now_floor < MIN_TIMEJUMP * .5))
2177
+ {
2178
+ ev_rt_now = rtmn_diff + mn_now;
2179
+ return;
2180
+ }
2181
+
2182
+ now_floor = mn_now;
2183
+ ev_rt_now = ev_time ();
2184
+
2185
+ /* loop a few times, before making important decisions.
2186
+ * on the choice of "4": one iteration isn't enough,
2187
+ * in case we get preempted during the calls to
2188
+ * ev_time and get_clock. a second call is almost guaranteed
2189
+ * to succeed in that case, though. and looping a few more times
2190
+ * doesn't hurt either as we only do this on time-jumps or
2191
+ * in the unlikely event of having been preempted here.
2192
+ */
2193
+ for (i = 4; --i; )
2194
+ {
2195
+ rtmn_diff = ev_rt_now - mn_now;
2196
+
2197
+ if (expect_true (fabs (odiff - rtmn_diff) < MIN_TIMEJUMP))
2198
+ return; /* all is well */
2199
+
2200
+ ev_rt_now = ev_time ();
2201
+ mn_now = get_clock ();
2202
+ now_floor = mn_now;
2203
+ }
2204
+
2205
+ /* no timer adjustment, as the monotonic clock doesn't jump */
2206
+ /* timers_reschedule (EV_A_ rtmn_diff - odiff) */
2207
+ # if EV_PERIODIC_ENABLE
2208
+ periodics_reschedule (EV_A);
2209
+ # endif
2210
+ }
2211
+ else
2212
+ #endif
2213
+ {
2214
+ ev_rt_now = ev_time ();
2215
+
2216
+ if (expect_false (mn_now > ev_rt_now || ev_rt_now > mn_now + max_block + MIN_TIMEJUMP))
2217
+ {
2218
+ /* adjust timers. this is easy, as the offset is the same for all of them */
2219
+ timers_reschedule (EV_A_ ev_rt_now - mn_now);
2220
+ #if EV_PERIODIC_ENABLE
2221
+ periodics_reschedule (EV_A);
2222
+ #endif
2223
+ }
2224
+
2225
+ mn_now = ev_rt_now;
2226
+ }
2227
+ }
2228
+
2229
+ void
2230
+ ev_loop (EV_P_ int flags)
2231
+ {
2232
+ #if EV_MINIMAL < 2
2233
+ ++loop_depth;
2234
+ #endif
2235
+
2236
+ assert (("libev: ev_loop recursion during release detected", loop_done != EVUNLOOP_RECURSE));
2237
+
2238
+ loop_done = EVUNLOOP_CANCEL;
2239
+
2240
+ EV_INVOKE_PENDING; /* in case we recurse, ensure ordering stays nice and clean */
2241
+
2242
+ do
2243
+ {
2244
+ #if EV_VERIFY >= 2
2245
+ ev_loop_verify (EV_A);
2246
+ #endif
2247
+
2248
+ #ifndef _WIN32
2249
+ if (expect_false (curpid)) /* penalise the forking check even more */
2250
+ if (expect_false (getpid () != curpid))
2251
+ {
2252
+ curpid = getpid ();
2253
+ postfork = 1;
2254
+ }
2255
+ #endif
2256
+
2257
+ #if EV_FORK_ENABLE
2258
+ /* we might have forked, so queue fork handlers */
2259
+ if (expect_false (postfork))
2260
+ if (forkcnt)
2261
+ {
2262
+ queue_events (EV_A_ (W *)forks, forkcnt, EV_FORK);
2263
+ EV_INVOKE_PENDING;
2264
+ }
2265
+ #endif
2266
+
2267
+ /* queue prepare watchers (and execute them) */
2268
+ if (expect_false (preparecnt))
2269
+ {
2270
+ queue_events (EV_A_ (W *)prepares, preparecnt, EV_PREPARE);
2271
+ EV_INVOKE_PENDING;
2272
+ }
2273
+
2274
+ if (expect_false (loop_done))
2275
+ break;
2276
+
2277
+ /* we might have forked, so reify kernel state if necessary */
2278
+ if (expect_false (postfork))
2279
+ loop_fork (EV_A);
2280
+
2281
+ /* update fd-related kernel structures */
2282
+ fd_reify (EV_A);
2283
+
2284
+ /* calculate blocking time */
2285
+ {
2286
+ ev_tstamp waittime = 0.;
2287
+ ev_tstamp sleeptime = 0.;
2288
+
2289
+ if (expect_true (!(flags & EVLOOP_NONBLOCK || idleall || !activecnt)))
2290
+ {
2291
+ /* remember old timestamp for io_blocktime calculation */
2292
+ ev_tstamp prev_mn_now = mn_now;
2293
+
2294
+ /* update time to cancel out callback processing overhead */
2295
+ time_update (EV_A_ 1e100);
2296
+
2297
+ waittime = MAX_BLOCKTIME;
2298
+
2299
+ if (timercnt)
2300
+ {
2301
+ ev_tstamp to = ANHE_at (timers [HEAP0]) - mn_now + backend_fudge;
2302
+ if (waittime > to) waittime = to;
2303
+ }
2304
+
2305
+ #if EV_PERIODIC_ENABLE
2306
+ if (periodiccnt)
2307
+ {
2308
+ ev_tstamp to = ANHE_at (periodics [HEAP0]) - ev_rt_now + backend_fudge;
2309
+ if (waittime > to) waittime = to;
2310
+ }
2311
+ #endif
2312
+
2313
+ /* don't let timeouts decrease the waittime below timeout_blocktime */
2314
+ if (expect_false (waittime < timeout_blocktime))
2315
+ waittime = timeout_blocktime;
2316
+
2317
+ /* extra check because io_blocktime is commonly 0 */
2318
+ if (expect_false (io_blocktime))
2319
+ {
2320
+ sleeptime = io_blocktime - (mn_now - prev_mn_now);
2321
+
2322
+ if (sleeptime > waittime - backend_fudge)
2323
+ sleeptime = waittime - backend_fudge;
2324
+
2325
+ if (expect_true (sleeptime > 0.))
2326
+ {
2327
+ ev_sleep (sleeptime);
2328
+ waittime -= sleeptime;
2329
+ }
2330
+ }
2331
+ }
2332
+
2333
+ #if EV_MINIMAL < 2
2334
+ ++loop_count;
2335
+ #endif
2336
+ assert ((loop_done = EVUNLOOP_RECURSE, 1)); /* assert for side effect */
2337
+ backend_poll (EV_A_ waittime);
2338
+ assert ((loop_done = EVUNLOOP_CANCEL, 1)); /* assert for side effect */
2339
+
2340
+ /* update ev_rt_now, do magic */
2341
+ time_update (EV_A_ waittime + sleeptime);
2342
+ }
2343
+
2344
+ /* queue pending timers and reschedule them */
2345
+ timers_reify (EV_A); /* relative timers called last */
2346
+ #if EV_PERIODIC_ENABLE
2347
+ periodics_reify (EV_A); /* absolute timers called first */
2348
+ #endif
2349
+
2350
+ #if EV_IDLE_ENABLE
2351
+ /* queue idle watchers unless other events are pending */
2352
+ idle_reify (EV_A);
2353
+ #endif
2354
+
2355
+ /* queue check watchers, to be executed first */
2356
+ if (expect_false (checkcnt))
2357
+ queue_events (EV_A_ (W *)checks, checkcnt, EV_CHECK);
2358
+
2359
+ EV_INVOKE_PENDING;
2360
+ }
2361
+ while (expect_true (
2362
+ activecnt
2363
+ && !loop_done
2364
+ && !(flags & (EVLOOP_ONESHOT | EVLOOP_NONBLOCK))
2365
+ ));
2366
+
2367
+ if (loop_done == EVUNLOOP_ONE)
2368
+ loop_done = EVUNLOOP_CANCEL;
2369
+
2370
+ #if EV_MINIMAL < 2
2371
+ --loop_depth;
2372
+ #endif
2373
+ }
2374
+
2375
+ void
2376
+ ev_unloop (EV_P_ int how)
2377
+ {
2378
+ loop_done = how;
2379
+ }
2380
+
2381
+ void
2382
+ ev_ref (EV_P)
2383
+ {
2384
+ ++activecnt;
2385
+ }
2386
+
2387
+ void
2388
+ ev_unref (EV_P)
2389
+ {
2390
+ --activecnt;
2391
+ }
2392
+
2393
+ void
2394
+ ev_now_update (EV_P)
2395
+ {
2396
+ time_update (EV_A_ 1e100);
2397
+ }
2398
+
2399
+ void
2400
+ ev_suspend (EV_P)
2401
+ {
2402
+ ev_now_update (EV_A);
2403
+ }
2404
+
2405
+ void
2406
+ ev_resume (EV_P)
2407
+ {
2408
+ ev_tstamp mn_prev = mn_now;
2409
+
2410
+ ev_now_update (EV_A);
2411
+ timers_reschedule (EV_A_ mn_now - mn_prev);
2412
+ #if EV_PERIODIC_ENABLE
2413
+ /* TODO: really do this? */
2414
+ periodics_reschedule (EV_A);
2415
+ #endif
2416
+ }
2417
+
2418
+ /*****************************************************************************/
2419
+ /* singly-linked list management, used when the expected list length is short */
2420
+
2421
+ inline_size void
2422
+ wlist_add (WL *head, WL elem)
2423
+ {
2424
+ elem->next = *head;
2425
+ *head = elem;
2426
+ }
2427
+
2428
+ inline_size void
2429
+ wlist_del (WL *head, WL elem)
2430
+ {
2431
+ while (*head)
2432
+ {
2433
+ if (expect_true (*head == elem))
2434
+ {
2435
+ *head = elem->next;
2436
+ break;
2437
+ }
2438
+
2439
+ head = &(*head)->next;
2440
+ }
2441
+ }
2442
+
2443
+ /* internal, faster, version of ev_clear_pending */
2444
+ inline_speed void
2445
+ clear_pending (EV_P_ W w)
2446
+ {
2447
+ if (w->pending)
2448
+ {
2449
+ pendings [ABSPRI (w)][w->pending - 1].w = (W)&pending_w;
2450
+ w->pending = 0;
2451
+ }
2452
+ }
2453
+
2454
+ int
2455
+ ev_clear_pending (EV_P_ void *w)
2456
+ {
2457
+ W w_ = (W)w;
2458
+ int pending = w_->pending;
2459
+
2460
+ if (expect_true (pending))
2461
+ {
2462
+ ANPENDING *p = pendings [ABSPRI (w_)] + pending - 1;
2463
+ p->w = (W)&pending_w;
2464
+ w_->pending = 0;
2465
+ return p->events;
2466
+ }
2467
+ else
2468
+ return 0;
2469
+ }
2470
+
2471
+ inline_size void
2472
+ pri_adjust (EV_P_ W w)
2473
+ {
2474
+ int pri = ev_priority (w);
2475
+ pri = pri < EV_MINPRI ? EV_MINPRI : pri;
2476
+ pri = pri > EV_MAXPRI ? EV_MAXPRI : pri;
2477
+ ev_set_priority (w, pri);
2478
+ }
2479
+
2480
+ inline_speed void
2481
+ ev_start (EV_P_ W w, int active)
2482
+ {
2483
+ pri_adjust (EV_A_ w);
2484
+ w->active = active;
2485
+ ev_ref (EV_A);
2486
+ }
2487
+
2488
+ inline_size void
2489
+ ev_stop (EV_P_ W w)
2490
+ {
2491
+ ev_unref (EV_A);
2492
+ w->active = 0;
2493
+ }
2494
+
2495
+ /*****************************************************************************/
2496
+
2497
+ void noinline
2498
+ ev_io_start (EV_P_ ev_io *w)
2499
+ {
2500
+ int fd = w->fd;
2501
+
2502
+ if (expect_false (ev_is_active (w)))
2503
+ return;
2504
+
2505
+ assert (("libev: ev_io_start called with negative fd", fd >= 0));
2506
+ assert (("libev: ev_io start called with illegal event mask", !(w->events & ~(EV__IOFDSET | EV_READ | EV_WRITE))));
2507
+
2508
+ EV_FREQUENT_CHECK;
2509
+
2510
+ ev_start (EV_A_ (W)w, 1);
2511
+ array_needsize (ANFD, anfds, anfdmax, fd + 1, array_init_zero);
2512
+ wlist_add (&anfds[fd].head, (WL)w);
2513
+
2514
+ fd_change (EV_A_ fd, w->events & EV__IOFDSET | EV_ANFD_REIFY);
2515
+ w->events &= ~EV__IOFDSET;
2516
+
2517
+ EV_FREQUENT_CHECK;
2518
+ }
2519
+
2520
+ void noinline
2521
+ ev_io_stop (EV_P_ ev_io *w)
2522
+ {
2523
+ clear_pending (EV_A_ (W)w);
2524
+ if (expect_false (!ev_is_active (w)))
2525
+ return;
2526
+
2527
+ assert (("libev: ev_io_stop called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax));
2528
+
2529
+ EV_FREQUENT_CHECK;
2530
+
2531
+ wlist_del (&anfds[w->fd].head, (WL)w);
2532
+ ev_stop (EV_A_ (W)w);
2533
+
2534
+ fd_change (EV_A_ w->fd, 1);
2535
+
2536
+ EV_FREQUENT_CHECK;
2537
+ }
2538
+
2539
+ void noinline
2540
+ ev_timer_start (EV_P_ ev_timer *w)
2541
+ {
2542
+ if (expect_false (ev_is_active (w)))
2543
+ return;
2544
+
2545
+ ev_at (w) += mn_now;
2546
+
2547
+ assert (("libev: ev_timer_start called with negative timer repeat value", w->repeat >= 0.));
2548
+
2549
+ EV_FREQUENT_CHECK;
2550
+
2551
+ ++timercnt;
2552
+ ev_start (EV_A_ (W)w, timercnt + HEAP0 - 1);
2553
+ array_needsize (ANHE, timers, timermax, ev_active (w) + 1, EMPTY2);
2554
+ ANHE_w (timers [ev_active (w)]) = (WT)w;
2555
+ ANHE_at_cache (timers [ev_active (w)]);
2556
+ upheap (timers, ev_active (w));
2557
+
2558
+ EV_FREQUENT_CHECK;
2559
+
2560
+ /*assert (("libev: internal timer heap corruption", timers [ev_active (w)] == (WT)w));*/
2561
+ }
2562
+
2563
+ void noinline
2564
+ ev_timer_stop (EV_P_ ev_timer *w)
2565
+ {
2566
+ clear_pending (EV_A_ (W)w);
2567
+ if (expect_false (!ev_is_active (w)))
2568
+ return;
2569
+
2570
+ EV_FREQUENT_CHECK;
2571
+
2572
+ {
2573
+ int active = ev_active (w);
2574
+
2575
+ assert (("libev: internal timer heap corruption", ANHE_w (timers [active]) == (WT)w));
2576
+
2577
+ --timercnt;
2578
+
2579
+ if (expect_true (active < timercnt + HEAP0))
2580
+ {
2581
+ timers [active] = timers [timercnt + HEAP0];
2582
+ adjustheap (timers, timercnt, active);
2583
+ }
2584
+ }
2585
+
2586
+ EV_FREQUENT_CHECK;
2587
+
2588
+ ev_at (w) -= mn_now;
2589
+
2590
+ ev_stop (EV_A_ (W)w);
2591
+ }
2592
+
2593
+ void noinline
2594
+ ev_timer_again (EV_P_ ev_timer *w)
2595
+ {
2596
+ EV_FREQUENT_CHECK;
2597
+
2598
+ if (ev_is_active (w))
2599
+ {
2600
+ if (w->repeat)
2601
+ {
2602
+ ev_at (w) = mn_now + w->repeat;
2603
+ ANHE_at_cache (timers [ev_active (w)]);
2604
+ adjustheap (timers, timercnt, ev_active (w));
2605
+ }
2606
+ else
2607
+ ev_timer_stop (EV_A_ w);
2608
+ }
2609
+ else if (w->repeat)
2610
+ {
2611
+ ev_at (w) = w->repeat;
2612
+ ev_timer_start (EV_A_ w);
2613
+ }
2614
+
2615
+ EV_FREQUENT_CHECK;
2616
+ }
2617
+
2618
+ ev_tstamp
2619
+ ev_timer_remaining (EV_P_ ev_timer *w)
2620
+ {
2621
+ return ev_at (w) - (ev_is_active (w) ? mn_now : 0.);
2622
+ }
2623
+
2624
+ #if EV_PERIODIC_ENABLE
2625
+ void noinline
2626
+ ev_periodic_start (EV_P_ ev_periodic *w)
2627
+ {
2628
+ if (expect_false (ev_is_active (w)))
2629
+ return;
2630
+
2631
+ if (w->reschedule_cb)
2632
+ ev_at (w) = w->reschedule_cb (w, ev_rt_now);
2633
+ else if (w->interval)
2634
+ {
2635
+ assert (("libev: ev_periodic_start called with negative interval value", w->interval >= 0.));
2636
+ /* this formula differs from the one in periodic_reify because we do not always round up */
2637
+ ev_at (w) = w->offset + ceil ((ev_rt_now - w->offset) / w->interval) * w->interval;
2638
+ }
2639
+ else
2640
+ ev_at (w) = w->offset;
2641
+
2642
+ EV_FREQUENT_CHECK;
2643
+
2644
+ ++periodiccnt;
2645
+ ev_start (EV_A_ (W)w, periodiccnt + HEAP0 - 1);
2646
+ array_needsize (ANHE, periodics, periodicmax, ev_active (w) + 1, EMPTY2);
2647
+ ANHE_w (periodics [ev_active (w)]) = (WT)w;
2648
+ ANHE_at_cache (periodics [ev_active (w)]);
2649
+ upheap (periodics, ev_active (w));
2650
+
2651
+ EV_FREQUENT_CHECK;
2652
+
2653
+ /*assert (("libev: internal periodic heap corruption", ANHE_w (periodics [ev_active (w)]) == (WT)w));*/
2654
+ }
2655
+
2656
+ void noinline
2657
+ ev_periodic_stop (EV_P_ ev_periodic *w)
2658
+ {
2659
+ clear_pending (EV_A_ (W)w);
2660
+ if (expect_false (!ev_is_active (w)))
2661
+ return;
2662
+
2663
+ EV_FREQUENT_CHECK;
2664
+
2665
+ {
2666
+ int active = ev_active (w);
2667
+
2668
+ assert (("libev: internal periodic heap corruption", ANHE_w (periodics [active]) == (WT)w));
2669
+
2670
+ --periodiccnt;
2671
+
2672
+ if (expect_true (active < periodiccnt + HEAP0))
2673
+ {
2674
+ periodics [active] = periodics [periodiccnt + HEAP0];
2675
+ adjustheap (periodics, periodiccnt, active);
2676
+ }
2677
+ }
2678
+
2679
+ EV_FREQUENT_CHECK;
2680
+
2681
+ ev_stop (EV_A_ (W)w);
2682
+ }
2683
+
2684
+ void noinline
2685
+ ev_periodic_again (EV_P_ ev_periodic *w)
2686
+ {
2687
+ /* TODO: use adjustheap and recalculation */
2688
+ ev_periodic_stop (EV_A_ w);
2689
+ ev_periodic_start (EV_A_ w);
2690
+ }
2691
+ #endif
2692
+
2693
+ #ifndef SA_RESTART
2694
+ # define SA_RESTART 0
2695
+ #endif
2696
+
2697
+ void noinline
2698
+ ev_signal_start (EV_P_ ev_signal *w)
2699
+ {
2700
+ if (expect_false (ev_is_active (w)))
2701
+ return;
2702
+
2703
+ assert (("libev: ev_signal_start called with illegal signal number", w->signum > 0 && w->signum < EV_NSIG));
2704
+
2705
+ #if EV_MULTIPLICITY
2706
+ assert (("libev: a signal must not be attached to two different loops",
2707
+ !signals [w->signum - 1].loop || signals [w->signum - 1].loop == loop));
2708
+
2709
+ signals [w->signum - 1].loop = EV_A;
2710
+ #endif
2711
+
2712
+ EV_FREQUENT_CHECK;
2713
+
2714
+ #if EV_USE_SIGNALFD
2715
+ if (sigfd == -2)
2716
+ {
2717
+ sigfd = signalfd (-1, &sigfd_set, SFD_NONBLOCK | SFD_CLOEXEC);
2718
+ if (sigfd < 0 && errno == EINVAL)
2719
+ sigfd = signalfd (-1, &sigfd_set, 0); /* retry without flags */
2720
+
2721
+ if (sigfd >= 0)
2722
+ {
2723
+ fd_intern (sigfd); /* doing it twice will not hurt */
2724
+
2725
+ sigemptyset (&sigfd_set);
2726
+
2727
+ ev_io_init (&sigfd_w, sigfdcb, sigfd, EV_READ);
2728
+ ev_set_priority (&sigfd_w, EV_MAXPRI);
2729
+ ev_io_start (EV_A_ &sigfd_w);
2730
+ ev_unref (EV_A); /* signalfd watcher should not keep loop alive */
2731
+ }
2732
+ }
2733
+
2734
+ if (sigfd >= 0)
2735
+ {
2736
+ /* TODO: check .head */
2737
+ sigaddset (&sigfd_set, w->signum);
2738
+ sigprocmask (SIG_BLOCK, &sigfd_set, 0);
2739
+
2740
+ signalfd (sigfd, &sigfd_set, 0);
2741
+ }
2742
+ #endif
2743
+
2744
+ ev_start (EV_A_ (W)w, 1);
2745
+ wlist_add (&signals [w->signum - 1].head, (WL)w);
2746
+
2747
+ if (!((WL)w)->next)
2748
+ # if EV_USE_SIGNALFD
2749
+ if (sigfd < 0) /*TODO*/
2750
+ # endif
2751
+ {
2752
+ # if _WIN32
2753
+ evpipe_init (EV_A);
2754
+
2755
+ signal (w->signum, ev_sighandler);
2756
+ # else
2757
+ struct sigaction sa;
2758
+
2759
+ evpipe_init (EV_A);
2760
+
2761
+ sa.sa_handler = ev_sighandler;
2762
+ sigfillset (&sa.sa_mask);
2763
+ sa.sa_flags = SA_RESTART; /* if restarting works we save one iteration */
2764
+ sigaction (w->signum, &sa, 0);
2765
+
2766
+ sigemptyset (&sa.sa_mask);
2767
+ sigaddset (&sa.sa_mask, w->signum);
2768
+ sigprocmask (SIG_UNBLOCK, &sa.sa_mask, 0);
2769
+ #endif
2770
+ }
2771
+
2772
+ EV_FREQUENT_CHECK;
2773
+ }
2774
+
2775
+ void noinline
2776
+ ev_signal_stop (EV_P_ ev_signal *w)
2777
+ {
2778
+ clear_pending (EV_A_ (W)w);
2779
+ if (expect_false (!ev_is_active (w)))
2780
+ return;
2781
+
2782
+ EV_FREQUENT_CHECK;
2783
+
2784
+ wlist_del (&signals [w->signum - 1].head, (WL)w);
2785
+ ev_stop (EV_A_ (W)w);
2786
+
2787
+ if (!signals [w->signum - 1].head)
2788
+ {
2789
+ #if EV_MULTIPLICITY
2790
+ signals [w->signum - 1].loop = 0; /* unattach from signal */
2791
+ #endif
2792
+ #if EV_USE_SIGNALFD
2793
+ if (sigfd >= 0)
2794
+ {
2795
+ sigset_t ss;
2796
+
2797
+ sigemptyset (&ss);
2798
+ sigaddset (&ss, w->signum);
2799
+ sigdelset (&sigfd_set, w->signum);
2800
+
2801
+ signalfd (sigfd, &sigfd_set, 0);
2802
+ sigprocmask (SIG_UNBLOCK, &ss, 0);
2803
+ }
2804
+ else
2805
+ #endif
2806
+ signal (w->signum, SIG_DFL);
2807
+ }
2808
+
2809
+ EV_FREQUENT_CHECK;
2810
+ }
2811
+
2812
+ void
2813
+ ev_child_start (EV_P_ ev_child *w)
2814
+ {
2815
+ #if EV_MULTIPLICITY
2816
+ assert (("libev: child watchers are only supported in the default loop", loop == ev_default_loop_ptr));
2817
+ #endif
2818
+ if (expect_false (ev_is_active (w)))
2819
+ return;
2820
+
2821
+ EV_FREQUENT_CHECK;
2822
+
2823
+ ev_start (EV_A_ (W)w, 1);
2824
+ wlist_add (&childs [w->pid & (EV_PID_HASHSIZE - 1)], (WL)w);
2825
+
2826
+ EV_FREQUENT_CHECK;
2827
+ }
2828
+
2829
+ void
2830
+ ev_child_stop (EV_P_ ev_child *w)
2831
+ {
2832
+ clear_pending (EV_A_ (W)w);
2833
+ if (expect_false (!ev_is_active (w)))
2834
+ return;
2835
+
2836
+ EV_FREQUENT_CHECK;
2837
+
2838
+ wlist_del (&childs [w->pid & (EV_PID_HASHSIZE - 1)], (WL)w);
2839
+ ev_stop (EV_A_ (W)w);
2840
+
2841
+ EV_FREQUENT_CHECK;
2842
+ }
2843
+
2844
+ #if EV_STAT_ENABLE
2845
+
2846
+ # ifdef _WIN32
2847
+ # undef lstat
2848
+ # define lstat(a,b) _stati64 (a,b)
2849
+ # endif
2850
+
2851
+ #define DEF_STAT_INTERVAL 5.0074891
2852
+ #define NFS_STAT_INTERVAL 30.1074891 /* for filesystems potentially failing inotify */
2853
+ #define MIN_STAT_INTERVAL 0.1074891
2854
+
2855
+ static void noinline stat_timer_cb (EV_P_ ev_timer *w_, int revents);
2856
+
2857
+ #if EV_USE_INOTIFY
2858
+ # define EV_INOTIFY_BUFSIZE 8192
2859
+
2860
+ static void noinline
2861
+ infy_add (EV_P_ ev_stat *w)
2862
+ {
2863
+ w->wd = inotify_add_watch (fs_fd, w->path, IN_ATTRIB | IN_DELETE_SELF | IN_MOVE_SELF | IN_MODIFY | IN_DONT_FOLLOW | IN_MASK_ADD);
2864
+
2865
+ if (w->wd >= 0)
2866
+ {
2867
+ struct statfs sfs;
2868
+
2869
+ /* now local changes will be tracked by inotify, but remote changes won't */
2870
+ /* unless the filesystem is known to be local, we therefore still poll */
2871
+ /* also do poll on <2.6.25, but with normal frequency */
2872
+
2873
+ if (!fs_2625)
2874
+ w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL;
2875
+ else if (!statfs (w->path, &sfs)
2876
+ && (sfs.f_type == 0x1373 /* devfs */
2877
+ || sfs.f_type == 0xEF53 /* ext2/3 */
2878
+ || sfs.f_type == 0x3153464a /* jfs */
2879
+ || sfs.f_type == 0x52654973 /* reiser3 */
2880
+ || sfs.f_type == 0x01021994 /* tempfs */
2881
+ || sfs.f_type == 0x58465342 /* xfs */))
2882
+ w->timer.repeat = 0.; /* filesystem is local, kernel new enough */
2883
+ else
2884
+ w->timer.repeat = w->interval ? w->interval : NFS_STAT_INTERVAL; /* remote, use reduced frequency */
2885
+ }
2886
+ else
2887
+ {
2888
+ /* can't use inotify, continue to stat */
2889
+ w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL;
2890
+
2891
+ /* if path is not there, monitor some parent directory for speedup hints */
2892
+ /* note that exceeding the hardcoded path limit is not a correctness issue, */
2893
+ /* but an efficiency issue only */
2894
+ if ((errno == ENOENT || errno == EACCES) && strlen (w->path) < 4096)
2895
+ {
2896
+ char path [4096];
2897
+ strcpy (path, w->path);
2898
+
2899
+ do
2900
+ {
2901
+ int mask = IN_MASK_ADD | IN_DELETE_SELF | IN_MOVE_SELF
2902
+ | (errno == EACCES ? IN_ATTRIB : IN_CREATE | IN_MOVED_TO);
2903
+
2904
+ char *pend = strrchr (path, '/');
2905
+
2906
+ if (!pend || pend == path)
2907
+ break;
2908
+
2909
+ *pend = 0;
2910
+ w->wd = inotify_add_watch (fs_fd, path, mask);
2911
+ }
2912
+ while (w->wd < 0 && (errno == ENOENT || errno == EACCES));
2913
+ }
2914
+ }
2915
+
2916
+ if (w->wd >= 0)
2917
+ wlist_add (&fs_hash [w->wd & (EV_INOTIFY_HASHSIZE - 1)].head, (WL)w);
2918
+
2919
+ /* now re-arm timer, if required */
2920
+ if (ev_is_active (&w->timer)) ev_ref (EV_A);
2921
+ ev_timer_again (EV_A_ &w->timer);
2922
+ if (ev_is_active (&w->timer)) ev_unref (EV_A);
2923
+ }
2924
+
2925
+ static void noinline
2926
+ infy_del (EV_P_ ev_stat *w)
2927
+ {
2928
+ int slot;
2929
+ int wd = w->wd;
2930
+
2931
+ if (wd < 0)
2932
+ return;
2933
+
2934
+ w->wd = -2;
2935
+ slot = wd & (EV_INOTIFY_HASHSIZE - 1);
2936
+ wlist_del (&fs_hash [slot].head, (WL)w);
2937
+
2938
+ /* remove this watcher, if others are watching it, they will rearm */
2939
+ inotify_rm_watch (fs_fd, wd);
2940
+ }
2941
+
2942
+ static void noinline
2943
+ infy_wd (EV_P_ int slot, int wd, struct inotify_event *ev)
2944
+ {
2945
+ if (slot < 0)
2946
+ /* overflow, need to check for all hash slots */
2947
+ for (slot = 0; slot < EV_INOTIFY_HASHSIZE; ++slot)
2948
+ infy_wd (EV_A_ slot, wd, ev);
2949
+ else
2950
+ {
2951
+ WL w_;
2952
+
2953
+ for (w_ = fs_hash [slot & (EV_INOTIFY_HASHSIZE - 1)].head; w_; )
2954
+ {
2955
+ ev_stat *w = (ev_stat *)w_;
2956
+ w_ = w_->next; /* lets us remove this watcher and all before it */
2957
+
2958
+ if (w->wd == wd || wd == -1)
2959
+ {
2960
+ if (ev->mask & (IN_IGNORED | IN_UNMOUNT | IN_DELETE_SELF))
2961
+ {
2962
+ wlist_del (&fs_hash [slot & (EV_INOTIFY_HASHSIZE - 1)].head, (WL)w);
2963
+ w->wd = -1;
2964
+ infy_add (EV_A_ w); /* re-add, no matter what */
2965
+ }
2966
+
2967
+ stat_timer_cb (EV_A_ &w->timer, 0);
2968
+ }
2969
+ }
2970
+ }
2971
+ }
2972
+
2973
+ static void
2974
+ infy_cb (EV_P_ ev_io *w, int revents)
2975
+ {
2976
+ char buf [EV_INOTIFY_BUFSIZE];
2977
+ struct inotify_event *ev = (struct inotify_event *)buf;
2978
+ int ofs;
2979
+ int len = read (fs_fd, buf, sizeof (buf));
2980
+
2981
+ for (ofs = 0; ofs < len; ofs += sizeof (struct inotify_event) + ev->len)
2982
+ infy_wd (EV_A_ ev->wd, ev->wd, ev);
2983
+ }
2984
+
2985
+ inline_size void
2986
+ check_2625 (EV_P)
2987
+ {
2988
+ /* kernels < 2.6.25 are borked
2989
+ * http://www.ussg.indiana.edu/hypermail/linux/kernel/0711.3/1208.html
2990
+ */
2991
+ struct utsname buf;
2992
+ int major, minor, micro;
2993
+
2994
+ if (uname (&buf))
2995
+ return;
2996
+
2997
+ if (sscanf (buf.release, "%d.%d.%d", &major, &minor, &micro) != 3)
2998
+ return;
2999
+
3000
+ if (major < 2
3001
+ || (major == 2 && minor < 6)
3002
+ || (major == 2 && minor == 6 && micro < 25))
3003
+ return;
3004
+
3005
+ fs_2625 = 1;
3006
+ }
3007
+
3008
+ inline_size int
3009
+ infy_newfd (void)
3010
+ {
3011
+ #if defined (IN_CLOEXEC) && defined (IN_NONBLOCK)
3012
+ int fd = inotify_init1 (IN_CLOEXEC | IN_NONBLOCK);
3013
+ if (fd >= 0)
3014
+ return fd;
3015
+ #endif
3016
+ return inotify_init ();
3017
+ }
3018
+
3019
+ inline_size void
3020
+ infy_init (EV_P)
3021
+ {
3022
+ if (fs_fd != -2)
3023
+ return;
3024
+
3025
+ fs_fd = -1;
3026
+
3027
+ check_2625 (EV_A);
3028
+
3029
+ fs_fd = infy_newfd ();
3030
+
3031
+ if (fs_fd >= 0)
3032
+ {
3033
+ fd_intern (fs_fd);
3034
+ ev_io_init (&fs_w, infy_cb, fs_fd, EV_READ);
3035
+ ev_set_priority (&fs_w, EV_MAXPRI);
3036
+ ev_io_start (EV_A_ &fs_w);
3037
+ ev_unref (EV_A);
3038
+ }
3039
+ }
3040
+
3041
+ inline_size void
3042
+ infy_fork (EV_P)
3043
+ {
3044
+ int slot;
3045
+
3046
+ if (fs_fd < 0)
3047
+ return;
3048
+
3049
+ ev_ref (EV_A);
3050
+ ev_io_stop (EV_A_ &fs_w);
3051
+ close (fs_fd);
3052
+ fs_fd = infy_newfd ();
3053
+
3054
+ if (fs_fd >= 0)
3055
+ {
3056
+ fd_intern (fs_fd);
3057
+ ev_io_set (&fs_w, fs_fd, EV_READ);
3058
+ ev_io_start (EV_A_ &fs_w);
3059
+ ev_unref (EV_A);
3060
+ }
3061
+
3062
+ for (slot = 0; slot < EV_INOTIFY_HASHSIZE; ++slot)
3063
+ {
3064
+ WL w_ = fs_hash [slot].head;
3065
+ fs_hash [slot].head = 0;
3066
+
3067
+ while (w_)
3068
+ {
3069
+ ev_stat *w = (ev_stat *)w_;
3070
+ w_ = w_->next; /* lets us add this watcher */
3071
+
3072
+ w->wd = -1;
3073
+
3074
+ if (fs_fd >= 0)
3075
+ infy_add (EV_A_ w); /* re-add, no matter what */
3076
+ else
3077
+ {
3078
+ w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL;
3079
+ if (ev_is_active (&w->timer)) ev_ref (EV_A);
3080
+ ev_timer_again (EV_A_ &w->timer);
3081
+ if (ev_is_active (&w->timer)) ev_unref (EV_A);
3082
+ }
3083
+ }
3084
+ }
3085
+ }
3086
+
3087
+ #endif
3088
+
3089
+ #ifdef _WIN32
3090
+ # define EV_LSTAT(p,b) _stati64 (p, b)
3091
+ #else
3092
+ # define EV_LSTAT(p,b) lstat (p, b)
3093
+ #endif
3094
+
3095
+ void
3096
+ ev_stat_stat (EV_P_ ev_stat *w)
3097
+ {
3098
+ if (lstat (w->path, &w->attr) < 0)
3099
+ w->attr.st_nlink = 0;
3100
+ else if (!w->attr.st_nlink)
3101
+ w->attr.st_nlink = 1;
3102
+ }
3103
+
3104
+ static void noinline
3105
+ stat_timer_cb (EV_P_ ev_timer *w_, int revents)
3106
+ {
3107
+ ev_stat *w = (ev_stat *)(((char *)w_) - offsetof (ev_stat, timer));
3108
+
3109
+ ev_statdata prev = w->attr;
3110
+ ev_stat_stat (EV_A_ w);
3111
+
3112
+ /* memcmp doesn't work on netbsd, they.... do stuff to their struct stat */
3113
+ if (
3114
+ prev.st_dev != w->attr.st_dev
3115
+ || prev.st_ino != w->attr.st_ino
3116
+ || prev.st_mode != w->attr.st_mode
3117
+ || prev.st_nlink != w->attr.st_nlink
3118
+ || prev.st_uid != w->attr.st_uid
3119
+ || prev.st_gid != w->attr.st_gid
3120
+ || prev.st_rdev != w->attr.st_rdev
3121
+ || prev.st_size != w->attr.st_size
3122
+ || prev.st_atime != w->attr.st_atime
3123
+ || prev.st_mtime != w->attr.st_mtime
3124
+ || prev.st_ctime != w->attr.st_ctime
3125
+ ) {
3126
+ /* we only update w->prev on actual differences */
3127
+ /* in case we test more often than invoke the callback, */
3128
+ /* to ensure that prev is always different to attr */
3129
+ w->prev = prev;
3130
+
3131
+ #if EV_USE_INOTIFY
3132
+ if (fs_fd >= 0)
3133
+ {
3134
+ infy_del (EV_A_ w);
3135
+ infy_add (EV_A_ w);
3136
+ ev_stat_stat (EV_A_ w); /* avoid race... */
3137
+ }
3138
+ #endif
3139
+
3140
+ ev_feed_event (EV_A_ w, EV_STAT);
3141
+ }
3142
+ }
3143
+
3144
+ void
3145
+ ev_stat_start (EV_P_ ev_stat *w)
3146
+ {
3147
+ if (expect_false (ev_is_active (w)))
3148
+ return;
3149
+
3150
+ ev_stat_stat (EV_A_ w);
3151
+
3152
+ if (w->interval < MIN_STAT_INTERVAL && w->interval)
3153
+ w->interval = MIN_STAT_INTERVAL;
3154
+
3155
+ ev_timer_init (&w->timer, stat_timer_cb, 0., w->interval ? w->interval : DEF_STAT_INTERVAL);
3156
+ ev_set_priority (&w->timer, ev_priority (w));
3157
+
3158
+ #if EV_USE_INOTIFY
3159
+ infy_init (EV_A);
3160
+
3161
+ if (fs_fd >= 0)
3162
+ infy_add (EV_A_ w);
3163
+ else
3164
+ #endif
3165
+ {
3166
+ ev_timer_again (EV_A_ &w->timer);
3167
+ ev_unref (EV_A);
3168
+ }
3169
+
3170
+ ev_start (EV_A_ (W)w, 1);
3171
+
3172
+ EV_FREQUENT_CHECK;
3173
+ }
3174
+
3175
+ void
3176
+ ev_stat_stop (EV_P_ ev_stat *w)
3177
+ {
3178
+ clear_pending (EV_A_ (W)w);
3179
+ if (expect_false (!ev_is_active (w)))
3180
+ return;
3181
+
3182
+ EV_FREQUENT_CHECK;
3183
+
3184
+ #if EV_USE_INOTIFY
3185
+ infy_del (EV_A_ w);
3186
+ #endif
3187
+
3188
+ if (ev_is_active (&w->timer))
3189
+ {
3190
+ ev_ref (EV_A);
3191
+ ev_timer_stop (EV_A_ &w->timer);
3192
+ }
3193
+
3194
+ ev_stop (EV_A_ (W)w);
3195
+
3196
+ EV_FREQUENT_CHECK;
3197
+ }
3198
+ #endif
3199
+
3200
+ #if EV_IDLE_ENABLE
3201
+ void
3202
+ ev_idle_start (EV_P_ ev_idle *w)
3203
+ {
3204
+ if (expect_false (ev_is_active (w)))
3205
+ return;
3206
+
3207
+ pri_adjust (EV_A_ (W)w);
3208
+
3209
+ EV_FREQUENT_CHECK;
3210
+
3211
+ {
3212
+ int active = ++idlecnt [ABSPRI (w)];
3213
+
3214
+ ++idleall;
3215
+ ev_start (EV_A_ (W)w, active);
3216
+
3217
+ array_needsize (ev_idle *, idles [ABSPRI (w)], idlemax [ABSPRI (w)], active, EMPTY2);
3218
+ idles [ABSPRI (w)][active - 1] = w;
3219
+ }
3220
+
3221
+ EV_FREQUENT_CHECK;
3222
+ }
3223
+
3224
+ void
3225
+ ev_idle_stop (EV_P_ ev_idle *w)
3226
+ {
3227
+ clear_pending (EV_A_ (W)w);
3228
+ if (expect_false (!ev_is_active (w)))
3229
+ return;
3230
+
3231
+ EV_FREQUENT_CHECK;
3232
+
3233
+ {
3234
+ int active = ev_active (w);
3235
+
3236
+ idles [ABSPRI (w)][active - 1] = idles [ABSPRI (w)][--idlecnt [ABSPRI (w)]];
3237
+ ev_active (idles [ABSPRI (w)][active - 1]) = active;
3238
+
3239
+ ev_stop (EV_A_ (W)w);
3240
+ --idleall;
3241
+ }
3242
+
3243
+ EV_FREQUENT_CHECK;
3244
+ }
3245
+ #endif
3246
+
3247
+ void
3248
+ ev_prepare_start (EV_P_ ev_prepare *w)
3249
+ {
3250
+ if (expect_false (ev_is_active (w)))
3251
+ return;
3252
+
3253
+ EV_FREQUENT_CHECK;
3254
+
3255
+ ev_start (EV_A_ (W)w, ++preparecnt);
3256
+ array_needsize (ev_prepare *, prepares, preparemax, preparecnt, EMPTY2);
3257
+ prepares [preparecnt - 1] = w;
3258
+
3259
+ EV_FREQUENT_CHECK;
3260
+ }
3261
+
3262
+ void
3263
+ ev_prepare_stop (EV_P_ ev_prepare *w)
3264
+ {
3265
+ clear_pending (EV_A_ (W)w);
3266
+ if (expect_false (!ev_is_active (w)))
3267
+ return;
3268
+
3269
+ EV_FREQUENT_CHECK;
3270
+
3271
+ {
3272
+ int active = ev_active (w);
3273
+
3274
+ prepares [active - 1] = prepares [--preparecnt];
3275
+ ev_active (prepares [active - 1]) = active;
3276
+ }
3277
+
3278
+ ev_stop (EV_A_ (W)w);
3279
+
3280
+ EV_FREQUENT_CHECK;
3281
+ }
3282
+
3283
+ void
3284
+ ev_check_start (EV_P_ ev_check *w)
3285
+ {
3286
+ if (expect_false (ev_is_active (w)))
3287
+ return;
3288
+
3289
+ EV_FREQUENT_CHECK;
3290
+
3291
+ ev_start (EV_A_ (W)w, ++checkcnt);
3292
+ array_needsize (ev_check *, checks, checkmax, checkcnt, EMPTY2);
3293
+ checks [checkcnt - 1] = w;
3294
+
3295
+ EV_FREQUENT_CHECK;
3296
+ }
3297
+
3298
+ void
3299
+ ev_check_stop (EV_P_ ev_check *w)
3300
+ {
3301
+ clear_pending (EV_A_ (W)w);
3302
+ if (expect_false (!ev_is_active (w)))
3303
+ return;
3304
+
3305
+ EV_FREQUENT_CHECK;
3306
+
3307
+ {
3308
+ int active = ev_active (w);
3309
+
3310
+ checks [active - 1] = checks [--checkcnt];
3311
+ ev_active (checks [active - 1]) = active;
3312
+ }
3313
+
3314
+ ev_stop (EV_A_ (W)w);
3315
+
3316
+ EV_FREQUENT_CHECK;
3317
+ }
3318
+
3319
+ #if EV_EMBED_ENABLE
3320
+ void noinline
3321
+ ev_embed_sweep (EV_P_ ev_embed *w)
3322
+ {
3323
+ ev_loop (w->other, EVLOOP_NONBLOCK);
3324
+ }
3325
+
3326
+ static void
3327
+ embed_io_cb (EV_P_ ev_io *io, int revents)
3328
+ {
3329
+ ev_embed *w = (ev_embed *)(((char *)io) - offsetof (ev_embed, io));
3330
+
3331
+ if (ev_cb (w))
3332
+ ev_feed_event (EV_A_ (W)w, EV_EMBED);
3333
+ else
3334
+ ev_loop (w->other, EVLOOP_NONBLOCK);
3335
+ }
3336
+
3337
+ static void
3338
+ embed_prepare_cb (EV_P_ ev_prepare *prepare, int revents)
3339
+ {
3340
+ ev_embed *w = (ev_embed *)(((char *)prepare) - offsetof (ev_embed, prepare));
3341
+
3342
+ {
3343
+ EV_P = w->other;
3344
+
3345
+ while (fdchangecnt)
3346
+ {
3347
+ fd_reify (EV_A);
3348
+ ev_loop (EV_A_ EVLOOP_NONBLOCK);
3349
+ }
3350
+ }
3351
+ }
3352
+
3353
+ static void
3354
+ embed_fork_cb (EV_P_ ev_fork *fork_w, int revents)
3355
+ {
3356
+ ev_embed *w = (ev_embed *)(((char *)fork_w) - offsetof (ev_embed, fork));
3357
+
3358
+ ev_embed_stop (EV_A_ w);
3359
+
3360
+ {
3361
+ EV_P = w->other;
3362
+
3363
+ ev_loop_fork (EV_A);
3364
+ ev_loop (EV_A_ EVLOOP_NONBLOCK);
3365
+ }
3366
+
3367
+ ev_embed_start (EV_A_ w);
3368
+ }
3369
+
3370
+ #if 0
3371
+ static void
3372
+ embed_idle_cb (EV_P_ ev_idle *idle, int revents)
3373
+ {
3374
+ ev_idle_stop (EV_A_ idle);
3375
+ }
3376
+ #endif
3377
+
3378
+ void
3379
+ ev_embed_start (EV_P_ ev_embed *w)
3380
+ {
3381
+ if (expect_false (ev_is_active (w)))
3382
+ return;
3383
+
3384
+ {
3385
+ EV_P = w->other;
3386
+ assert (("libev: loop to be embedded is not embeddable", backend & ev_embeddable_backends ()));
3387
+ ev_io_init (&w->io, embed_io_cb, backend_fd, EV_READ);
3388
+ }
3389
+
3390
+ EV_FREQUENT_CHECK;
3391
+
3392
+ ev_set_priority (&w->io, ev_priority (w));
3393
+ ev_io_start (EV_A_ &w->io);
3394
+
3395
+ ev_prepare_init (&w->prepare, embed_prepare_cb);
3396
+ ev_set_priority (&w->prepare, EV_MINPRI);
3397
+ ev_prepare_start (EV_A_ &w->prepare);
3398
+
3399
+ ev_fork_init (&w->fork, embed_fork_cb);
3400
+ ev_fork_start (EV_A_ &w->fork);
3401
+
3402
+ /*ev_idle_init (&w->idle, e,bed_idle_cb);*/
3403
+
3404
+ ev_start (EV_A_ (W)w, 1);
3405
+
3406
+ EV_FREQUENT_CHECK;
3407
+ }
3408
+
3409
+ void
3410
+ ev_embed_stop (EV_P_ ev_embed *w)
3411
+ {
3412
+ clear_pending (EV_A_ (W)w);
3413
+ if (expect_false (!ev_is_active (w)))
3414
+ return;
3415
+
3416
+ EV_FREQUENT_CHECK;
3417
+
3418
+ ev_io_stop (EV_A_ &w->io);
3419
+ ev_prepare_stop (EV_A_ &w->prepare);
3420
+ ev_fork_stop (EV_A_ &w->fork);
3421
+
3422
+ EV_FREQUENT_CHECK;
3423
+ }
3424
+ #endif
3425
+
3426
+ #if EV_FORK_ENABLE
3427
+ void
3428
+ ev_fork_start (EV_P_ ev_fork *w)
3429
+ {
3430
+ if (expect_false (ev_is_active (w)))
3431
+ return;
3432
+
3433
+ EV_FREQUENT_CHECK;
3434
+
3435
+ ev_start (EV_A_ (W)w, ++forkcnt);
3436
+ array_needsize (ev_fork *, forks, forkmax, forkcnt, EMPTY2);
3437
+ forks [forkcnt - 1] = w;
3438
+
3439
+ EV_FREQUENT_CHECK;
3440
+ }
3441
+
3442
+ void
3443
+ ev_fork_stop (EV_P_ ev_fork *w)
3444
+ {
3445
+ clear_pending (EV_A_ (W)w);
3446
+ if (expect_false (!ev_is_active (w)))
3447
+ return;
3448
+
3449
+ EV_FREQUENT_CHECK;
3450
+
3451
+ {
3452
+ int active = ev_active (w);
3453
+
3454
+ forks [active - 1] = forks [--forkcnt];
3455
+ ev_active (forks [active - 1]) = active;
3456
+ }
3457
+
3458
+ ev_stop (EV_A_ (W)w);
3459
+
3460
+ EV_FREQUENT_CHECK;
3461
+ }
3462
+ #endif
3463
+
3464
+ #if EV_ASYNC_ENABLE
3465
+ void
3466
+ ev_async_start (EV_P_ ev_async *w)
3467
+ {
3468
+ if (expect_false (ev_is_active (w)))
3469
+ return;
3470
+
3471
+ evpipe_init (EV_A);
3472
+
3473
+ EV_FREQUENT_CHECK;
3474
+
3475
+ ev_start (EV_A_ (W)w, ++asynccnt);
3476
+ array_needsize (ev_async *, asyncs, asyncmax, asynccnt, EMPTY2);
3477
+ asyncs [asynccnt - 1] = w;
3478
+
3479
+ EV_FREQUENT_CHECK;
3480
+ }
3481
+
3482
+ void
3483
+ ev_async_stop (EV_P_ ev_async *w)
3484
+ {
3485
+ clear_pending (EV_A_ (W)w);
3486
+ if (expect_false (!ev_is_active (w)))
3487
+ return;
3488
+
3489
+ EV_FREQUENT_CHECK;
3490
+
3491
+ {
3492
+ int active = ev_active (w);
3493
+
3494
+ asyncs [active - 1] = asyncs [--asynccnt];
3495
+ ev_active (asyncs [active - 1]) = active;
3496
+ }
3497
+
3498
+ ev_stop (EV_A_ (W)w);
3499
+
3500
+ EV_FREQUENT_CHECK;
3501
+ }
3502
+
3503
+ void
3504
+ ev_async_send (EV_P_ ev_async *w)
3505
+ {
3506
+ w->sent = 1;
3507
+ evpipe_write (EV_A_ &async_pending);
3508
+ }
3509
+ #endif
3510
+
3511
+ /*****************************************************************************/
3512
+
3513
+ struct ev_once
3514
+ {
3515
+ ev_io io;
3516
+ ev_timer to;
3517
+ void (*cb)(int revents, void *arg);
3518
+ void *arg;
3519
+ };
3520
+
3521
+ static void
3522
+ once_cb (EV_P_ struct ev_once *once, int revents)
3523
+ {
3524
+ void (*cb)(int revents, void *arg) = once->cb;
3525
+ void *arg = once->arg;
3526
+
3527
+ ev_io_stop (EV_A_ &once->io);
3528
+ ev_timer_stop (EV_A_ &once->to);
3529
+ ev_free (once);
3530
+
3531
+ cb (revents, arg);
3532
+ }
3533
+
3534
+ static void
3535
+ once_cb_io (EV_P_ ev_io *w, int revents)
3536
+ {
3537
+ struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, io));
3538
+
3539
+ once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->to));
3540
+ }
3541
+
3542
+ static void
3543
+ once_cb_to (EV_P_ ev_timer *w, int revents)
3544
+ {
3545
+ struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, to));
3546
+
3547
+ once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->io));
3548
+ }
3549
+
3550
+ void
3551
+ ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg)
3552
+ {
3553
+ struct ev_once *once = (struct ev_once *)ev_malloc (sizeof (struct ev_once));
3554
+
3555
+ if (expect_false (!once))
3556
+ {
3557
+ cb (EV_ERROR | EV_READ | EV_WRITE | EV_TIMEOUT, arg);
3558
+ return;
3559
+ }
3560
+
3561
+ once->cb = cb;
3562
+ once->arg = arg;
3563
+
3564
+ ev_init (&once->io, once_cb_io);
3565
+ if (fd >= 0)
3566
+ {
3567
+ ev_io_set (&once->io, fd, events);
3568
+ ev_io_start (EV_A_ &once->io);
3569
+ }
3570
+
3571
+ ev_init (&once->to, once_cb_to);
3572
+ if (timeout >= 0.)
3573
+ {
3574
+ ev_timer_set (&once->to, timeout, 0.);
3575
+ ev_timer_start (EV_A_ &once->to);
3576
+ }
3577
+ }
3578
+
3579
+ /*****************************************************************************/
3580
+
3581
+ #if EV_WALK_ENABLE
3582
+ void
3583
+ ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w))
3584
+ {
3585
+ int i, j;
3586
+ ev_watcher_list *wl, *wn;
3587
+
3588
+ if (types & (EV_IO | EV_EMBED))
3589
+ for (i = 0; i < anfdmax; ++i)
3590
+ for (wl = anfds [i].head; wl; )
3591
+ {
3592
+ wn = wl->next;
3593
+
3594
+ #if EV_EMBED_ENABLE
3595
+ if (ev_cb ((ev_io *)wl) == embed_io_cb)
3596
+ {
3597
+ if (types & EV_EMBED)
3598
+ cb (EV_A_ EV_EMBED, ((char *)wl) - offsetof (struct ev_embed, io));
3599
+ }
3600
+ else
3601
+ #endif
3602
+ #if EV_USE_INOTIFY
3603
+ if (ev_cb ((ev_io *)wl) == infy_cb)
3604
+ ;
3605
+ else
3606
+ #endif
3607
+ if ((ev_io *)wl != &pipe_w)
3608
+ if (types & EV_IO)
3609
+ cb (EV_A_ EV_IO, wl);
3610
+
3611
+ wl = wn;
3612
+ }
3613
+
3614
+ if (types & (EV_TIMER | EV_STAT))
3615
+ for (i = timercnt + HEAP0; i-- > HEAP0; )
3616
+ #if EV_STAT_ENABLE
3617
+ /*TODO: timer is not always active*/
3618
+ if (ev_cb ((ev_timer *)ANHE_w (timers [i])) == stat_timer_cb)
3619
+ {
3620
+ if (types & EV_STAT)
3621
+ cb (EV_A_ EV_STAT, ((char *)ANHE_w (timers [i])) - offsetof (struct ev_stat, timer));
3622
+ }
3623
+ else
3624
+ #endif
3625
+ if (types & EV_TIMER)
3626
+ cb (EV_A_ EV_TIMER, ANHE_w (timers [i]));
3627
+
3628
+ #if EV_PERIODIC_ENABLE
3629
+ if (types & EV_PERIODIC)
3630
+ for (i = periodiccnt + HEAP0; i-- > HEAP0; )
3631
+ cb (EV_A_ EV_PERIODIC, ANHE_w (periodics [i]));
3632
+ #endif
3633
+
3634
+ #if EV_IDLE_ENABLE
3635
+ if (types & EV_IDLE)
3636
+ for (j = NUMPRI; i--; )
3637
+ for (i = idlecnt [j]; i--; )
3638
+ cb (EV_A_ EV_IDLE, idles [j][i]);
3639
+ #endif
3640
+
3641
+ #if EV_FORK_ENABLE
3642
+ if (types & EV_FORK)
3643
+ for (i = forkcnt; i--; )
3644
+ if (ev_cb (forks [i]) != embed_fork_cb)
3645
+ cb (EV_A_ EV_FORK, forks [i]);
3646
+ #endif
3647
+
3648
+ #if EV_ASYNC_ENABLE
3649
+ if (types & EV_ASYNC)
3650
+ for (i = asynccnt; i--; )
3651
+ cb (EV_A_ EV_ASYNC, asyncs [i]);
3652
+ #endif
3653
+
3654
+ if (types & EV_PREPARE)
3655
+ for (i = preparecnt; i--; )
3656
+ #if EV_EMBED_ENABLE
3657
+ if (ev_cb (prepares [i]) != embed_prepare_cb)
3658
+ #endif
3659
+ cb (EV_A_ EV_PREPARE, prepares [i]);
3660
+
3661
+ if (types & EV_CHECK)
3662
+ for (i = checkcnt; i--; )
3663
+ cb (EV_A_ EV_CHECK, checks [i]);
3664
+
3665
+ if (types & EV_SIGNAL)
3666
+ for (i = 0; i < EV_NSIG - 1; ++i)
3667
+ for (wl = signals [i].head; wl; )
3668
+ {
3669
+ wn = wl->next;
3670
+ cb (EV_A_ EV_SIGNAL, wl);
3671
+ wl = wn;
3672
+ }
3673
+
3674
+ if (types & EV_CHILD)
3675
+ for (i = EV_PID_HASHSIZE; i--; )
3676
+ for (wl = childs [i]; wl; )
3677
+ {
3678
+ wn = wl->next;
3679
+ cb (EV_A_ EV_CHILD, wl);
3680
+ wl = wn;
3681
+ }
3682
+ /* EV_STAT 0x00001000 /* stat data changed */
3683
+ /* EV_EMBED 0x00010000 /* embedded event loop needs sweep */
3684
+ }
3685
+ #endif
3686
+
3687
+ #if EV_MULTIPLICITY
3688
+ #include "ev_wrap.h"
3689
+ #endif
3690
+
3691
+ #ifdef __cplusplus
3692
+ }
3693
+ #endif
3694
+