webroar 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1988) hide show
  1. data/COPYING +675 -0
  2. data/Rakefile +27 -0
  3. data/bin/webroar +38 -0
  4. data/bin/webroar-analyzer +23 -0
  5. data/conf/server_internal_config.yml +16 -0
  6. data/conf/starling_server_config.yml +13 -0
  7. data/conf/test_suite_config.yml +12 -0
  8. data/doc/images/icons/caution.png +0 -0
  9. data/doc/images/icons/example.png +0 -0
  10. data/doc/images/icons/important.png +0 -0
  11. data/doc/images/icons/note.png +0 -0
  12. data/doc/images/icons/tip.png +0 -0
  13. data/doc/images/icons/warning.png +0 -0
  14. data/doc/user-guide.html +912 -0
  15. data/doc/user-guide.txt +323 -0
  16. data/lib/command_runner.rb +241 -0
  17. data/lib/constant.rb +49 -0
  18. data/lib/dependencies.rb +177 -0
  19. data/lib/installer.rb +658 -0
  20. data/lib/webroar_command.rb +357 -0
  21. data/src/admin_panel/Rakefile +10 -0
  22. data/src/admin_panel/app/controllers/admin_controller.rb +197 -0
  23. data/src/admin_panel/app/controllers/application_controller.rb +137 -0
  24. data/src/admin_panel/app/controllers/application_specification_controller.rb +117 -0
  25. data/src/admin_panel/app/controllers/exceptions_controller.rb +179 -0
  26. data/src/admin_panel/app/controllers/graph_controller.rb +504 -0
  27. data/src/admin_panel/app/controllers/mail_specification_controller.rb +169 -0
  28. data/src/admin_panel/app/controllers/server_specification_controller.rb +106 -0
  29. data/src/admin_panel/app/helpers/admin_helper.rb +270 -0
  30. data/src/admin_panel/app/helpers/application_helper.rb +87 -0
  31. data/src/admin_panel/app/helpers/exceptions_helper.rb +22 -0
  32. data/src/admin_panel/app/helpers/graph_helper.rb +39 -0
  33. data/src/admin_panel/app/models/app.rb +34 -0
  34. data/src/admin_panel/app/models/app_exception.rb +72 -0
  35. data/src/admin_panel/app/models/app_time_sample.rb +212 -0
  36. data/src/admin_panel/app/models/application_specification.rb +315 -0
  37. data/src/admin_panel/app/models/pseudo_model.rb +32 -0
  38. data/src/admin_panel/app/models/resource_usage.rb +179 -0
  39. data/src/admin_panel/app/models/server_specification.rb +145 -0
  40. data/src/admin_panel/app/models/url_breakup_time_sample.rb +40 -0
  41. data/src/admin_panel/app/models/url_time_sample.rb +339 -0
  42. data/src/admin_panel/app/models/user.rb +48 -0
  43. data/src/admin_panel/app/views/admin/_add_div.html.erb +42 -0
  44. data/src/admin_panel/app/views/admin/_application_table.html.erb +68 -0
  45. data/src/admin_panel/app/views/admin/change_password_form.html.erb +53 -0
  46. data/src/admin_panel/app/views/admin/configuration.html.erb +89 -0
  47. data/src/admin_panel/app/views/admin/home.html.erb +77 -0
  48. data/src/admin_panel/app/views/admin/index.html.erb +47 -0
  49. data/src/admin_panel/app/views/application_specification/_application_form.html.erb +124 -0
  50. data/src/admin_panel/app/views/application_specification/add_application_form.html.erb +29 -0
  51. data/src/admin_panel/app/views/application_specification/edit_application_form.html.erb +28 -0
  52. data/src/admin_panel/app/views/exceptions/_close_exception_list_partial.html.erb +57 -0
  53. data/src/admin_panel/app/views/exceptions/_exception_list_partial.html.erb +64 -0
  54. data/src/admin_panel/app/views/exceptions/_exceptions_listing_partial.html.erb +31 -0
  55. data/src/admin_panel/app/views/exceptions/_ignored_exception_list_partial.html.erb +57 -0
  56. data/src/admin_panel/app/views/exceptions/_link_partial.html.erb +25 -0
  57. data/src/admin_panel/app/views/exceptions/_show.html.erb +173 -0
  58. data/src/admin_panel/app/views/exceptions/index.html.erb +37 -0
  59. data/src/admin_panel/app/views/graph/_database_usage_graph.html.erb +23 -0
  60. data/src/admin_panel/app/views/graph/_get_database_data.html.erb +30 -0
  61. data/src/admin_panel/app/views/graph/_get_resource_usage_data_app.html.erb +37 -0
  62. data/src/admin_panel/app/views/graph/_get_resource_usage_data_server.html.erb +42 -0
  63. data/src/admin_panel/app/views/graph/_get_throughput_data.html.erb +39 -0
  64. data/src/admin_panel/app/views/graph/_get_url_breakup_data.html.erb +34 -0
  65. data/src/admin_panel/app/views/graph/_get_url_data.html.erb +62 -0
  66. data/src/admin_panel/app/views/graph/_graph_page.html.erb +50 -0
  67. data/src/admin_panel/app/views/graph/_javascript_partial.html.erb +15 -0
  68. data/src/admin_panel/app/views/graph/_pie.html.erb +88 -0
  69. data/src/admin_panel/app/views/graph/_query_date.html.erb +38 -0
  70. data/src/admin_panel/app/views/graph/_query_period.html.erb +40 -0
  71. data/src/admin_panel/app/views/graph/_resource_usage_graph_app.html.erb +23 -0
  72. data/src/admin_panel/app/views/graph/_resource_usage_graph_server.html.erb +23 -0
  73. data/src/admin_panel/app/views/graph/_slider_partial.html.erb +6 -0
  74. data/src/admin_panel/app/views/graph/_throughput_graph.html.erb +23 -0
  75. data/src/admin_panel/app/views/graph/_url_breakup_graph.html.erb +24 -0
  76. data/src/admin_panel/app/views/graph/_url_calls_graph.html.erb +23 -0
  77. data/src/admin_panel/app/views/graph/index.html.erb +42 -0
  78. data/src/admin_panel/app/views/layouts/application.html.erb +174 -0
  79. data/src/admin_panel/app/views/layouts/index.html.erb +57 -0
  80. data/src/admin_panel/app/views/mail_specification/_sendmail_form.html.erb +62 -0
  81. data/src/admin_panel/app/views/mail_specification/_smtp_form.html.erb +95 -0
  82. data/src/admin_panel/app/views/server_specification/_ssl_support_form.html.erb +59 -0
  83. data/src/admin_panel/config/boot.rb +110 -0
  84. data/src/admin_panel/config/database.yml +23 -0
  85. data/src/admin_panel/config/environment.rb +69 -0
  86. data/src/admin_panel/config/environments/development.rb +18 -0
  87. data/src/admin_panel/config/environments/production.rb +24 -0
  88. data/src/admin_panel/config/environments/test.rb +24 -0
  89. data/src/admin_panel/config/initializers/application_constants.rb +137 -0
  90. data/src/admin_panel/config/initializers/inflections.rb +10 -0
  91. data/src/admin_panel/config/initializers/mime_types.rb +5 -0
  92. data/src/admin_panel/config/initializers/new_rails_defaults.rb +17 -0
  93. data/src/admin_panel/config/initializers/ssl.rb +46 -0
  94. data/src/admin_panel/config/routes.rb +57 -0
  95. data/src/admin_panel/db/migrate/20081020052652_create_apps.rb +32 -0
  96. data/src/admin_panel/db/migrate/20081020052934_create_resource_usages.rb +35 -0
  97. data/src/admin_panel/db/migrate/20081020053129_create_app_time_samples.rb +39 -0
  98. data/src/admin_panel/db/migrate/20081020053411_create_url_time_samples.rb +39 -0
  99. data/src/admin_panel/db/migrate/20081020053624_create_url_breakup_time_samples.rb +35 -0
  100. data/src/admin_panel/db/migrate/20081021005144_add_constraints.rb +49 -0
  101. data/src/admin_panel/db/migrate/20090407052622_create_app_exceptions.rb +68 -0
  102. data/src/admin_panel/doc/README_FOR_APP +2 -0
  103. data/src/admin_panel/doc/app/classes/AdminController.html +628 -0
  104. data/src/admin_panel/doc/app/classes/AdminHelper.html +482 -0
  105. data/src/admin_panel/doc/app/classes/Analytics/Database.html +245 -0
  106. data/src/admin_panel/doc/app/classes/Analytics/ResourceUsage.html +478 -0
  107. data/src/admin_panel/doc/app/classes/Analytics/Throughput.html +316 -0
  108. data/src/admin_panel/doc/app/classes/Analytics/Url.html +310 -0
  109. data/src/admin_panel/doc/app/classes/Analytics/UrlBreakup.html +366 -0
  110. data/src/admin_panel/doc/app/classes/Analytics.html +138 -0
  111. data/src/admin_panel/doc/app/classes/App.html +158 -0
  112. data/src/admin_panel/doc/app/classes/AppException.html +357 -0
  113. data/src/admin_panel/doc/app/classes/AppTimeSample.html +467 -0
  114. data/src/admin_panel/doc/app/classes/ApplicationController.html +118 -0
  115. data/src/admin_panel/doc/app/classes/ApplicationHelper.html +278 -0
  116. data/src/admin_panel/doc/app/classes/ApplicationSpecification.html +541 -0
  117. data/src/admin_panel/doc/app/classes/ApplicationSpecificationController.html +350 -0
  118. data/src/admin_panel/doc/app/classes/Control.html +329 -0
  119. data/src/admin_panel/doc/app/classes/ExceptionsController.html +624 -0
  120. data/src/admin_panel/doc/app/classes/ExceptionsHelper.html +105 -0
  121. data/src/admin_panel/doc/app/classes/GraphController.html +687 -0
  122. data/src/admin_panel/doc/app/classes/GraphHelper.html +164 -0
  123. data/src/admin_panel/doc/app/classes/MailSpecificationController.html +338 -0
  124. data/src/admin_panel/doc/app/classes/PseudoModel.html +206 -0
  125. data/src/admin_panel/doc/app/classes/ResourceUsage.html +425 -0
  126. data/src/admin_panel/doc/app/classes/SCGI.html +406 -0
  127. data/src/admin_panel/doc/app/classes/ServerSpecification.html +327 -0
  128. data/src/admin_panel/doc/app/classes/ServerSpecificationController.html +273 -0
  129. data/src/admin_panel/doc/app/classes/UrlBreakupTimeSample.html +169 -0
  130. data/src/admin_panel/doc/app/classes/UrlTimeSample.html +774 -0
  131. data/src/admin_panel/doc/app/classes/User.html +165 -0
  132. data/src/admin_panel/doc/app/classes/YAMLWriter.html +159 -0
  133. data/src/admin_panel/doc/app/created.rid +1 -0
  134. data/src/admin_panel/doc/app/files/app/controllers/admin_controller_rb.html +101 -0
  135. data/src/admin_panel/doc/app/files/app/controllers/application_controller_rb.html +108 -0
  136. data/src/admin_panel/doc/app/files/app/controllers/application_specification_controller_rb.html +101 -0
  137. data/src/admin_panel/doc/app/files/app/controllers/exceptions_controller_rb.html +101 -0
  138. data/src/admin_panel/doc/app/files/app/controllers/graph_controller_rb.html +101 -0
  139. data/src/admin_panel/doc/app/files/app/controllers/mail_specification_controller_rb.html +101 -0
  140. data/src/admin_panel/doc/app/files/app/controllers/server_specification_controller_rb.html +101 -0
  141. data/src/admin_panel/doc/app/files/app/helpers/admin_helper_rb.html +101 -0
  142. data/src/admin_panel/doc/app/files/app/helpers/application_helper_rb.html +101 -0
  143. data/src/admin_panel/doc/app/files/app/helpers/exceptions_helper_rb.html +101 -0
  144. data/src/admin_panel/doc/app/files/app/helpers/graph_helper_rb.html +101 -0
  145. data/src/admin_panel/doc/app/files/app/models/app_exception_rb.html +101 -0
  146. data/src/admin_panel/doc/app/files/app/models/app_rb.html +108 -0
  147. data/src/admin_panel/doc/app/files/app/models/app_time_sample_rb.html +101 -0
  148. data/src/admin_panel/doc/app/files/app/models/application_specification_rb.html +101 -0
  149. data/src/admin_panel/doc/app/files/app/models/pseudo_model_rb.html +101 -0
  150. data/src/admin_panel/doc/app/files/app/models/resource_usage_rb.html +101 -0
  151. data/src/admin_panel/doc/app/files/app/models/server_specification_rb.html +101 -0
  152. data/src/admin_panel/doc/app/files/app/models/url_breakup_time_sample_rb.html +101 -0
  153. data/src/admin_panel/doc/app/files/app/models/url_time_sample_rb.html +101 -0
  154. data/src/admin_panel/doc/app/files/app/models/user_rb.html +101 -0
  155. data/src/admin_panel/doc/app/files/doc/README_FOR_APP.html +109 -0
  156. data/src/admin_panel/doc/app/files/lib/control_rb.html +109 -0
  157. data/src/admin_panel/doc/app/files/lib/graph_controller_extensions/database_analytics_rb.html +101 -0
  158. data/src/admin_panel/doc/app/files/lib/graph_controller_extensions/resource_usage_analytics_rb.html +101 -0
  159. data/src/admin_panel/doc/app/files/lib/graph_controller_extensions/throughput_analytics_rb.html +101 -0
  160. data/src/admin_panel/doc/app/files/lib/graph_controller_extensions/url_analytics_rb.html +101 -0
  161. data/src/admin_panel/doc/app/files/lib/graph_controller_extensions/url_breakup_analytics_rb.html +101 -0
  162. data/src/admin_panel/doc/app/files/lib/scgi_rb.html +101 -0
  163. data/src/admin_panel/doc/app/files/lib/yaml_writer_rb.html +101 -0
  164. data/src/admin_panel/doc/app/fr_class_index.html +56 -0
  165. data/src/admin_panel/doc/app/fr_file_index.html +56 -0
  166. data/src/admin_panel/doc/app/fr_method_index.html +196 -0
  167. data/src/admin_panel/doc/app/index.html +24 -0
  168. data/src/admin_panel/doc/app/rdoc-style.css +208 -0
  169. data/src/admin_panel/lib/control.rb +92 -0
  170. data/src/admin_panel/lib/graph_controller_extensions/database_analytics.rb +62 -0
  171. data/src/admin_panel/lib/graph_controller_extensions/resource_usage_analytics.rb +132 -0
  172. data/src/admin_panel/lib/graph_controller_extensions/throughput_analytics.rb +84 -0
  173. data/src/admin_panel/lib/graph_controller_extensions/url_analytics.rb +79 -0
  174. data/src/admin_panel/lib/graph_controller_extensions/url_breakup_analytics.rb +137 -0
  175. data/src/admin_panel/lib/scgi.rb +97 -0
  176. data/src/admin_panel/lib/yaml_writer.rb +125 -0
  177. data/src/admin_panel/public/404.html +30 -0
  178. data/src/admin_panel/public/422.html +30 -0
  179. data/src/admin_panel/public/500.html +30 -0
  180. data/src/admin_panel/public/blank_iframe.html +2 -0
  181. data/src/admin_panel/public/dispatch.cgi +10 -0
  182. data/src/admin_panel/public/dispatch.fcgi +24 -0
  183. data/src/admin_panel/public/dispatch.rb +10 -0
  184. data/src/admin_panel/public/favicon.ico +0 -0
  185. data/src/admin_panel/public/images/analytics_ad.gif +0 -0
  186. data/src/admin_panel/public/images/analytics_ad_ov.gif +0 -0
  187. data/src/admin_panel/public/images/analytics_dn.gif +0 -0
  188. data/src/admin_panel/public/images/analytics_up.gif +0 -0
  189. data/src/admin_panel/public/images/bar.gif +0 -0
  190. data/src/admin_panel/public/images/bullet.gif +0 -0
  191. data/src/admin_panel/public/images/calendar_date_select/calendar.gif +0 -0
  192. data/src/admin_panel/public/images/callout_left.gif +0 -0
  193. data/src/admin_panel/public/images/callout_right.gif +0 -0
  194. data/src/admin_panel/public/images/configuration_ad.gif +0 -0
  195. data/src/admin_panel/public/images/configuration_ad_ov.gif +0 -0
  196. data/src/admin_panel/public/images/configuration_dn.gif +0 -0
  197. data/src/admin_panel/public/images/configuration_up.gif +0 -0
  198. data/src/admin_panel/public/images/exception_dn.gif +0 -0
  199. data/src/admin_panel/public/images/exception_up.gif +0 -0
  200. data/src/admin_panel/public/images/exceptions_ad.gif +0 -0
  201. data/src/admin_panel/public/images/exceptions_ad_ov.gif +0 -0
  202. data/src/admin_panel/public/images/footer-bg.gif +0 -0
  203. data/src/admin_panel/public/images/home_ad.gif +0 -0
  204. data/src/admin_panel/public/images/home_ad_ov.gif +0 -0
  205. data/src/admin_panel/public/images/home_dn.gif +0 -0
  206. data/src/admin_panel/public/images/home_down.jpg +0 -0
  207. data/src/admin_panel/public/images/home_up.gif +0 -0
  208. data/src/admin_panel/public/images/home_up.jpg +0 -0
  209. data/src/admin_panel/public/images/impetus.gif +0 -0
  210. data/src/admin_panel/public/images/left_menu.gif +0 -0
  211. data/src/admin_panel/public/images/loading.gif +0 -0
  212. data/src/admin_panel/public/images/logout.gif +0 -0
  213. data/src/admin_panel/public/images/rails.png +0 -0
  214. data/src/admin_panel/public/images/right_menu.gif +0 -0
  215. data/src/admin_panel/public/images/server_logo.gif +0 -0
  216. data/src/admin_panel/public/images/setting_dn.gif +0 -0
  217. data/src/admin_panel/public/images/setting_up.gif +0 -0
  218. data/src/admin_panel/public/images/settings_ad.gif +0 -0
  219. data/src/admin_panel/public/images/settings_ad_ov.gif +0 -0
  220. data/src/admin_panel/public/images/settings_down.jpg +0 -0
  221. data/src/admin_panel/public/images/settings_up.jpg +0 -0
  222. data/src/admin_panel/public/images/slider.jpg +0 -0
  223. data/src/admin_panel/public/images/tit_analytics_ad.gif +0 -0
  224. data/src/admin_panel/public/images/tit_configuration_ad.gif +0 -0
  225. data/src/admin_panel/public/images/tit_exceptions_ad.gif +0 -0
  226. data/src/admin_panel/public/images/tit_home_ad.gif +0 -0
  227. data/src/admin_panel/public/images/tit_settings_ad.gif +0 -0
  228. data/src/admin_panel/public/images/webroar-logo.gif +0 -0
  229. data/src/admin_panel/public/javascripts/application.js +283 -0
  230. data/src/admin_panel/public/javascripts/builder.js +136 -0
  231. data/src/admin_panel/public/javascripts/calendar_date_select/calendar_date_select.js +443 -0
  232. data/src/admin_panel/public/javascripts/calendar_date_select/format_american.js +34 -0
  233. data/src/admin_panel/public/javascripts/calendar_date_select/format_db.js +27 -0
  234. data/src/admin_panel/public/javascripts/calendar_date_select/format_euro_24hr.js +7 -0
  235. data/src/admin_panel/public/javascripts/calendar_date_select/format_euro_24hr_ymd.js +7 -0
  236. data/src/admin_panel/public/javascripts/calendar_date_select/format_finnish.js +32 -0
  237. data/src/admin_panel/public/javascripts/calendar_date_select/format_hyphen_ampm.js +37 -0
  238. data/src/admin_panel/public/javascripts/calendar_date_select/format_iso_date.js +46 -0
  239. data/src/admin_panel/public/javascripts/calendar_date_select/format_italian.js +24 -0
  240. data/src/admin_panel/public/javascripts/calendar_date_select/locale/de.js +11 -0
  241. data/src/admin_panel/public/javascripts/calendar_date_select/locale/fi.js +10 -0
  242. data/src/admin_panel/public/javascripts/calendar_date_select/locale/fr.js +10 -0
  243. data/src/admin_panel/public/javascripts/calendar_date_select/locale/pl.js +10 -0
  244. data/src/admin_panel/public/javascripts/calendar_date_select/locale/pt.js +11 -0
  245. data/src/admin_panel/public/javascripts/calendar_date_select/locale/ru.js +10 -0
  246. data/src/admin_panel/public/javascripts/controls.js +963 -0
  247. data/src/admin_panel/public/javascripts/dragdrop.js +973 -0
  248. data/src/admin_panel/public/javascripts/effects.js +1128 -0
  249. data/src/admin_panel/public/javascripts/jquery-1.3.2.js +4376 -0
  250. data/src/admin_panel/public/javascripts/prototype.js +4320 -0
  251. data/src/admin_panel/public/javascripts/scriptaculous.js +58 -0
  252. data/src/admin_panel/public/javascripts/swfobject.js +5 -0
  253. data/src/admin_panel/public/javascripts/ui.core.js +519 -0
  254. data/src/admin_panel/public/javascripts/ui.slider.js +555 -0
  255. data/src/admin_panel/public/javascripts/ui.slider_old.js +558 -0
  256. data/src/admin_panel/public/open-flash-chart.swf +0 -0
  257. data/src/admin_panel/public/robots.txt +5 -0
  258. data/src/admin_panel/public/stylesheets/calendar_date_select/blue.css +130 -0
  259. data/src/admin_panel/public/stylesheets/calendar_date_select/default.css +135 -0
  260. data/src/admin_panel/public/stylesheets/calendar_date_select/plain.css +128 -0
  261. data/src/admin_panel/public/stylesheets/calendar_date_select/red.css +135 -0
  262. data/src/admin_panel/public/stylesheets/calendar_date_select/silver.css +133 -0
  263. data/src/admin_panel/public/stylesheets/netscape/login.css +92 -0
  264. data/src/admin_panel/public/stylesheets/netscape/style.css +657 -0
  265. data/src/admin_panel/public/stylesheets/other/login.css +91 -0
  266. data/src/admin_panel/public/stylesheets/other/style.css +657 -0
  267. data/src/admin_panel/public/stylesheets/safari/login.css +75 -0
  268. data/src/admin_panel/public/stylesheets/safari/style.css +668 -0
  269. data/src/admin_panel/public/stylesheets/ui.all.css +2 -0
  270. data/src/admin_panel/public/stylesheets/ui.base.css +2 -0
  271. data/src/admin_panel/public/stylesheets/ui.core.css +37 -0
  272. data/src/admin_panel/public/stylesheets/ui.slider.css +23 -0
  273. data/src/admin_panel/public/stylesheets/ui.theme.css +245 -0
  274. data/src/admin_panel/script/about +4 -0
  275. data/src/admin_panel/script/console +3 -0
  276. data/src/admin_panel/script/dbconsole +3 -0
  277. data/src/admin_panel/script/destroy +3 -0
  278. data/src/admin_panel/script/generate +3 -0
  279. data/src/admin_panel/script/performance/benchmarker +3 -0
  280. data/src/admin_panel/script/performance/profiler +3 -0
  281. data/src/admin_panel/script/performance/request +3 -0
  282. data/src/admin_panel/script/plugin +3 -0
  283. data/src/admin_panel/script/process/inspector +3 -0
  284. data/src/admin_panel/script/process/reaper +3 -0
  285. data/src/admin_panel/script/process/spawner +3 -0
  286. data/src/admin_panel/script/runner +3 -0
  287. data/src/admin_panel/script/server +3 -0
  288. data/src/admin_panel/test/functional/admin_controller_test.rb +126 -0
  289. data/src/admin_panel/test/functional/application_specification_controller_test.rb +61 -0
  290. data/src/admin_panel/test/functional/exceptions_controller_test.rb +28 -0
  291. data/src/admin_panel/test/functional/graph_controller_test.rb +44 -0
  292. data/src/admin_panel/test/test_helper.rb +76 -0
  293. data/src/admin_panel/test/unit/app_exception_test.rb +28 -0
  294. data/src/admin_panel/test/unit/app_test.rb +34 -0
  295. data/src/admin_panel/test/unit/app_time_sample_test.rb +38 -0
  296. data/src/admin_panel/test/unit/helpers/exceptions_helper_test.rb +24 -0
  297. data/src/admin_panel/test/unit/resource_usage_test.rb +55 -0
  298. data/src/admin_panel/test/unit/url_breakup_time_sample_test.rb +25 -0
  299. data/src/admin_panel/test/unit/url_time_sample_test.rb +34 -0
  300. data/src/admin_panel/vendor/plugins/open_flash_chart_2/CHANGES +12 -0
  301. data/src/admin_panel/vendor/plugins/open_flash_chart_2/MIT-LICENSE +20 -0
  302. data/src/admin_panel/vendor/plugins/open_flash_chart_2/README +79 -0
  303. data/src/admin_panel/vendor/plugins/open_flash_chart_2/Rakefile +22 -0
  304. data/src/admin_panel/vendor/plugins/open_flash_chart_2/TODO +11 -0
  305. data/src/admin_panel/vendor/plugins/open_flash_chart_2/init.rb +3 -0
  306. data/src/admin_panel/vendor/plugins/open_flash_chart_2/install.rb +6 -0
  307. data/src/admin_panel/vendor/plugins/open_flash_chart_2/lib/open_flash_chart_2.rb +563 -0
  308. data/src/admin_panel/vendor/plugins/open_flash_chart_2/requirements/json/json2.js +461 -0
  309. data/src/admin_panel/vendor/plugins/open_flash_chart_2/requirements/open-flash-chart.swf +0 -0
  310. data/src/admin_panel/vendor/plugins/open_flash_chart_2/requirements/swfobject.js +5 -0
  311. data/src/admin_panel/vendor/plugins/open_flash_chart_2/tasks/open_flash_chart_tasks.rake +16 -0
  312. data/src/admin_panel/vendor/plugins/open_flash_chart_2/test/open_flash_chart_test.rb +8 -0
  313. data/src/admin_panel/vendor/plugins/open_flash_chart_2/uninstall.rb +4 -0
  314. data/src/admin_panel/vendor/plugins/ssl_requirement/README +43 -0
  315. data/src/admin_panel/vendor/plugins/ssl_requirement/lib/ssl_requirement.rb +72 -0
  316. data/src/admin_panel/vendor/plugins/ssl_requirement/test/ssl_requirement_test.rb +132 -0
  317. data/src/admin_panel/vendor/rails/actionmailer/CHANGELOG +358 -0
  318. data/src/admin_panel/vendor/rails/actionmailer/MIT-LICENSE +21 -0
  319. data/src/admin_panel/vendor/rails/actionmailer/README +149 -0
  320. data/src/admin_panel/vendor/rails/actionmailer/Rakefile +98 -0
  321. data/src/admin_panel/vendor/rails/actionmailer/install.rb +30 -0
  322. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/adv_attr_accessor.rb +30 -0
  323. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/base.rb +705 -0
  324. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/helpers.rb +113 -0
  325. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/mail_helper.rb +17 -0
  326. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/part.rb +107 -0
  327. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/part_container.rb +55 -0
  328. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/quoting.rb +61 -0
  329. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/test_case.rb +64 -0
  330. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/test_helper.rb +68 -0
  331. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/utils.rb +7 -0
  332. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/text-format-0.6.3/text/format.rb +1466 -0
  333. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/text_format.rb +10 -0
  334. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/address.rb +426 -0
  335. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/attachments.rb +46 -0
  336. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/base64.rb +46 -0
  337. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/compat.rb +41 -0
  338. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/config.rb +67 -0
  339. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/core_extensions.rb +63 -0
  340. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/encode.rb +581 -0
  341. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/header.rb +960 -0
  342. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/index.rb +9 -0
  343. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/interface.rb +1130 -0
  344. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/loader.rb +3 -0
  345. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/mail.rb +578 -0
  346. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/mailbox.rb +495 -0
  347. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/main.rb +6 -0
  348. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/mbox.rb +3 -0
  349. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/net.rb +248 -0
  350. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/obsolete.rb +132 -0
  351. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/parser.rb +1476 -0
  352. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/port.rb +379 -0
  353. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/quoting.rb +118 -0
  354. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/require_arch.rb +58 -0
  355. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/scanner.rb +49 -0
  356. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/scanner_r.rb +261 -0
  357. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/stringio.rb +280 -0
  358. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/utils.rb +337 -0
  359. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/version.rb +39 -0
  360. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail.rb +5 -0
  361. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail.rb +17 -0
  362. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer/version.rb +9 -0
  363. data/src/admin_panel/vendor/rails/actionmailer/lib/action_mailer.rb +62 -0
  364. data/src/admin_panel/vendor/rails/actionmailer/lib/actionmailer.rb +1 -0
  365. data/src/admin_panel/vendor/rails/actionmailer/test/abstract_unit.rb +65 -0
  366. data/src/admin_panel/vendor/rails/actionmailer/test/asset_host_test.rb +54 -0
  367. data/src/admin_panel/vendor/rails/actionmailer/test/delivery_method_test.rb +51 -0
  368. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/asset_host_mailer/email_with_asset.html.erb +1 -0
  369. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/auto_layout_mailer/hello.html.erb +1 -0
  370. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.html.erb +1 -0
  371. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.plain.erb +1 -0
  372. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/explicit_layout_mailer/logout.html.erb +1 -0
  373. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/explicit_layout_mailer/signup.html.erb +1 -0
  374. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/first_mailer/share.erb +1 -0
  375. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_example_helper.erb +1 -0
  376. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_helper.erb +1 -0
  377. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_helper_method.erb +1 -0
  378. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_mail_helper.erb +5 -0
  379. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/helpers/example_helper.rb +5 -0
  380. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/layouts/auto_layout_mailer.html.erb +1 -0
  381. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/layouts/auto_layout_mailer.text.erb +1 -0
  382. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/layouts/spam.html.erb +1 -0
  383. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/path.with.dots/funky_path_mailer/multipart_with_template_path_with_dots.erb +1 -0
  384. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email +14 -0
  385. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email10 +20 -0
  386. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email12 +32 -0
  387. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email13 +29 -0
  388. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email2 +114 -0
  389. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email3 +70 -0
  390. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email4 +59 -0
  391. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email5 +19 -0
  392. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email6 +20 -0
  393. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email7 +66 -0
  394. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email8 +47 -0
  395. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email9 +28 -0
  396. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email_quoted_with_0d0a +14 -0
  397. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email_with_invalid_characters_in_content_type +104 -0
  398. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email_with_nested_attachment +100 -0
  399. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/raw_email_with_partially_quoted_subject +14 -0
  400. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/second_mailer/share.erb +1 -0
  401. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/templates/signed_up.erb +3 -0
  402. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/_subtemplate.text.plain.erb +1 -0
  403. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/body_ivar.erb +2 -0
  404. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.html.haml +6 -0
  405. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.plain.haml +6 -0
  406. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.ignored.erb +1 -0
  407. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.html.erb +10 -0
  408. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.plain.erb +2 -0
  409. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.yaml.erb +1 -0
  410. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/included_subtemplate.text.plain.erb +1 -0
  411. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/rxml_template.builder +2 -0
  412. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/rxml_template.rxml +2 -0
  413. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/signed_up.html.erb +3 -0
  414. data/src/admin_panel/vendor/rails/actionmailer/test/fixtures/test_mailer/signed_up_with_url.erb +5 -0
  415. data/src/admin_panel/vendor/rails/actionmailer/test/mail_helper_test.rb +95 -0
  416. data/src/admin_panel/vendor/rails/actionmailer/test/mail_layout_test.rb +123 -0
  417. data/src/admin_panel/vendor/rails/actionmailer/test/mail_render_test.rb +116 -0
  418. data/src/admin_panel/vendor/rails/actionmailer/test/mail_service_test.rb +1078 -0
  419. data/src/admin_panel/vendor/rails/actionmailer/test/quoting_test.rb +99 -0
  420. data/src/admin_panel/vendor/rails/actionmailer/test/test_helper_test.rb +129 -0
  421. data/src/admin_panel/vendor/rails/actionmailer/test/tmail_test.rb +22 -0
  422. data/src/admin_panel/vendor/rails/actionmailer/test/url_test.rb +76 -0
  423. data/src/admin_panel/vendor/rails/actionpack/CHANGELOG +5156 -0
  424. data/src/admin_panel/vendor/rails/actionpack/MIT-LICENSE +21 -0
  425. data/src/admin_panel/vendor/rails/actionpack/README +409 -0
  426. data/src/admin_panel/vendor/rails/actionpack/RUNNING_UNIT_TESTS +24 -0
  427. data/src/admin_panel/vendor/rails/actionpack/Rakefile +158 -0
  428. data/src/admin_panel/vendor/rails/actionpack/install.rb +30 -0
  429. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/assertions/dom_assertions.rb +39 -0
  430. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/assertions/model_assertions.rb +21 -0
  431. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb +150 -0
  432. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/assertions/routing_assertions.rb +146 -0
  433. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/assertions/selector_assertions.rb +632 -0
  434. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/assertions/tag_assertions.rb +127 -0
  435. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/base.rb +1414 -0
  436. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/benchmarking.rb +107 -0
  437. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/caching/actions.rb +169 -0
  438. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/caching/fragments.rb +120 -0
  439. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/caching/pages.rb +152 -0
  440. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/caching/sweeping.rb +97 -0
  441. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/caching.rb +70 -0
  442. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/cgi_ext/cookie.rb +112 -0
  443. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  444. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  445. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/cgi_ext.rb +15 -0
  446. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/cgi_process.rb +77 -0
  447. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/cookies.rb +94 -0
  448. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/dispatcher.rb +118 -0
  449. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/failsafe.rb +52 -0
  450. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/filters.rb +680 -0
  451. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/flash.rb +163 -0
  452. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/headers.rb +33 -0
  453. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/helpers.rb +225 -0
  454. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/http_authentication.rb +304 -0
  455. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/integration.rb +687 -0
  456. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/layout.rb +281 -0
  457. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/middleware_stack.rb +119 -0
  458. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/middlewares.rb +13 -0
  459. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/mime_responds.rb +193 -0
  460. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/mime_type.rb +212 -0
  461. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/mime_types.rb +21 -0
  462. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/params_parser.rb +71 -0
  463. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/performance_test.rb +15 -0
  464. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb +204 -0
  465. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/record_identifier.rb +104 -0
  466. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/reloader.rb +14 -0
  467. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/request.rb +489 -0
  468. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/request_forgery_protection.rb +108 -0
  469. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/rescue.rb +183 -0
  470. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/resources.rb +678 -0
  471. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/response.rb +232 -0
  472. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/rewindable_input.rb +28 -0
  473. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/routing/builder.rb +197 -0
  474. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/routing/optimisations.rb +130 -0
  475. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  476. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/routing/route.rb +265 -0
  477. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb +488 -0
  478. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/routing/routing_ext.rb +49 -0
  479. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/routing/segments.rb +343 -0
  480. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/routing.rb +385 -0
  481. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/session/abstract_store.rb +181 -0
  482. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/session/cookie_store.rb +221 -0
  483. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/session/mem_cache_store.rb +51 -0
  484. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/session_management.rb +54 -0
  485. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/status_codes.rb +88 -0
  486. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/streaming.rb +179 -0
  487. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  488. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/templates/rescues/_trace.erb +26 -0
  489. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  490. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/templates/rescues/layout.erb +29 -0
  491. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  492. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  493. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/templates/rescues/template_error.erb +21 -0
  494. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  495. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/test_case.rb +204 -0
  496. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/test_process.rb +572 -0
  497. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/translation.rb +13 -0
  498. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/uploaded_file.rb +44 -0
  499. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/url_rewriter.rb +216 -0
  500. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  501. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  502. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  503. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  504. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  505. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  506. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner.rb +16 -0
  507. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/adapter/camping.rb +22 -0
  508. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/abstract/handler.rb +37 -0
  509. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/abstract/request.rb +37 -0
  510. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/basic.rb +58 -0
  511. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/md5.rb +124 -0
  512. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/nonce.rb +51 -0
  513. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/params.rb +55 -0
  514. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/request.rb +40 -0
  515. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/openid.rb +480 -0
  516. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/builder.rb +63 -0
  517. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/cascade.rb +36 -0
  518. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/chunked.rb +49 -0
  519. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/commonlogger.rb +61 -0
  520. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/conditionalget.rb +45 -0
  521. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/content_length.rb +29 -0
  522. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/content_type.rb +23 -0
  523. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/deflater.rb +85 -0
  524. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/directory.rb +153 -0
  525. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/file.rb +88 -0
  526. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/cgi.rb +61 -0
  527. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/evented_mongrel.rb +8 -0
  528. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/fastcgi.rb +89 -0
  529. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/lsws.rb +55 -0
  530. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb +84 -0
  531. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/scgi.rb +59 -0
  532. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/swiftiplied_mongrel.rb +8 -0
  533. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/thin.rb +18 -0
  534. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/webrick.rb +67 -0
  535. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler.rb +48 -0
  536. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/head.rb +19 -0
  537. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lint.rb +462 -0
  538. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lobster.rb +65 -0
  539. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lock.rb +16 -0
  540. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/methodoverride.rb +27 -0
  541. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/mime.rb +204 -0
  542. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/mock.rb +160 -0
  543. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/recursive.rb +57 -0
  544. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/reloader.rb +64 -0
  545. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/request.rb +241 -0
  546. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/response.rb +179 -0
  547. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/abstract/id.rb +142 -0
  548. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/cookie.rb +91 -0
  549. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/memcache.rb +109 -0
  550. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/pool.rb +100 -0
  551. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/showexceptions.rb +349 -0
  552. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/showstatus.rb +106 -0
  553. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/static.rb +38 -0
  554. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/urlmap.rb +55 -0
  555. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/utils.rb +392 -0
  556. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack.rb +89 -0
  557. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller/verification.rb +130 -0
  558. data/src/admin_panel/vendor/rails/actionpack/lib/action_controller.rb +116 -0
  559. data/src/admin_panel/vendor/rails/actionpack/lib/action_pack/version.rb +9 -0
  560. data/src/admin_panel/vendor/rails/actionpack/lib/action_pack.rb +24 -0
  561. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/base.rb +357 -0
  562. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/erb/util.rb +38 -0
  563. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb +305 -0
  564. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/asset_tag_helper.rb +682 -0
  565. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  566. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/benchmark_helper.rb +54 -0
  567. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/cache_helper.rb +39 -0
  568. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/capture_helper.rb +136 -0
  569. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/date_helper.rb +976 -0
  570. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/debug_helper.rb +38 -0
  571. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/form_helper.rb +1039 -0
  572. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/form_options_helper.rb +530 -0
  573. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/form_tag_helper.rb +481 -0
  574. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/javascript_helper.rb +208 -0
  575. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/number_helper.rb +303 -0
  576. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/prototype_helper.rb +1305 -0
  577. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/record_identification_helper.rb +20 -0
  578. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/record_tag_helper.rb +58 -0
  579. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/sanitize_helper.rb +251 -0
  580. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  581. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/tag_helper.rb +150 -0
  582. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/text_helper.rb +578 -0
  583. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/translation_helper.rb +39 -0
  584. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb +638 -0
  585. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/helpers.rb +57 -0
  586. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/inline_template.rb +19 -0
  587. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/locale/en.yml +110 -0
  588. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/partials.rb +240 -0
  589. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/paths.rb +69 -0
  590. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/reloadable_template.rb +117 -0
  591. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/renderable.rb +95 -0
  592. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/renderable_partial.rb +47 -0
  593. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/template.rb +257 -0
  594. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/template_error.rb +99 -0
  595. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/template_handler.rb +34 -0
  596. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/template_handlers/builder.rb +17 -0
  597. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/template_handlers/erb.rb +22 -0
  598. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/template_handlers/rjs.rb +13 -0
  599. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/template_handlers.rb +48 -0
  600. data/src/admin_panel/vendor/rails/actionpack/lib/action_view/test_case.rb +87 -0
  601. data/src/admin_panel/vendor/rails/actionpack/lib/action_view.rb +58 -0
  602. data/src/admin_panel/vendor/rails/actionpack/lib/actionpack.rb +1 -0
  603. data/src/admin_panel/vendor/rails/actionpack/test/abstract_unit.rb +45 -0
  604. data/src/admin_panel/vendor/rails/actionpack/test/active_record_unit.rb +104 -0
  605. data/src/admin_panel/vendor/rails/actionpack/test/activerecord/active_record_store_test.rb +174 -0
  606. data/src/admin_panel/vendor/rails/actionpack/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  607. data/src/admin_panel/vendor/rails/actionpack/test/adv_attr_test.rb +20 -0
  608. data/src/admin_panel/vendor/rails/actionpack/test/controller/action_pack_assertions_test.rb +516 -0
  609. data/src/admin_panel/vendor/rails/actionpack/test/controller/addresses_render_test.rb +37 -0
  610. data/src/admin_panel/vendor/rails/actionpack/test/controller/assert_select_test.rb +734 -0
  611. data/src/admin_panel/vendor/rails/actionpack/test/controller/base_test.rb +217 -0
  612. data/src/admin_panel/vendor/rails/actionpack/test/controller/benchmark_test.rb +32 -0
  613. data/src/admin_panel/vendor/rails/actionpack/test/controller/caching_test.rb +690 -0
  614. data/src/admin_panel/vendor/rails/actionpack/test/controller/capture_test.rb +66 -0
  615. data/src/admin_panel/vendor/rails/actionpack/test/controller/content_type_test.rb +168 -0
  616. data/src/admin_panel/vendor/rails/actionpack/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  617. data/src/admin_panel/vendor/rails/actionpack/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  618. data/src/admin_panel/vendor/rails/actionpack/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  619. data/src/admin_panel/vendor/rails/actionpack/test/controller/cookie_test.rb +111 -0
  620. data/src/admin_panel/vendor/rails/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  621. data/src/admin_panel/vendor/rails/actionpack/test/controller/dispatcher_test.rb +103 -0
  622. data/src/admin_panel/vendor/rails/actionpack/test/controller/fake_controllers.rb +33 -0
  623. data/src/admin_panel/vendor/rails/actionpack/test/controller/fake_models.rb +19 -0
  624. data/src/admin_panel/vendor/rails/actionpack/test/controller/filter_params_test.rb +49 -0
  625. data/src/admin_panel/vendor/rails/actionpack/test/controller/filters_test.rb +885 -0
  626. data/src/admin_panel/vendor/rails/actionpack/test/controller/flash_test.rb +142 -0
  627. data/src/admin_panel/vendor/rails/actionpack/test/controller/header_test.rb +14 -0
  628. data/src/admin_panel/vendor/rails/actionpack/test/controller/helper_test.rb +224 -0
  629. data/src/admin_panel/vendor/rails/actionpack/test/controller/html-scanner/cdata_node_test.rb +15 -0
  630. data/src/admin_panel/vendor/rails/actionpack/test/controller/html-scanner/document_test.rb +148 -0
  631. data/src/admin_panel/vendor/rails/actionpack/test/controller/html-scanner/node_test.rb +89 -0
  632. data/src/admin_panel/vendor/rails/actionpack/test/controller/html-scanner/sanitizer_test.rb +273 -0
  633. data/src/admin_panel/vendor/rails/actionpack/test/controller/html-scanner/tag_node_test.rb +238 -0
  634. data/src/admin_panel/vendor/rails/actionpack/test/controller/html-scanner/text_node_test.rb +50 -0
  635. data/src/admin_panel/vendor/rails/actionpack/test/controller/html-scanner/tokenizer_test.rb +131 -0
  636. data/src/admin_panel/vendor/rails/actionpack/test/controller/http_basic_authentication_test.rb +88 -0
  637. data/src/admin_panel/vendor/rails/actionpack/test/controller/http_digest_authentication_test.rb +178 -0
  638. data/src/admin_panel/vendor/rails/actionpack/test/controller/integration_test.rb +417 -0
  639. data/src/admin_panel/vendor/rails/actionpack/test/controller/layout_test.rb +204 -0
  640. data/src/admin_panel/vendor/rails/actionpack/test/controller/logging_test.rb +46 -0
  641. data/src/admin_panel/vendor/rails/actionpack/test/controller/middleware_stack_test.rb +90 -0
  642. data/src/admin_panel/vendor/rails/actionpack/test/controller/mime_responds_test.rb +536 -0
  643. data/src/admin_panel/vendor/rails/actionpack/test/controller/mime_type_test.rb +93 -0
  644. data/src/admin_panel/vendor/rails/actionpack/test/controller/polymorphic_routes_test.rb +293 -0
  645. data/src/admin_panel/vendor/rails/actionpack/test/controller/rack_test.rb +294 -0
  646. data/src/admin_panel/vendor/rails/actionpack/test/controller/record_identifier_test.rb +139 -0
  647. data/src/admin_panel/vendor/rails/actionpack/test/controller/redirect_test.rb +282 -0
  648. data/src/admin_panel/vendor/rails/actionpack/test/controller/render_test.rb +1752 -0
  649. data/src/admin_panel/vendor/rails/actionpack/test/controller/request/json_params_parsing_test.rb +45 -0
  650. data/src/admin_panel/vendor/rails/actionpack/test/controller/request/multipart_params_parsing_test.rb +223 -0
  651. data/src/admin_panel/vendor/rails/actionpack/test/controller/request/query_string_parsing_test.rb +120 -0
  652. data/src/admin_panel/vendor/rails/actionpack/test/controller/request/url_encoded_params_parsing_test.rb +184 -0
  653. data/src/admin_panel/vendor/rails/actionpack/test/controller/request/xml_params_parsing_test.rb +88 -0
  654. data/src/admin_panel/vendor/rails/actionpack/test/controller/request_forgery_protection_test.rb +246 -0
  655. data/src/admin_panel/vendor/rails/actionpack/test/controller/request_test.rb +407 -0
  656. data/src/admin_panel/vendor/rails/actionpack/test/controller/rescue_test.rb +536 -0
  657. data/src/admin_panel/vendor/rails/actionpack/test/controller/resources_test.rb +1341 -0
  658. data/src/admin_panel/vendor/rails/actionpack/test/controller/routing_test.rb +2557 -0
  659. data/src/admin_panel/vendor/rails/actionpack/test/controller/selector_test.rb +628 -0
  660. data/src/admin_panel/vendor/rails/actionpack/test/controller/send_file_test.rb +161 -0
  661. data/src/admin_panel/vendor/rails/actionpack/test/controller/session/cookie_store_test.rb +239 -0
  662. data/src/admin_panel/vendor/rails/actionpack/test/controller/session/mem_cache_store_test.rb +127 -0
  663. data/src/admin_panel/vendor/rails/actionpack/test/controller/session/test_session_test.rb +58 -0
  664. data/src/admin_panel/vendor/rails/actionpack/test/controller/test_test.rb +692 -0
  665. data/src/admin_panel/vendor/rails/actionpack/test/controller/translation_test.rb +26 -0
  666. data/src/admin_panel/vendor/rails/actionpack/test/controller/url_rewriter_test.rb +359 -0
  667. data/src/admin_panel/vendor/rails/actionpack/test/controller/verification_test.rb +270 -0
  668. data/src/admin_panel/vendor/rails/actionpack/test/controller/view_paths_test.rb +141 -0
  669. data/src/admin_panel/vendor/rails/actionpack/test/controller/webservice_test.rb +260 -0
  670. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/_top_level_partial.html.erb +1 -0
  671. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/_top_level_partial_only.erb +1 -0
  672. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/addresses/list.erb +1 -0
  673. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  674. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  675. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/companies.yml +24 -0
  676. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/company.rb +10 -0
  677. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  678. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  679. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  680. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  681. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/customers/_customer.html.erb +1 -0
  682. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/db_definitions/sqlite.sql +49 -0
  683. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/developer.rb +9 -0
  684. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/developers/_developer.erb +1 -0
  685. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/developers.yml +21 -0
  686. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/developers_projects.yml +13 -0
  687. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/fun/games/_game.erb +1 -0
  688. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/fun/games/hello_world.erb +1 -0
  689. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/fun/serious/games/_game.erb +1 -0
  690. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/functional_caching/_partial.erb +3 -0
  691. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  692. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  693. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  694. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  695. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  696. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  697. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  698. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  699. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/helpers/abc_helper.rb +5 -0
  700. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/helpers/fun/games_helper.rb +3 -0
  701. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  702. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  703. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  704. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  705. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  706. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  707. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  708. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  709. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  710. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layouts/_column.html.erb +2 -0
  711. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layouts/block_with_layout.erb +3 -0
  712. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layouts/builder.builder +3 -0
  713. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layouts/default_html.html.erb +1 -0
  714. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layouts/partial_with_layout.erb +3 -0
  715. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layouts/standard.erb +1 -0
  716. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layouts/talk_from_action.erb +2 -0
  717. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layouts/xhr.html.erb +2 -0
  718. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/layouts/yield.erb +2 -0
  719. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/mascot.rb +3 -0
  720. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/mascots/_mascot.html.erb +1 -0
  721. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/mascots.yml +4 -0
  722. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/multipart/binary_file +0 -0
  723. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/multipart/boundary_problem_file +10 -0
  724. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/multipart/bracketed_param +5 -0
  725. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/multipart/empty +10 -0
  726. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/multipart/hello.txt +1 -0
  727. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/multipart/large_text_file +10 -0
  728. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/multipart/mixed_files +0 -0
  729. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/multipart/mona_lisa.jpg +0 -0
  730. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/multipart/none +9 -0
  731. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/multipart/single_parameter +5 -0
  732. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/multipart/text_file +10 -0
  733. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/override/test/hello_world.erb +1 -0
  734. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/override2/layouts/test/sub.erb +1 -0
  735. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/post_test/layouts/post.html.erb +1 -0
  736. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  737. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/post_test/post/index.html.erb +1 -0
  738. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/post_test/post/index.iphone.erb +1 -0
  739. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/post_test/super_post/index.html.erb +1 -0
  740. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  741. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/project.rb +3 -0
  742. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/projects/_project.erb +1 -0
  743. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/projects.yml +7 -0
  744. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/404.html +1 -0
  745. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/500.da.html +1 -0
  746. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/500.html +1 -0
  747. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/images/rails.png +0 -0
  748. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/javascripts/application.js +1 -0
  749. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/javascripts/bank.js +1 -0
  750. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/javascripts/controls.js +1 -0
  751. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/javascripts/dragdrop.js +1 -0
  752. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/javascripts/effects.js +1 -0
  753. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/javascripts/prototype.js +1 -0
  754. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/javascripts/robber.js +1 -0
  755. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  756. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/javascripts/version.1.0.js +1 -0
  757. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/stylesheets/bank.css +1 -0
  758. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/stylesheets/robber.css +1 -0
  759. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  760. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  761. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/quiz/questions/_question.html.erb +1 -0
  762. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/replies/_reply.erb +1 -0
  763. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/replies.yml +15 -0
  764. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/reply.rb +7 -0
  765. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  766. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  767. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  768. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  769. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  770. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  771. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  772. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  773. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  774. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  775. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  776. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  777. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  778. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  779. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/scope/test/modgreet.erb +1 -0
  780. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/shared.html.erb +1 -0
  781. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  782. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_counter.html.erb +1 -0
  783. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_customer.erb +1 -0
  784. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_customer_counter.erb +1 -0
  785. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_customer_greeting.erb +1 -0
  786. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_customer_with_var.erb +1 -0
  787. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_form.erb +1 -0
  788. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_hash_greeting.erb +1 -0
  789. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_hash_object.erb +2 -0
  790. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_hello.builder +1 -0
  791. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_labelling_form.erb +1 -0
  792. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  793. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  794. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_local_inspector.html.erb +1 -0
  795. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_one.html.erb +1 -0
  796. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_partial.erb +1 -0
  797. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_partial.html.erb +1 -0
  798. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_partial.js.erb +1 -0
  799. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  800. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_partial_only.erb +1 -0
  801. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  802. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_person.erb +2 -0
  803. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_raise.html.erb +1 -0
  804. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/_two.html.erb +1 -0
  805. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/action_talk_to_layout.erb +2 -0
  806. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  807. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/capturing.erb +4 -0
  808. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/content_for.erb +2 -0
  809. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/content_for_concatenated.erb +3 -0
  810. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/content_for_with_parameter.erb +2 -0
  811. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/delete_with_js.rjs +2 -0
  812. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/dont_pick_me +1 -0
  813. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  814. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/enum_rjs_test.rjs +6 -0
  815. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  816. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/formatted_xml_erb.builder +1 -0
  817. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  818. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  819. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/greeting.erb +1 -0
  820. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/greeting.js.rjs +1 -0
  821. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/hello.builder +4 -0
  822. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/hello_world.da.html.erb +1 -0
  823. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/hello_world.erb +1 -0
  824. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  825. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/hello_world_container.builder +3 -0
  826. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  827. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  828. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/hello_xml_world.builder +11 -0
  829. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/hyphen-ated.erb +1 -0
  830. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  831. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/list.erb +1 -0
  832. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/nested_layout.erb +3 -0
  833. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  834. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/potential_conflicts.erb +4 -0
  835. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  836. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/render_file_from_template.html.erb +1 -0
  837. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/render_file_with_ivar.erb +1 -0
  838. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/render_file_with_locals.erb +1 -0
  839. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  840. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  841. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  842. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  843. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/render_to_string_test.erb +1 -0
  844. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/sub_template_raise.html.erb +1 -0
  845. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/template.erb +1 -0
  846. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/update_element_with_capture.erb +9 -0
  847. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  848. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  849. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/test/utf8.html.erb +2 -0
  850. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/topic.rb +3 -0
  851. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/topics/_topic.html.erb +1 -0
  852. data/src/admin_panel/vendor/rails/actionpack/test/fixtures/topics.yml +22 -0
  853. data/src/admin_panel/vendor/rails/actionpack/test/template/active_record_helper_i18n_test.rb +44 -0
  854. data/src/admin_panel/vendor/rails/actionpack/test/template/active_record_helper_test.rb +302 -0
  855. data/src/admin_panel/vendor/rails/actionpack/test/template/asset_tag_helper_test.rb +713 -0
  856. data/src/admin_panel/vendor/rails/actionpack/test/template/atom_feed_helper_test.rb +286 -0
  857. data/src/admin_panel/vendor/rails/actionpack/test/template/benchmark_helper_test.rb +86 -0
  858. data/src/admin_panel/vendor/rails/actionpack/test/template/compiled_templates_test.rb +203 -0
  859. data/src/admin_panel/vendor/rails/actionpack/test/template/date_helper_i18n_test.rb +120 -0
  860. data/src/admin_panel/vendor/rails/actionpack/test/template/date_helper_test.rb +2469 -0
  861. data/src/admin_panel/vendor/rails/actionpack/test/template/erb_util_test.rb +24 -0
  862. data/src/admin_panel/vendor/rails/actionpack/test/template/form_helper_test.rb +1176 -0
  863. data/src/admin_panel/vendor/rails/actionpack/test/template/form_options_helper_test.rb +751 -0
  864. data/src/admin_panel/vendor/rails/actionpack/test/template/form_tag_helper_test.rb +327 -0
  865. data/src/admin_panel/vendor/rails/actionpack/test/template/javascript_helper_test.rb +106 -0
  866. data/src/admin_panel/vendor/rails/actionpack/test/template/number_helper_i18n_test.rb +69 -0
  867. data/src/admin_panel/vendor/rails/actionpack/test/template/number_helper_test.rb +128 -0
  868. data/src/admin_panel/vendor/rails/actionpack/test/template/prototype_helper_test.rb +639 -0
  869. data/src/admin_panel/vendor/rails/actionpack/test/template/record_tag_helper_test.rb +58 -0
  870. data/src/admin_panel/vendor/rails/actionpack/test/template/render_test.rb +290 -0
  871. data/src/admin_panel/vendor/rails/actionpack/test/template/sanitize_helper_test.rb +48 -0
  872. data/src/admin_panel/vendor/rails/actionpack/test/template/scriptaculous_helper_test.rb +90 -0
  873. data/src/admin_panel/vendor/rails/actionpack/test/template/tag_helper_test.rb +97 -0
  874. data/src/admin_panel/vendor/rails/actionpack/test/template/test_test.rb +54 -0
  875. data/src/admin_panel/vendor/rails/actionpack/test/template/text_helper_test.rb +520 -0
  876. data/src/admin_panel/vendor/rails/actionpack/test/template/translation_helper_test.rb +32 -0
  877. data/src/admin_panel/vendor/rails/actionpack/test/template/url_helper_test.rb +614 -0
  878. data/src/admin_panel/vendor/rails/actionpack/test/testing_sandbox.rb +15 -0
  879. data/src/admin_panel/vendor/rails/actionpack/test/view/test_case_test.rb +8 -0
  880. data/src/admin_panel/vendor/rails/activerecord/CHANGELOG +5832 -0
  881. data/src/admin_panel/vendor/rails/activerecord/README +351 -0
  882. data/src/admin_panel/vendor/rails/activerecord/RUNNING_UNIT_TESTS +36 -0
  883. data/src/admin_panel/vendor/rails/activerecord/Rakefile +253 -0
  884. data/src/admin_panel/vendor/rails/activerecord/examples/associations.png +0 -0
  885. data/src/admin_panel/vendor/rails/activerecord/install.rb +30 -0
  886. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/aggregations.rb +261 -0
  887. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/association_preload.rb +389 -0
  888. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb +470 -0
  889. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb +279 -0
  890. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/associations/belongs_to_association.rb +58 -0
  891. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb +49 -0
  892. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +127 -0
  893. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/associations/has_many_association.rb +121 -0
  894. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb +256 -0
  895. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/associations/has_one_association.rb +124 -0
  896. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/associations/has_one_through_association.rb +31 -0
  897. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/associations.rb +2169 -0
  898. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/attribute_methods.rb +388 -0
  899. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/autosave_association.rb +349 -0
  900. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/base.rb +3155 -0
  901. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/batches.rb +73 -0
  902. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/calculations.rb +317 -0
  903. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/callbacks.rb +360 -0
  904. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb +371 -0
  905. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_specification.rb +139 -0
  906. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb +289 -0
  907. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb +94 -0
  908. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb +69 -0
  909. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +708 -0
  910. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +434 -0
  911. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +234 -0
  912. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +617 -0
  913. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +1050 -0
  914. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb +34 -0
  915. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +438 -0
  916. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/dirty.rb +183 -0
  917. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/dynamic_finder_match.rb +41 -0
  918. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/dynamic_scope_match.rb +25 -0
  919. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/fixtures.rb +993 -0
  920. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/i18n_interpolation_deprecation.rb +26 -0
  921. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/locale/en.yml +54 -0
  922. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/locking/optimistic.rb +181 -0
  923. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/locking/pessimistic.rb +77 -0
  924. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/migration.rb +566 -0
  925. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/named_scope.rb +197 -0
  926. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/nested_attributes.rb +329 -0
  927. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/observer.rb +197 -0
  928. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/query_cache.rb +33 -0
  929. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/reflection.rb +320 -0
  930. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/schema.rb +51 -0
  931. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/schema_dumper.rb +179 -0
  932. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/serialization.rb +100 -0
  933. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/serializers/json_serializer.rb +99 -0
  934. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/serializers/xml_serializer.rb +353 -0
  935. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/session_store.rb +318 -0
  936. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/test_case.rb +66 -0
  937. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/timestamp.rb +41 -0
  938. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/transactions.rb +235 -0
  939. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/validations.rb +1066 -0
  940. data/src/admin_panel/vendor/rails/activerecord/lib/active_record/version.rb +9 -0
  941. data/src/admin_panel/vendor/rails/activerecord/lib/active_record.rb +84 -0
  942. data/src/admin_panel/vendor/rails/activerecord/lib/activerecord.rb +1 -0
  943. data/src/admin_panel/vendor/rails/activerecord/test/assets/flowers.jpg +0 -0
  944. data/src/admin_panel/vendor/rails/activerecord/test/cases/aaa_create_tables_test.rb +24 -0
  945. data/src/admin_panel/vendor/rails/activerecord/test/cases/active_schema_test_mysql.rb +100 -0
  946. data/src/admin_panel/vendor/rails/activerecord/test/cases/active_schema_test_postgresql.rb +24 -0
  947. data/src/admin_panel/vendor/rails/activerecord/test/cases/adapter_test.rb +133 -0
  948. data/src/admin_panel/vendor/rails/activerecord/test/cases/aggregations_test.rb +167 -0
  949. data/src/admin_panel/vendor/rails/activerecord/test/cases/ar_schema_test.rb +32 -0
  950. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/belongs_to_associations_test.rb +345 -0
  951. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/callbacks_test.rb +161 -0
  952. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/cascaded_eager_loading_test.rb +131 -0
  953. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -0
  954. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/eager_load_nested_include_test.rb +130 -0
  955. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/eager_singularization_test.rb +145 -0
  956. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/eager_test.rb +822 -0
  957. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/extension_test.rb +62 -0
  958. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/has_and_belongs_to_many_associations_test.rb +822 -0
  959. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/has_many_associations_test.rb +1062 -0
  960. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/has_many_through_associations_test.rb +279 -0
  961. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/has_one_associations_test.rb +309 -0
  962. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/has_one_through_associations_test.rb +192 -0
  963. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/inner_join_association_test.rb +88 -0
  964. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations/join_model_test.rb +712 -0
  965. data/src/admin_panel/vendor/rails/activerecord/test/cases/associations_test.rb +262 -0
  966. data/src/admin_panel/vendor/rails/activerecord/test/cases/attribute_methods_test.rb +305 -0
  967. data/src/admin_panel/vendor/rails/activerecord/test/cases/autosave_association_test.rb +901 -0
  968. data/src/admin_panel/vendor/rails/activerecord/test/cases/base_test.rb +2107 -0
  969. data/src/admin_panel/vendor/rails/activerecord/test/cases/batches_test.rb +61 -0
  970. data/src/admin_panel/vendor/rails/activerecord/test/cases/binary_test.rb +30 -0
  971. data/src/admin_panel/vendor/rails/activerecord/test/cases/calculations_test.rb +348 -0
  972. data/src/admin_panel/vendor/rails/activerecord/test/cases/callbacks_observers_test.rb +38 -0
  973. data/src/admin_panel/vendor/rails/activerecord/test/cases/callbacks_test.rb +438 -0
  974. data/src/admin_panel/vendor/rails/activerecord/test/cases/class_inheritable_attributes_test.rb +32 -0
  975. data/src/admin_panel/vendor/rails/activerecord/test/cases/column_alias_test.rb +17 -0
  976. data/src/admin_panel/vendor/rails/activerecord/test/cases/column_definition_test.rb +36 -0
  977. data/src/admin_panel/vendor/rails/activerecord/test/cases/connection_pool_test.rb +25 -0
  978. data/src/admin_panel/vendor/rails/activerecord/test/cases/connection_test_firebird.rb +8 -0
  979. data/src/admin_panel/vendor/rails/activerecord/test/cases/connection_test_mysql.rb +56 -0
  980. data/src/admin_panel/vendor/rails/activerecord/test/cases/copy_table_test_sqlite.rb +80 -0
  981. data/src/admin_panel/vendor/rails/activerecord/test/cases/database_statements_test.rb +12 -0
  982. data/src/admin_panel/vendor/rails/activerecord/test/cases/datatype_test_postgresql.rb +204 -0
  983. data/src/admin_panel/vendor/rails/activerecord/test/cases/date_time_test.rb +37 -0
  984. data/src/admin_panel/vendor/rails/activerecord/test/cases/default_test_firebird.rb +16 -0
  985. data/src/admin_panel/vendor/rails/activerecord/test/cases/defaults_test.rb +111 -0
  986. data/src/admin_panel/vendor/rails/activerecord/test/cases/deprecated_finder_test.rb +30 -0
  987. data/src/admin_panel/vendor/rails/activerecord/test/cases/dirty_test.rb +306 -0
  988. data/src/admin_panel/vendor/rails/activerecord/test/cases/finder_respond_to_test.rb +76 -0
  989. data/src/admin_panel/vendor/rails/activerecord/test/cases/finder_test.rb +1083 -0
  990. data/src/admin_panel/vendor/rails/activerecord/test/cases/fixtures_test.rb +651 -0
  991. data/src/admin_panel/vendor/rails/activerecord/test/cases/helper.rb +69 -0
  992. data/src/admin_panel/vendor/rails/activerecord/test/cases/i18n_test.rb +41 -0
  993. data/src/admin_panel/vendor/rails/activerecord/test/cases/inheritance_test.rb +262 -0
  994. data/src/admin_panel/vendor/rails/activerecord/test/cases/invalid_date_test.rb +24 -0
  995. data/src/admin_panel/vendor/rails/activerecord/test/cases/json_serialization_test.rb +205 -0
  996. data/src/admin_panel/vendor/rails/activerecord/test/cases/lifecycle_test.rb +193 -0
  997. data/src/admin_panel/vendor/rails/activerecord/test/cases/locking_test.rb +322 -0
  998. data/src/admin_panel/vendor/rails/activerecord/test/cases/method_scoping_test.rb +694 -0
  999. data/src/admin_panel/vendor/rails/activerecord/test/cases/migration_test.rb +1495 -0
  1000. data/src/admin_panel/vendor/rails/activerecord/test/cases/migration_test_firebird.rb +124 -0
  1001. data/src/admin_panel/vendor/rails/activerecord/test/cases/mixin_test.rb +96 -0
  1002. data/src/admin_panel/vendor/rails/activerecord/test/cases/modules_test.rb +39 -0
  1003. data/src/admin_panel/vendor/rails/activerecord/test/cases/multiple_db_test.rb +85 -0
  1004. data/src/admin_panel/vendor/rails/activerecord/test/cases/named_scope_test.rb +359 -0
  1005. data/src/admin_panel/vendor/rails/activerecord/test/cases/nested_attributes_test.rb +509 -0
  1006. data/src/admin_panel/vendor/rails/activerecord/test/cases/pk_test.rb +101 -0
  1007. data/src/admin_panel/vendor/rails/activerecord/test/cases/pooled_connections_test.rb +103 -0
  1008. data/src/admin_panel/vendor/rails/activerecord/test/cases/query_cache_test.rb +123 -0
  1009. data/src/admin_panel/vendor/rails/activerecord/test/cases/readonly_test.rb +107 -0
  1010. data/src/admin_panel/vendor/rails/activerecord/test/cases/reflection_test.rb +194 -0
  1011. data/src/admin_panel/vendor/rails/activerecord/test/cases/reload_models_test.rb +22 -0
  1012. data/src/admin_panel/vendor/rails/activerecord/test/cases/repair_helper.rb +50 -0
  1013. data/src/admin_panel/vendor/rails/activerecord/test/cases/reserved_word_test_mysql.rb +176 -0
  1014. data/src/admin_panel/vendor/rails/activerecord/test/cases/sanitize_test.rb +25 -0
  1015. data/src/admin_panel/vendor/rails/activerecord/test/cases/schema_authorization_test_postgresql.rb +75 -0
  1016. data/src/admin_panel/vendor/rails/activerecord/test/cases/schema_dumper_test.rb +183 -0
  1017. data/src/admin_panel/vendor/rails/activerecord/test/cases/schema_test_postgresql.rb +102 -0
  1018. data/src/admin_panel/vendor/rails/activerecord/test/cases/serialization_test.rb +47 -0
  1019. data/src/admin_panel/vendor/rails/activerecord/test/cases/synonym_test_oracle.rb +17 -0
  1020. data/src/admin_panel/vendor/rails/activerecord/test/cases/transactions_test.rb +522 -0
  1021. data/src/admin_panel/vendor/rails/activerecord/test/cases/unconnected_test.rb +32 -0
  1022. data/src/admin_panel/vendor/rails/activerecord/test/cases/validations_i18n_test.rb +915 -0
  1023. data/src/admin_panel/vendor/rails/activerecord/test/cases/validations_test.rb +1602 -0
  1024. data/src/admin_panel/vendor/rails/activerecord/test/cases/xml_serialization_test.rb +220 -0
  1025. data/src/admin_panel/vendor/rails/activerecord/test/config.rb +5 -0
  1026. data/src/admin_panel/vendor/rails/activerecord/test/connections/jdbc_jdbcderby/connection.rb +18 -0
  1027. data/src/admin_panel/vendor/rails/activerecord/test/connections/jdbc_jdbch2/connection.rb +18 -0
  1028. data/src/admin_panel/vendor/rails/activerecord/test/connections/jdbc_jdbchsqldb/connection.rb +18 -0
  1029. data/src/admin_panel/vendor/rails/activerecord/test/connections/jdbc_jdbcmysql/connection.rb +26 -0
  1030. data/src/admin_panel/vendor/rails/activerecord/test/connections/jdbc_jdbcpostgresql/connection.rb +26 -0
  1031. data/src/admin_panel/vendor/rails/activerecord/test/connections/jdbc_jdbcsqlite3/connection.rb +25 -0
  1032. data/src/admin_panel/vendor/rails/activerecord/test/connections/native_db2/connection.rb +25 -0
  1033. data/src/admin_panel/vendor/rails/activerecord/test/connections/native_firebird/connection.rb +26 -0
  1034. data/src/admin_panel/vendor/rails/activerecord/test/connections/native_frontbase/connection.rb +27 -0
  1035. data/src/admin_panel/vendor/rails/activerecord/test/connections/native_mysql/connection.rb +25 -0
  1036. data/src/admin_panel/vendor/rails/activerecord/test/connections/native_openbase/connection.rb +21 -0
  1037. data/src/admin_panel/vendor/rails/activerecord/test/connections/native_oracle/connection.rb +27 -0
  1038. data/src/admin_panel/vendor/rails/activerecord/test/connections/native_postgresql/connection.rb +21 -0
  1039. data/src/admin_panel/vendor/rails/activerecord/test/connections/native_sqlite/connection.rb +25 -0
  1040. data/src/admin_panel/vendor/rails/activerecord/test/connections/native_sqlite3/connection.rb +25 -0
  1041. data/src/admin_panel/vendor/rails/activerecord/test/connections/native_sqlite3/in_memory_connection.rb +18 -0
  1042. data/src/admin_panel/vendor/rails/activerecord/test/connections/native_sybase/connection.rb +23 -0
  1043. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/accounts.yml +28 -0
  1044. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/all/developers.yml +0 -0
  1045. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/all/people.csv +0 -0
  1046. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/all/tasks.yml +0 -0
  1047. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/author_addresses.yml +5 -0
  1048. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/author_favorites.yml +4 -0
  1049. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/authors.yml +9 -0
  1050. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/binaries.yml +132 -0
  1051. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/books.yml +7 -0
  1052. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/categories/special_categories.yml +9 -0
  1053. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  1054. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/categories.yml +14 -0
  1055. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/categories_ordered.yml +7 -0
  1056. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/categories_posts.yml +23 -0
  1057. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/categorizations.yml +17 -0
  1058. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/clubs.yml +6 -0
  1059. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/comments.yml +59 -0
  1060. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/companies.yml +56 -0
  1061. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/computers.yml +4 -0
  1062. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/courses.yml +7 -0
  1063. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/customers.yml +26 -0
  1064. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/developers.yml +21 -0
  1065. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/developers_projects.yml +17 -0
  1066. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/edges.yml +6 -0
  1067. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/entrants.yml +14 -0
  1068. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite3 +0 -0
  1069. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite3 +0 -0
  1070. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/fk_test_has_fk.yml +3 -0
  1071. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/fk_test_has_pk.yml +2 -0
  1072. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/funny_jokes.yml +10 -0
  1073. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/items.yml +4 -0
  1074. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/jobs.yml +7 -0
  1075. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/legacy_things.yml +3 -0
  1076. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/mateys.yml +4 -0
  1077. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/member_types.yml +6 -0
  1078. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/members.yml +6 -0
  1079. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/memberships.yml +20 -0
  1080. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/minimalistics.yml +2 -0
  1081. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/mixed_case_monkeys.yml +6 -0
  1082. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/mixins.yml +29 -0
  1083. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/movies.yml +7 -0
  1084. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/naked/csv/accounts.csv +1 -0
  1085. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/naked/yml/accounts.yml +1 -0
  1086. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/naked/yml/companies.yml +1 -0
  1087. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/naked/yml/courses.yml +1 -0
  1088. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/organizations.yml +5 -0
  1089. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/owners.yml +7 -0
  1090. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/parrots.yml +27 -0
  1091. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/parrots_pirates.yml +7 -0
  1092. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/people.yml +15 -0
  1093. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/pets.yml +14 -0
  1094. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/pirates.yml +9 -0
  1095. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/posts.yml +49 -0
  1096. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/price_estimates.yml +7 -0
  1097. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/projects.yml +7 -0
  1098. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/readers.yml +9 -0
  1099. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/references.yml +17 -0
  1100. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/reserved_words/distinct.yml +5 -0
  1101. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/reserved_words/distincts_selects.yml +11 -0
  1102. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/reserved_words/group.yml +14 -0
  1103. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/reserved_words/select.yml +8 -0
  1104. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/reserved_words/values.yml +7 -0
  1105. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/ships.yml +5 -0
  1106. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/sponsors.yml +9 -0
  1107. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/subscribers.yml +7 -0
  1108. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/subscriptions.yml +12 -0
  1109. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/taggings.yml +28 -0
  1110. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/tags.yml +7 -0
  1111. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/tasks.yml +7 -0
  1112. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/topics.yml +42 -0
  1113. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/toys.yml +4 -0
  1114. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/treasures.yml +10 -0
  1115. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/vertices.yml +4 -0
  1116. data/src/admin_panel/vendor/rails/activerecord/test/fixtures/warehouse-things.yml +3 -0
  1117. data/src/admin_panel/vendor/rails/activerecord/test/migrations/broken/100_migration_that_raises_exception.rb +10 -0
  1118. data/src/admin_panel/vendor/rails/activerecord/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
  1119. data/src/admin_panel/vendor/rails/activerecord/test/migrations/duplicate/1_people_have_last_names.rb +9 -0
  1120. data/src/admin_panel/vendor/rails/activerecord/test/migrations/duplicate/2_we_need_reminders.rb +12 -0
  1121. data/src/admin_panel/vendor/rails/activerecord/test/migrations/duplicate/3_foo.rb +7 -0
  1122. data/src/admin_panel/vendor/rails/activerecord/test/migrations/duplicate/3_innocent_jointable.rb +12 -0
  1123. data/src/admin_panel/vendor/rails/activerecord/test/migrations/duplicate_names/20080507052938_chunky.rb +7 -0
  1124. data/src/admin_panel/vendor/rails/activerecord/test/migrations/duplicate_names/20080507053028_chunky.rb +7 -0
  1125. data/src/admin_panel/vendor/rails/activerecord/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +12 -0
  1126. data/src/admin_panel/vendor/rails/activerecord/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +9 -0
  1127. data/src/admin_panel/vendor/rails/activerecord/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +12 -0
  1128. data/src/admin_panel/vendor/rails/activerecord/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +9 -0
  1129. data/src/admin_panel/vendor/rails/activerecord/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +8 -0
  1130. data/src/admin_panel/vendor/rails/activerecord/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +12 -0
  1131. data/src/admin_panel/vendor/rails/activerecord/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
  1132. data/src/admin_panel/vendor/rails/activerecord/test/migrations/missing/1_people_have_last_names.rb +9 -0
  1133. data/src/admin_panel/vendor/rails/activerecord/test/migrations/missing/3_we_need_reminders.rb +12 -0
  1134. data/src/admin_panel/vendor/rails/activerecord/test/migrations/missing/4_innocent_jointable.rb +12 -0
  1135. data/src/admin_panel/vendor/rails/activerecord/test/migrations/valid/1_people_have_last_names.rb +9 -0
  1136. data/src/admin_panel/vendor/rails/activerecord/test/migrations/valid/2_we_need_reminders.rb +12 -0
  1137. data/src/admin_panel/vendor/rails/activerecord/test/migrations/valid/3_innocent_jointable.rb +12 -0
  1138. data/src/admin_panel/vendor/rails/activerecord/test/models/author.rb +141 -0
  1139. data/src/admin_panel/vendor/rails/activerecord/test/models/auto_id.rb +4 -0
  1140. data/src/admin_panel/vendor/rails/activerecord/test/models/binary.rb +2 -0
  1141. data/src/admin_panel/vendor/rails/activerecord/test/models/bird.rb +3 -0
  1142. data/src/admin_panel/vendor/rails/activerecord/test/models/book.rb +4 -0
  1143. data/src/admin_panel/vendor/rails/activerecord/test/models/categorization.rb +5 -0
  1144. data/src/admin_panel/vendor/rails/activerecord/test/models/category.rb +34 -0
  1145. data/src/admin_panel/vendor/rails/activerecord/test/models/citation.rb +6 -0
  1146. data/src/admin_panel/vendor/rails/activerecord/test/models/club.rb +13 -0
  1147. data/src/admin_panel/vendor/rails/activerecord/test/models/column_name.rb +3 -0
  1148. data/src/admin_panel/vendor/rails/activerecord/test/models/comment.rb +25 -0
  1149. data/src/admin_panel/vendor/rails/activerecord/test/models/company.rb +159 -0
  1150. data/src/admin_panel/vendor/rails/activerecord/test/models/company_in_module.rb +61 -0
  1151. data/src/admin_panel/vendor/rails/activerecord/test/models/computer.rb +3 -0
  1152. data/src/admin_panel/vendor/rails/activerecord/test/models/contact.rb +16 -0
  1153. data/src/admin_panel/vendor/rails/activerecord/test/models/course.rb +3 -0
  1154. data/src/admin_panel/vendor/rails/activerecord/test/models/customer.rb +73 -0
  1155. data/src/admin_panel/vendor/rails/activerecord/test/models/default.rb +2 -0
  1156. data/src/admin_panel/vendor/rails/activerecord/test/models/developer.rb +91 -0
  1157. data/src/admin_panel/vendor/rails/activerecord/test/models/edge.rb +5 -0
  1158. data/src/admin_panel/vendor/rails/activerecord/test/models/entrant.rb +3 -0
  1159. data/src/admin_panel/vendor/rails/activerecord/test/models/event.rb +3 -0
  1160. data/src/admin_panel/vendor/rails/activerecord/test/models/guid.rb +2 -0
  1161. data/src/admin_panel/vendor/rails/activerecord/test/models/item.rb +7 -0
  1162. data/src/admin_panel/vendor/rails/activerecord/test/models/job.rb +5 -0
  1163. data/src/admin_panel/vendor/rails/activerecord/test/models/joke.rb +3 -0
  1164. data/src/admin_panel/vendor/rails/activerecord/test/models/keyboard.rb +3 -0
  1165. data/src/admin_panel/vendor/rails/activerecord/test/models/legacy_thing.rb +3 -0
  1166. data/src/admin_panel/vendor/rails/activerecord/test/models/matey.rb +4 -0
  1167. data/src/admin_panel/vendor/rails/activerecord/test/models/member.rb +12 -0
  1168. data/src/admin_panel/vendor/rails/activerecord/test/models/member_detail.rb +5 -0
  1169. data/src/admin_panel/vendor/rails/activerecord/test/models/member_type.rb +3 -0
  1170. data/src/admin_panel/vendor/rails/activerecord/test/models/membership.rb +9 -0
  1171. data/src/admin_panel/vendor/rails/activerecord/test/models/minimalistic.rb +2 -0
  1172. data/src/admin_panel/vendor/rails/activerecord/test/models/mixed_case_monkey.rb +3 -0
  1173. data/src/admin_panel/vendor/rails/activerecord/test/models/movie.rb +5 -0
  1174. data/src/admin_panel/vendor/rails/activerecord/test/models/order.rb +4 -0
  1175. data/src/admin_panel/vendor/rails/activerecord/test/models/organization.rb +4 -0
  1176. data/src/admin_panel/vendor/rails/activerecord/test/models/owner.rb +5 -0
  1177. data/src/admin_panel/vendor/rails/activerecord/test/models/parrot.rb +16 -0
  1178. data/src/admin_panel/vendor/rails/activerecord/test/models/person.rb +16 -0
  1179. data/src/admin_panel/vendor/rails/activerecord/test/models/pet.rb +5 -0
  1180. data/src/admin_panel/vendor/rails/activerecord/test/models/pirate.rb +63 -0
  1181. data/src/admin_panel/vendor/rails/activerecord/test/models/post.rb +100 -0
  1182. data/src/admin_panel/vendor/rails/activerecord/test/models/price_estimate.rb +3 -0
  1183. data/src/admin_panel/vendor/rails/activerecord/test/models/project.rb +30 -0
  1184. data/src/admin_panel/vendor/rails/activerecord/test/models/reader.rb +4 -0
  1185. data/src/admin_panel/vendor/rails/activerecord/test/models/reference.rb +4 -0
  1186. data/src/admin_panel/vendor/rails/activerecord/test/models/reply.rb +45 -0
  1187. data/src/admin_panel/vendor/rails/activerecord/test/models/ship.rb +10 -0
  1188. data/src/admin_panel/vendor/rails/activerecord/test/models/ship_part.rb +5 -0
  1189. data/src/admin_panel/vendor/rails/activerecord/test/models/sponsor.rb +4 -0
  1190. data/src/admin_panel/vendor/rails/activerecord/test/models/subject.rb +4 -0
  1191. data/src/admin_panel/vendor/rails/activerecord/test/models/subscriber.rb +8 -0
  1192. data/src/admin_panel/vendor/rails/activerecord/test/models/subscription.rb +4 -0
  1193. data/src/admin_panel/vendor/rails/activerecord/test/models/tag.rb +7 -0
  1194. data/src/admin_panel/vendor/rails/activerecord/test/models/tagging.rb +10 -0
  1195. data/src/admin_panel/vendor/rails/activerecord/test/models/task.rb +3 -0
  1196. data/src/admin_panel/vendor/rails/activerecord/test/models/topic.rb +81 -0
  1197. data/src/admin_panel/vendor/rails/activerecord/test/models/toy.rb +4 -0
  1198. data/src/admin_panel/vendor/rails/activerecord/test/models/treasure.rb +6 -0
  1199. data/src/admin_panel/vendor/rails/activerecord/test/models/vertex.rb +9 -0
  1200. data/src/admin_panel/vendor/rails/activerecord/test/models/warehouse_thing.rb +5 -0
  1201. data/src/admin_panel/vendor/rails/activerecord/test/schema/mysql_specific_schema.rb +12 -0
  1202. data/src/admin_panel/vendor/rails/activerecord/test/schema/postgresql_specific_schema.rb +103 -0
  1203. data/src/admin_panel/vendor/rails/activerecord/test/schema/schema.rb +473 -0
  1204. data/src/admin_panel/vendor/rails/activerecord/test/schema/schema2.rb +6 -0
  1205. data/src/admin_panel/vendor/rails/activerecord/test/schema/sqlite_specific_schema.rb +25 -0
  1206. data/src/admin_panel/vendor/rails/activeresource/CHANGELOG +267 -0
  1207. data/src/admin_panel/vendor/rails/activeresource/README +165 -0
  1208. data/src/admin_panel/vendor/rails/activeresource/Rakefile +138 -0
  1209. data/src/admin_panel/vendor/rails/activeresource/lib/active_resource/base.rb +1077 -0
  1210. data/src/admin_panel/vendor/rails/activeresource/lib/active_resource/connection.rb +218 -0
  1211. data/src/admin_panel/vendor/rails/activeresource/lib/active_resource/custom_methods.rb +120 -0
  1212. data/src/admin_panel/vendor/rails/activeresource/lib/active_resource/formats/json_format.rb +23 -0
  1213. data/src/admin_panel/vendor/rails/activeresource/lib/active_resource/formats/xml_format.rb +34 -0
  1214. data/src/admin_panel/vendor/rails/activeresource/lib/active_resource/formats.rb +14 -0
  1215. data/src/admin_panel/vendor/rails/activeresource/lib/active_resource/http_mock.rb +207 -0
  1216. data/src/admin_panel/vendor/rails/activeresource/lib/active_resource/validations.rb +274 -0
  1217. data/src/admin_panel/vendor/rails/activeresource/lib/active_resource/version.rb +9 -0
  1218. data/src/admin_panel/vendor/rails/activeresource/lib/active_resource.rb +44 -0
  1219. data/src/admin_panel/vendor/rails/activeresource/lib/activeresource.rb +1 -0
  1220. data/src/admin_panel/vendor/rails/activeresource/test/abstract_unit.rb +23 -0
  1221. data/src/admin_panel/vendor/rails/activeresource/test/authorization_test.rb +122 -0
  1222. data/src/admin_panel/vendor/rails/activeresource/test/base/custom_methods_test.rb +100 -0
  1223. data/src/admin_panel/vendor/rails/activeresource/test/base/equality_test.rb +52 -0
  1224. data/src/admin_panel/vendor/rails/activeresource/test/base/load_test.rb +146 -0
  1225. data/src/admin_panel/vendor/rails/activeresource/test/base_errors_test.rb +48 -0
  1226. data/src/admin_panel/vendor/rails/activeresource/test/base_test.rb +891 -0
  1227. data/src/admin_panel/vendor/rails/activeresource/test/connection_test.rb +196 -0
  1228. data/src/admin_panel/vendor/rails/activeresource/test/fixtures/beast.rb +14 -0
  1229. data/src/admin_panel/vendor/rails/activeresource/test/fixtures/customer.rb +3 -0
  1230. data/src/admin_panel/vendor/rails/activeresource/test/fixtures/person.rb +3 -0
  1231. data/src/admin_panel/vendor/rails/activeresource/test/fixtures/street_address.rb +4 -0
  1232. data/src/admin_panel/vendor/rails/activeresource/test/format_test.rb +112 -0
  1233. data/src/admin_panel/vendor/rails/activeresource/test/setter_trap.rb +26 -0
  1234. data/src/admin_panel/vendor/rails/activesupport/CHANGELOG +1309 -0
  1235. data/src/admin_panel/vendor/rails/activesupport/README +43 -0
  1236. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/backtrace_cleaner.rb +72 -0
  1237. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/base64.rb +33 -0
  1238. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/basic_object.rb +24 -0
  1239. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/buffered_logger.rb +127 -0
  1240. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/cache/compressed_mem_cache_store.rb +20 -0
  1241. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/cache/drb_store.rb +14 -0
  1242. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/cache/file_store.rb +72 -0
  1243. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/cache/mem_cache_store.rb +132 -0
  1244. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/cache/memory_store.rb +52 -0
  1245. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb +104 -0
  1246. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/cache/synchronized_memory_store.rb +47 -0
  1247. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/cache.rb +228 -0
  1248. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/callbacks.rb +279 -0
  1249. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/array/access.rb +53 -0
  1250. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/array/conversions.rb +196 -0
  1251. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/array/extract_options.rb +20 -0
  1252. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/array/grouping.rb +106 -0
  1253. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/array/random_access.rb +12 -0
  1254. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/array/wrapper.rb +24 -0
  1255. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/array.rb +15 -0
  1256. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/base64/encoding.rb +16 -0
  1257. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/base64.rb +4 -0
  1258. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb +19 -0
  1259. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb +37 -0
  1260. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/bigdecimal.rb +6 -0
  1261. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/blank.rb +58 -0
  1262. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +23 -0
  1263. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/cgi.rb +5 -0
  1264. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb +54 -0
  1265. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/class/delegating_attributes.rb +47 -0
  1266. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb +140 -0
  1267. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/class/removal.rb +50 -0
  1268. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/class.rb +4 -0
  1269. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/date/behavior.rb +42 -0
  1270. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/date/calculations.rb +230 -0
  1271. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/date/conversions.rb +107 -0
  1272. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/date.rb +10 -0
  1273. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/date_time/calculations.rb +126 -0
  1274. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/date_time/conversions.rb +96 -0
  1275. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/date_time.rb +12 -0
  1276. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/duplicable.rb +43 -0
  1277. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/enumerable.rb +116 -0
  1278. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/exception.rb +45 -0
  1279. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/file/atomic.rb +46 -0
  1280. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/file.rb +5 -0
  1281. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/float/rounding.rb +24 -0
  1282. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/float/time.rb +27 -0
  1283. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/float.rb +7 -0
  1284. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb +237 -0
  1285. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/hash/deep_merge.rb +23 -0
  1286. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/hash/diff.rb +19 -0
  1287. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/hash/except.rb +25 -0
  1288. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb +143 -0
  1289. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/hash/keys.rb +52 -0
  1290. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/hash/reverse_merge.rb +35 -0
  1291. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/hash/slice.rb +40 -0
  1292. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/hash.rb +14 -0
  1293. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/integer/even_odd.rb +29 -0
  1294. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/integer/inflections.rb +20 -0
  1295. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/integer/time.rb +45 -0
  1296. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/integer.rb +9 -0
  1297. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/kernel/agnostics.rb +11 -0
  1298. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/kernel/daemonizing.rb +7 -0
  1299. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/kernel/debugger.rb +13 -0
  1300. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/kernel/reporting.rb +59 -0
  1301. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/kernel/requires.rb +24 -0
  1302. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/kernel.rb +5 -0
  1303. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/load_error.rb +38 -0
  1304. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/logger.rb +145 -0
  1305. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/module/aliasing.rb +74 -0
  1306. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/module/attr_accessor_with_default.rb +31 -0
  1307. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/module/attr_internal.rb +32 -0
  1308. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb +58 -0
  1309. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/module/delegation.rb +121 -0
  1310. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/module/inclusion.rb +30 -0
  1311. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/module/introspection.rb +90 -0
  1312. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/module/loading.rb +23 -0
  1313. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/module/model_naming.rb +23 -0
  1314. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/module/synchronization.rb +39 -0
  1315. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/module.rb +23 -0
  1316. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/name_error.rb +17 -0
  1317. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/numeric/bytes.rb +44 -0
  1318. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/numeric/conversions.rb +19 -0
  1319. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/numeric/time.rb +81 -0
  1320. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/numeric.rb +9 -0
  1321. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/object/conversions.rb +15 -0
  1322. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/object/extending.rb +80 -0
  1323. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/object/instance_variables.rb +74 -0
  1324. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/object/metaclass.rb +13 -0
  1325. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/object/misc.rb +90 -0
  1326. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/object.rb +5 -0
  1327. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/pathname/clean_within.rb +14 -0
  1328. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/pathname.rb +7 -0
  1329. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/proc.rb +12 -0
  1330. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/process/daemon.rb +25 -0
  1331. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/process.rb +1 -0
  1332. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/range/blockless_step.rb +32 -0
  1333. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/range/conversions.rb +27 -0
  1334. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/range/include_range.rb +30 -0
  1335. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/range/overlaps.rb +15 -0
  1336. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/range.rb +11 -0
  1337. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/rexml.rb +41 -0
  1338. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/string/access.rb +82 -0
  1339. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/string/behavior.rb +13 -0
  1340. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/string/conversions.rb +28 -0
  1341. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/string/filters.rb +26 -0
  1342. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/string/inflections.rb +167 -0
  1343. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/string/iterators.rb +23 -0
  1344. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/string/multibyte.rb +81 -0
  1345. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/string/starts_ends_with.rb +35 -0
  1346. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/string/xchar.rb +11 -0
  1347. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/string.rb +22 -0
  1348. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/symbol.rb +14 -0
  1349. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/time/behavior.rb +13 -0
  1350. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/time/calculations.rb +303 -0
  1351. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/time/conversions.rb +90 -0
  1352. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/time/zones.rb +86 -0
  1353. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/time.rb +42 -0
  1354. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/try.rb +36 -0
  1355. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext/uri.rb +16 -0
  1356. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/core_ext.rb +4 -0
  1357. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/dependencies.rb +625 -0
  1358. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/deprecation.rb +196 -0
  1359. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/duration.rb +98 -0
  1360. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/gzip.rb +25 -0
  1361. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/inflections.rb +56 -0
  1362. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/inflector.rb +406 -0
  1363. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/decoding.rb +82 -0
  1364. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/date.rb +21 -0
  1365. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/date_time.rb +21 -0
  1366. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/enumerable.rb +12 -0
  1367. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/false_class.rb +5 -0
  1368. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/hash.rb +46 -0
  1369. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/nil_class.rb +5 -0
  1370. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/numeric.rb +5 -0
  1371. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/object.rb +6 -0
  1372. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/regexp.rb +5 -0
  1373. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/string.rb +36 -0
  1374. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/symbol.rb +5 -0
  1375. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/time.rb +21 -0
  1376. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoders/true_class.rb +5 -0
  1377. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/encoding.rb +31 -0
  1378. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json/variable.rb +10 -0
  1379. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/json.rb +23 -0
  1380. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/locale/en.yml +33 -0
  1381. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/memoizable.rb +100 -0
  1382. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/message_encryptor.rb +70 -0
  1383. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/message_verifier.rb +46 -0
  1384. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/multibyte/chars.rb +701 -0
  1385. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/multibyte/exceptions.rb +8 -0
  1386. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/multibyte/unicode_database.rb +71 -0
  1387. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/multibyte.rb +33 -0
  1388. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/option_merger.rb +23 -0
  1389. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/ordered_hash.rb +106 -0
  1390. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/ordered_options.rb +19 -0
  1391. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/rescuable.rb +108 -0
  1392. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/secure_random.rb +199 -0
  1393. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/string_inquirer.rb +21 -0
  1394. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/test_case.rb +39 -0
  1395. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/testing/assertions.rb +65 -0
  1396. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/testing/declarative.rb +21 -0
  1397. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/testing/default.rb +9 -0
  1398. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/testing/deprecation.rb +55 -0
  1399. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/testing/performance.rb +452 -0
  1400. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb +91 -0
  1401. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/time_with_zone.rb +334 -0
  1402. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/values/time_zone.rb +404 -0
  1403. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/values/unicode_tables.dat +0 -0
  1404. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/blankslate.rb +113 -0
  1405. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +20 -0
  1406. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/css.rb +250 -0
  1407. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +115 -0
  1408. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +139 -0
  1409. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +63 -0
  1410. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +328 -0
  1411. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder.rb +13 -0
  1412. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/MIT-LICENSE +20 -0
  1413. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/README.textile +20 -0
  1414. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/Rakefile +5 -0
  1415. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/i18n.gemspec +27 -0
  1416. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/lib/i18n/backend/simple.rb +214 -0
  1417. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/lib/i18n/exceptions.rb +53 -0
  1418. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/lib/i18n.rb +199 -0
  1419. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/all.rb +5 -0
  1420. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb +100 -0
  1421. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb +125 -0
  1422. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/locale/en.rb +1 -0
  1423. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/locale/en.yml +3 -0
  1424. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb +568 -0
  1425. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/memcache-client-1.6.5/memcache.rb +935 -0
  1426. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone.rb +47 -0
  1427. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone_info.rb +228 -0
  1428. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Algiers.rb +55 -0
  1429. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Cairo.rb +219 -0
  1430. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Casablanca.rb +40 -0
  1431. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Harare.rb +18 -0
  1432. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Johannesburg.rb +25 -0
  1433. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Monrovia.rb +22 -0
  1434. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Nairobi.rb +23 -0
  1435. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +166 -0
  1436. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/San_Juan.rb +86 -0
  1437. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Bogota.rb +23 -0
  1438. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Caracas.rb +23 -0
  1439. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chicago.rb +283 -0
  1440. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chihuahua.rb +136 -0
  1441. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Denver.rb +204 -0
  1442. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Godthab.rb +161 -0
  1443. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Guatemala.rb +27 -0
  1444. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Halifax.rb +274 -0
  1445. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Indiana/Indianapolis.rb +149 -0
  1446. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Juneau.rb +194 -0
  1447. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/La_Paz.rb +22 -0
  1448. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Lima.rb +35 -0
  1449. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Los_Angeles.rb +232 -0
  1450. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mazatlan.rb +139 -0
  1451. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mexico_City.rb +144 -0
  1452. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Monterrey.rb +131 -0
  1453. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/New_York.rb +282 -0
  1454. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Phoenix.rb +30 -0
  1455. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Regina.rb +74 -0
  1456. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Santiago.rb +205 -0
  1457. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Sao_Paulo.rb +171 -0
  1458. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/St_Johns.rb +288 -0
  1459. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Tijuana.rb +196 -0
  1460. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Almaty.rb +67 -0
  1461. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baghdad.rb +73 -0
  1462. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baku.rb +161 -0
  1463. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Bangkok.rb +20 -0
  1464. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Chongqing.rb +33 -0
  1465. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Colombo.rb +30 -0
  1466. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Dhaka.rb +27 -0
  1467. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Hong_Kong.rb +87 -0
  1468. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Irkutsk.rb +165 -0
  1469. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jakarta.rb +30 -0
  1470. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jerusalem.rb +163 -0
  1471. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kabul.rb +20 -0
  1472. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kamchatka.rb +163 -0
  1473. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Karachi.rb +30 -0
  1474. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Katmandu.rb +20 -0
  1475. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kolkata.rb +25 -0
  1476. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Krasnoyarsk.rb +163 -0
  1477. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuala_Lumpur.rb +31 -0
  1478. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuwait.rb +18 -0
  1479. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Magadan.rb +163 -0
  1480. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Muscat.rb +18 -0
  1481. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Novosibirsk.rb +164 -0
  1482. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Rangoon.rb +24 -0
  1483. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Riyadh.rb +18 -0
  1484. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Seoul.rb +34 -0
  1485. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Shanghai.rb +35 -0
  1486. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Singapore.rb +33 -0
  1487. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Taipei.rb +59 -0
  1488. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tashkent.rb +47 -0
  1489. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tbilisi.rb +78 -0
  1490. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tehran.rb +121 -0
  1491. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tokyo.rb +30 -0
  1492. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Ulaanbaatar.rb +65 -0
  1493. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Urumqi.rb +33 -0
  1494. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Vladivostok.rb +164 -0
  1495. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yakutsk.rb +163 -0
  1496. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yekaterinburg.rb +165 -0
  1497. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yerevan.rb +165 -0
  1498. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Azores.rb +270 -0
  1499. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Cape_Verde.rb +23 -0
  1500. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/South_Georgia.rb +18 -0
  1501. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Adelaide.rb +187 -0
  1502. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Brisbane.rb +35 -0
  1503. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Darwin.rb +29 -0
  1504. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Hobart.rb +193 -0
  1505. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Melbourne.rb +185 -0
  1506. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Perth.rb +37 -0
  1507. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Sydney.rb +185 -0
  1508. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Etc/UTC.rb +16 -0
  1509. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Amsterdam.rb +228 -0
  1510. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Athens.rb +185 -0
  1511. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Belgrade.rb +163 -0
  1512. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Berlin.rb +188 -0
  1513. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bratislava.rb +13 -0
  1514. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Brussels.rb +232 -0
  1515. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bucharest.rb +181 -0
  1516. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Budapest.rb +197 -0
  1517. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Copenhagen.rb +179 -0
  1518. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Dublin.rb +276 -0
  1519. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Helsinki.rb +163 -0
  1520. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Istanbul.rb +218 -0
  1521. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Kiev.rb +168 -0
  1522. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Lisbon.rb +268 -0
  1523. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Ljubljana.rb +13 -0
  1524. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/London.rb +288 -0
  1525. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Madrid.rb +211 -0
  1526. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Minsk.rb +170 -0
  1527. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Moscow.rb +181 -0
  1528. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Paris.rb +232 -0
  1529. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Prague.rb +187 -0
  1530. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Riga.rb +176 -0
  1531. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Rome.rb +215 -0
  1532. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sarajevo.rb +13 -0
  1533. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Skopje.rb +13 -0
  1534. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sofia.rb +173 -0
  1535. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Stockholm.rb +165 -0
  1536. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Tallinn.rb +172 -0
  1537. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vienna.rb +183 -0
  1538. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vilnius.rb +170 -0
  1539. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Warsaw.rb +212 -0
  1540. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Zagreb.rb +13 -0
  1541. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Auckland.rb +202 -0
  1542. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Fiji.rb +23 -0
  1543. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Guam.rb +22 -0
  1544. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Honolulu.rb +28 -0
  1545. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Majuro.rb +20 -0
  1546. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Midway.rb +25 -0
  1547. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Noumea.rb +25 -0
  1548. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Pago_Pago.rb +26 -0
  1549. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Port_Moresby.rb +20 -0
  1550. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Tongatapu.rb +27 -0
  1551. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/info_timezone.rb +52 -0
  1552. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone.rb +51 -0
  1553. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone_info.rb +44 -0
  1554. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/offset_rationals.rb +98 -0
  1555. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/ruby_core_support.rb +56 -0
  1556. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/time_or_datetime.rb +292 -0
  1557. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone.rb +508 -0
  1558. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_definition.rb +56 -0
  1559. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_info.rb +40 -0
  1560. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_offset_info.rb +94 -0
  1561. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_period.rb +198 -0
  1562. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_transition_info.rb +129 -0
  1563. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo.rb +33 -0
  1564. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/vendor.rb +29 -0
  1565. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/version.rb +9 -0
  1566. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +58 -0
  1567. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/xml_mini/libxml.rb +133 -0
  1568. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/xml_mini/nokogiri.rb +77 -0
  1569. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/xml_mini/rexml.rb +108 -0
  1570. data/src/admin_panel/vendor/rails/activesupport/lib/active_support/xml_mini.rb +31 -0
  1571. data/src/admin_panel/vendor/rails/activesupport/lib/active_support.rb +59 -0
  1572. data/src/admin_panel/vendor/rails/activesupport/lib/activesupport.rb +1 -0
  1573. data/src/admin_panel/vendor/rails/railties/CHANGELOG +2156 -0
  1574. data/src/admin_panel/vendor/rails/railties/MIT-LICENSE +20 -0
  1575. data/src/admin_panel/vendor/rails/railties/README +243 -0
  1576. data/src/admin_panel/vendor/rails/railties/Rakefile +364 -0
  1577. data/src/admin_panel/vendor/rails/railties/bin/about +4 -0
  1578. data/src/admin_panel/vendor/rails/railties/bin/console +3 -0
  1579. data/src/admin_panel/vendor/rails/railties/bin/dbconsole +3 -0
  1580. data/src/admin_panel/vendor/rails/railties/bin/destroy +3 -0
  1581. data/src/admin_panel/vendor/rails/railties/bin/generate +3 -0
  1582. data/src/admin_panel/vendor/rails/railties/bin/performance/benchmarker +3 -0
  1583. data/src/admin_panel/vendor/rails/railties/bin/performance/profiler +3 -0
  1584. data/src/admin_panel/vendor/rails/railties/bin/plugin +3 -0
  1585. data/src/admin_panel/vendor/rails/railties/bin/rails +20 -0
  1586. data/src/admin_panel/vendor/rails/railties/bin/runner +3 -0
  1587. data/src/admin_panel/vendor/rails/railties/bin/server +3 -0
  1588. data/src/admin_panel/vendor/rails/railties/builtin/rails_info/rails/info.rb +129 -0
  1589. data/src/admin_panel/vendor/rails/railties/builtin/rails_info/rails/info_controller.rb +9 -0
  1590. data/src/admin_panel/vendor/rails/railties/builtin/rails_info/rails/info_helper.rb +2 -0
  1591. data/src/admin_panel/vendor/rails/railties/builtin/rails_info/rails_info_controller.rb +2 -0
  1592. data/src/admin_panel/vendor/rails/railties/configs/databases/frontbase.yml +28 -0
  1593. data/src/admin_panel/vendor/rails/railties/configs/databases/ibm_db.yml +62 -0
  1594. data/src/admin_panel/vendor/rails/railties/configs/databases/mysql.yml +60 -0
  1595. data/src/admin_panel/vendor/rails/railties/configs/databases/oracle.yml +39 -0
  1596. data/src/admin_panel/vendor/rails/railties/configs/databases/postgresql.yml +51 -0
  1597. data/src/admin_panel/vendor/rails/railties/configs/databases/sqlite2.yml +19 -0
  1598. data/src/admin_panel/vendor/rails/railties/configs/databases/sqlite3.yml +22 -0
  1599. data/src/admin_panel/vendor/rails/railties/configs/initializers/backtrace_silencers.rb +7 -0
  1600. data/src/admin_panel/vendor/rails/railties/configs/initializers/inflections.rb +10 -0
  1601. data/src/admin_panel/vendor/rails/railties/configs/initializers/mime_types.rb +5 -0
  1602. data/src/admin_panel/vendor/rails/railties/configs/initializers/new_rails_defaults.rb +19 -0
  1603. data/src/admin_panel/vendor/rails/railties/configs/initializers/session_store.rb +15 -0
  1604. data/src/admin_panel/vendor/rails/railties/configs/locales/en.yml +5 -0
  1605. data/src/admin_panel/vendor/rails/railties/configs/routes.rb +43 -0
  1606. data/src/admin_panel/vendor/rails/railties/dispatches/config.ru +7 -0
  1607. data/src/admin_panel/vendor/rails/railties/dispatches/dispatch.fcgi +24 -0
  1608. data/src/admin_panel/vendor/rails/railties/dispatches/dispatch.rb +10 -0
  1609. data/src/admin_panel/vendor/rails/railties/dispatches/gateway.cgi +97 -0
  1610. data/src/admin_panel/vendor/rails/railties/doc/README_FOR_APP +2 -0
  1611. data/src/admin_panel/vendor/rails/railties/environments/boot.rb +110 -0
  1612. data/src/admin_panel/vendor/rails/railties/environments/development.rb +17 -0
  1613. data/src/admin_panel/vendor/rails/railties/environments/environment.rb +41 -0
  1614. data/src/admin_panel/vendor/rails/railties/environments/production.rb +28 -0
  1615. data/src/admin_panel/vendor/rails/railties/environments/test.rb +28 -0
  1616. data/src/admin_panel/vendor/rails/railties/fresh_rakefile +10 -0
  1617. data/src/admin_panel/vendor/rails/railties/helpers/application_controller.rb +10 -0
  1618. data/src/admin_panel/vendor/rails/railties/helpers/application_helper.rb +3 -0
  1619. data/src/admin_panel/vendor/rails/railties/helpers/performance_test.rb +9 -0
  1620. data/src/admin_panel/vendor/rails/railties/helpers/test_helper.rb +38 -0
  1621. data/src/admin_panel/vendor/rails/railties/html/404.html +30 -0
  1622. data/src/admin_panel/vendor/rails/railties/html/422.html +30 -0
  1623. data/src/admin_panel/vendor/rails/railties/html/500.html +30 -0
  1624. data/src/admin_panel/vendor/rails/railties/html/favicon.ico +0 -0
  1625. data/src/admin_panel/vendor/rails/railties/html/images/rails.png +0 -0
  1626. data/src/admin_panel/vendor/rails/railties/html/index.html +275 -0
  1627. data/src/admin_panel/vendor/rails/railties/html/javascripts/application.js +2 -0
  1628. data/src/admin_panel/vendor/rails/railties/html/javascripts/controls.js +963 -0
  1629. data/src/admin_panel/vendor/rails/railties/html/javascripts/dragdrop.js +973 -0
  1630. data/src/admin_panel/vendor/rails/railties/html/javascripts/effects.js +1128 -0
  1631. data/src/admin_panel/vendor/rails/railties/html/javascripts/prototype.js +4320 -0
  1632. data/src/admin_panel/vendor/rails/railties/html/robots.txt +5 -0
  1633. data/src/admin_panel/vendor/rails/railties/lib/code_statistics.rb +107 -0
  1634. data/src/admin_panel/vendor/rails/railties/lib/commands/about.rb +3 -0
  1635. data/src/admin_panel/vendor/rails/railties/lib/commands/console.rb +45 -0
  1636. data/src/admin_panel/vendor/rails/railties/lib/commands/dbconsole.rb +83 -0
  1637. data/src/admin_panel/vendor/rails/railties/lib/commands/destroy.rb +6 -0
  1638. data/src/admin_panel/vendor/rails/railties/lib/commands/generate.rb +6 -0
  1639. data/src/admin_panel/vendor/rails/railties/lib/commands/ncgi/listener +86 -0
  1640. data/src/admin_panel/vendor/rails/railties/lib/commands/ncgi/tracker +69 -0
  1641. data/src/admin_panel/vendor/rails/railties/lib/commands/performance/benchmarker.rb +24 -0
  1642. data/src/admin_panel/vendor/rails/railties/lib/commands/performance/profiler.rb +50 -0
  1643. data/src/admin_panel/vendor/rails/railties/lib/commands/plugin.rb +968 -0
  1644. data/src/admin_panel/vendor/rails/railties/lib/commands/runner.rb +54 -0
  1645. data/src/admin_panel/vendor/rails/railties/lib/commands/server.rb +114 -0
  1646. data/src/admin_panel/vendor/rails/railties/lib/commands/update.rb +4 -0
  1647. data/src/admin_panel/vendor/rails/railties/lib/commands.rb +17 -0
  1648. data/src/admin_panel/vendor/rails/railties/lib/console_app.rb +30 -0
  1649. data/src/admin_panel/vendor/rails/railties/lib/console_sandbox.rb +6 -0
  1650. data/src/admin_panel/vendor/rails/railties/lib/console_with_helpers.rb +5 -0
  1651. data/src/admin_panel/vendor/rails/railties/lib/dispatcher.rb +24 -0
  1652. data/src/admin_panel/vendor/rails/railties/lib/fcgi_handler.rb +239 -0
  1653. data/src/admin_panel/vendor/rails/railties/lib/initializer.rb +1105 -0
  1654. data/src/admin_panel/vendor/rails/railties/lib/performance_test_help.rb +5 -0
  1655. data/src/admin_panel/vendor/rails/railties/lib/rails/backtrace_cleaner.rb +54 -0
  1656. data/src/admin_panel/vendor/rails/railties/lib/rails/gem_builder.rb +21 -0
  1657. data/src/admin_panel/vendor/rails/railties/lib/rails/gem_dependency.rb +282 -0
  1658. data/src/admin_panel/vendor/rails/railties/lib/rails/plugin/loader.rb +191 -0
  1659. data/src/admin_panel/vendor/rails/railties/lib/rails/plugin/locator.rb +100 -0
  1660. data/src/admin_panel/vendor/rails/railties/lib/rails/plugin.rb +167 -0
  1661. data/src/admin_panel/vendor/rails/railties/lib/rails/rack/debugger.rb +21 -0
  1662. data/src/admin_panel/vendor/rails/railties/lib/rails/rack/log_tailer.rb +35 -0
  1663. data/src/admin_panel/vendor/rails/railties/lib/rails/rack/metal.rb +51 -0
  1664. data/src/admin_panel/vendor/rails/railties/lib/rails/rack/static.rb +46 -0
  1665. data/src/admin_panel/vendor/rails/railties/lib/rails/rack.rb +8 -0
  1666. data/src/admin_panel/vendor/rails/railties/lib/rails/vendor_gem_source_index.rb +140 -0
  1667. data/src/admin_panel/vendor/rails/railties/lib/rails/version.rb +9 -0
  1668. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/base.rb +266 -0
  1669. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/commands.rb +621 -0
  1670. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generated_attribute.rb +46 -0
  1671. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/applications/app/USAGE +9 -0
  1672. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/applications/app/app_generator.rb +258 -0
  1673. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/applications/app/scm/git.rb +16 -0
  1674. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/applications/app/scm/scm.rb +8 -0
  1675. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/applications/app/scm/svn.rb +7 -0
  1676. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/applications/app/template_runner.rb +401 -0
  1677. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/controller/USAGE +30 -0
  1678. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/controller/controller_generator.rb +43 -0
  1679. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/controller.rb +7 -0
  1680. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/functional_test.rb +8 -0
  1681. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/helper.rb +2 -0
  1682. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/helper_test.rb +4 -0
  1683. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/view.html.erb +2 -0
  1684. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/helper/USAGE +24 -0
  1685. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/helper/helper_generator.rb +25 -0
  1686. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/helper/templates/helper.rb +2 -0
  1687. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/helper/templates/helper_test.rb +4 -0
  1688. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/integration_test/USAGE +8 -0
  1689. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/integration_test/integration_test_generator.rb +16 -0
  1690. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/integration_test/templates/integration_test.rb +10 -0
  1691. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/mailer/USAGE +16 -0
  1692. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/mailer/mailer_generator.rb +30 -0
  1693. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/fixture.erb +3 -0
  1694. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -0
  1695. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/mailer.rb +15 -0
  1696. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +20 -0
  1697. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/view.erb +3 -0
  1698. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -0
  1699. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/metal/USAGE +8 -0
  1700. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/metal/metal_generator.rb +8 -0
  1701. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/metal/templates/metal.rb +12 -0
  1702. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/migration/USAGE +29 -0
  1703. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/migration/migration_generator.rb +20 -0
  1704. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/migration/templates/migration.rb +11 -0
  1705. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/model/USAGE +27 -0
  1706. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/model/model_generator.rb +45 -0
  1707. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/fixtures.yml +19 -0
  1708. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/migration.rb +16 -0
  1709. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/model.rb +5 -0
  1710. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/unit_test.rb +8 -0
  1711. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/observer/USAGE +13 -0
  1712. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/observer/observer_generator.rb +16 -0
  1713. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/observer/templates/observer.rb +2 -0
  1714. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/observer/templates/unit_test.rb +8 -0
  1715. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/performance_test/USAGE +8 -0
  1716. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/performance_test/performance_test_generator.rb +16 -0
  1717. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/performance_test/templates/performance_test.rb +9 -0
  1718. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/USAGE +25 -0
  1719. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/plugin_generator.rb +39 -0
  1720. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +20 -0
  1721. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/README +13 -0
  1722. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/Rakefile +23 -0
  1723. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/USAGE +8 -0
  1724. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/generator.rb +8 -0
  1725. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -0
  1726. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/install.rb +1 -0
  1727. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -0
  1728. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/tasks.rake +4 -0
  1729. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/test_helper.rb +3 -0
  1730. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/uninstall.rb +1 -0
  1731. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/unit_test.rb +8 -0
  1732. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/resource/USAGE +23 -0
  1733. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/resource/resource_generator.rb +76 -0
  1734. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/controller.rb +2 -0
  1735. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/functional_test.rb +8 -0
  1736. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/helper.rb +2 -0
  1737. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/helper_test.rb +4 -0
  1738. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/USAGE +29 -0
  1739. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +102 -0
  1740. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/controller.rb +85 -0
  1741. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +45 -0
  1742. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/helper.rb +2 -0
  1743. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/helper_test.rb +4 -0
  1744. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/layout.html.erb +17 -0
  1745. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/style.css +54 -0
  1746. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_edit.html.erb +18 -0
  1747. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_index.html.erb +24 -0
  1748. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_new.html.erb +17 -0
  1749. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_show.html.erb +10 -0
  1750. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/session_migration/USAGE +10 -0
  1751. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/session_migration/session_migration_generator.rb +18 -0
  1752. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/generators/components/session_migration/templates/migration.rb +16 -0
  1753. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/lookup.rb +249 -0
  1754. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/manifest.rb +53 -0
  1755. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/options.rb +150 -0
  1756. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/scripts/destroy.rb +29 -0
  1757. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/scripts/generate.rb +7 -0
  1758. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/scripts/update.rb +12 -0
  1759. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/scripts.rb +89 -0
  1760. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/secret_key_generator.rb +24 -0
  1761. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/simple_logger.rb +46 -0
  1762. data/src/admin_panel/vendor/rails/railties/lib/rails_generator/spec.rb +44 -0
  1763. data/src/admin_panel/vendor/rails/railties/lib/rails_generator.rb +43 -0
  1764. data/src/admin_panel/vendor/rails/railties/lib/railties_path.rb +1 -0
  1765. data/src/admin_panel/vendor/rails/railties/lib/ruby_version_check.rb +17 -0
  1766. data/src/admin_panel/vendor/rails/railties/lib/rubyprof_ext.rb +35 -0
  1767. data/src/admin_panel/vendor/rails/railties/lib/source_annotation_extractor.rb +102 -0
  1768. data/src/admin_panel/vendor/rails/railties/lib/tasks/annotations.rake +20 -0
  1769. data/src/admin_panel/vendor/rails/railties/lib/tasks/databases.rake +423 -0
  1770. data/src/admin_panel/vendor/rails/railties/lib/tasks/documentation.rake +88 -0
  1771. data/src/admin_panel/vendor/rails/railties/lib/tasks/framework.rake +143 -0
  1772. data/src/admin_panel/vendor/rails/railties/lib/tasks/gems.rake +65 -0
  1773. data/src/admin_panel/vendor/rails/railties/lib/tasks/log.rake +9 -0
  1774. data/src/admin_panel/vendor/rails/railties/lib/tasks/middleware.rake +7 -0
  1775. data/src/admin_panel/vendor/rails/railties/lib/tasks/misc.rake +63 -0
  1776. data/src/admin_panel/vendor/rails/railties/lib/tasks/rails.rb +8 -0
  1777. data/src/admin_panel/vendor/rails/railties/lib/tasks/routes.rake +17 -0
  1778. data/src/admin_panel/vendor/rails/railties/lib/tasks/statistics.rake +17 -0
  1779. data/src/admin_panel/vendor/rails/railties/lib/tasks/testing.rake +139 -0
  1780. data/src/admin_panel/vendor/rails/railties/lib/tasks/tmp.rake +37 -0
  1781. data/src/admin_panel/vendor/rails/railties/lib/test_help.rb +35 -0
  1782. data/src/admin_panel/vendor/rails/railties/lib/webrick_server.rb +156 -0
  1783. data/src/head/wr_access_log.c +68 -0
  1784. data/src/head/wr_access_log.h +31 -0
  1785. data/src/head/wr_application.c +514 -0
  1786. data/src/head/wr_application.h +82 -0
  1787. data/src/head/wr_config.h +128 -0
  1788. data/src/head/wr_configurator.c +1114 -0
  1789. data/src/head/wr_configurator.h +142 -0
  1790. data/src/head/wr_connection.c +325 -0
  1791. data/src/head/wr_connection.h +68 -0
  1792. data/src/head/wr_controller.c +764 -0
  1793. data/src/head/wr_controller.h +100 -0
  1794. data/src/head/wr_main.c +202 -0
  1795. data/src/head/wr_request.c +658 -0
  1796. data/src/head/wr_request.h +139 -0
  1797. data/src/head/wr_resolver.c +285 -0
  1798. data/src/head/wr_resolver.h +58 -0
  1799. data/src/head/wr_server.c +190 -0
  1800. data/src/head/wr_server.h +64 -0
  1801. data/src/head/wr_worker.c +865 -0
  1802. data/src/head/wr_worker.h +80 -0
  1803. data/src/helper/wr_helper.h +31 -0
  1804. data/src/helper/wr_logger.c +160 -0
  1805. data/src/helper/wr_logger.h +74 -0
  1806. data/src/helper/wr_macro.h +31 -0
  1807. data/src/helper/wr_queue.c +107 -0
  1808. data/src/helper/wr_queue.h +64 -0
  1809. data/src/helper/wr_scgi.c +394 -0
  1810. data/src/helper/wr_scgi.h +110 -0
  1811. data/src/helper/wr_string.c +78 -0
  1812. data/src/helper/wr_string.h +83 -0
  1813. data/src/helper/wr_util.c +84 -0
  1814. data/src/helper/wr_util.h +43 -0
  1815. data/src/helper/wr_yaml_parser.c +249 -0
  1816. data/src/helper/wr_yaml_parser.h +67 -0
  1817. data/src/ruby_lib/analyzer/db_connect.rb +64 -0
  1818. data/src/ruby_lib/analyzer/logger.rb +55 -0
  1819. data/src/ruby_lib/analyzer/message_analyzer.rb +295 -0
  1820. data/src/ruby_lib/analyzer/message_reader.rb +93 -0
  1821. data/src/ruby_lib/analyzer/process_helper.rb +140 -0
  1822. data/src/ruby_lib/analyzer/resources_analyzer.rb +225 -0
  1823. data/src/ruby_lib/analyzer/user_defined_exception.rb +25 -0
  1824. data/src/ruby_lib/analyzer/webroar_analyzer.rb +29 -0
  1825. data/src/ruby_lib/analyzer/webroar_analyzer_script_runner.rb +171 -0
  1826. data/src/ruby_lib/exception_tracker/instrumentation/action_controller.rb +24 -0
  1827. data/src/ruby_lib/exception_tracker/instrumentation/instrumentation.rb +27 -0
  1828. data/src/ruby_lib/exception_tracker/instrumentation/rails.rb +25 -0
  1829. data/src/ruby_lib/exception_tracker/webroar_exception.rb +59 -0
  1830. data/src/ruby_lib/mailer/smtpmail.rb +64 -0
  1831. data/src/ruby_lib/profiler/instrumentation/action_controller.rb +25 -0
  1832. data/src/ruby_lib/profiler/instrumentation/active_record.rb +48 -0
  1833. data/src/ruby_lib/profiler/instrumentation/instrumentation.rb +27 -0
  1834. data/src/ruby_lib/profiler/instrumentation/rails.rb +26 -0
  1835. data/src/ruby_lib/profiler/message_dispatcher.rb +94 -0
  1836. data/src/ruby_lib/profiler/webroar_profiling.rb +202 -0
  1837. data/src/ruby_lib/rack/adapter/rack.rb +62 -0
  1838. data/src/ruby_lib/rack/adapter/rails.rb +185 -0
  1839. data/src/ruby_lib/ruby_interface/adapter.rb +50 -0
  1840. data/src/ruby_lib/ruby_interface/client.rb +111 -0
  1841. data/src/ruby_lib/ruby_interface/constants.rb +126 -0
  1842. data/src/ruby_lib/ruby_interface/deflater.rb +100 -0
  1843. data/src/ruby_lib/ruby_interface/logger.rb +34 -0
  1844. data/src/ruby_lib/ruby_interface/request_body.rb +60 -0
  1845. data/src/ruby_lib/ruby_interface/request_handler.rb +76 -0
  1846. data/src/ruby_lib/ruby_interface/ruby_interface.rb +29 -0
  1847. data/src/ruby_lib/ruby_interface/utils.rb +37 -0
  1848. data/src/ruby_lib/ruby_interface/version.rb +32 -0
  1849. data/src/ruby_lib/webroar_app_loader.rb +80 -0
  1850. data/src/vendor/libebb/LICENSE +21 -0
  1851. data/src/vendor/libebb/README +7 -0
  1852. data/src/vendor/libebb/doc/icon.png +0 -0
  1853. data/src/vendor/libebb/doc/index.html +240 -0
  1854. data/src/vendor/libebb/ebb.c +813 -0
  1855. data/src/vendor/libebb/ebb.h +123 -0
  1856. data/src/vendor/libebb/ebb_request_parser.c +3799 -0
  1857. data/src/vendor/libebb/ebb_request_parser.h +117 -0
  1858. data/src/vendor/libebb/ebb_request_parser.rl +421 -0
  1859. data/src/vendor/libebb/examples/ca-cert.pem +12 -0
  1860. data/src/vendor/libebb/examples/ca-key.pem +15 -0
  1861. data/src/vendor/libebb/examples/hello_world.c +101 -0
  1862. data/src/vendor/libebb/rbtree.c +412 -0
  1863. data/src/vendor/libebb/rbtree.h +54 -0
  1864. data/src/vendor/libebb/test/test_examples.rb +60 -0
  1865. data/src/vendor/libebb/test/test_rbtree.c +108 -0
  1866. data/src/vendor/libebb/test/test_request_parser.c +746 -0
  1867. data/src/vendor/libev/Changes +221 -0
  1868. data/src/vendor/libev/LICENSE +36 -0
  1869. data/src/vendor/libev/README +58 -0
  1870. data/src/vendor/libev/config.h.in +115 -0
  1871. data/src/vendor/libev/ev++.h +786 -0
  1872. data/src/vendor/libev/ev.3 +4021 -0
  1873. data/src/vendor/libev/ev.c +3158 -0
  1874. data/src/vendor/libev/ev.h +648 -0
  1875. data/src/vendor/libev/ev.pod +3943 -0
  1876. data/src/vendor/libev/ev_epoll.c +215 -0
  1877. data/src/vendor/libev/ev_kqueue.c +194 -0
  1878. data/src/vendor/libev/ev_poll.c +140 -0
  1879. data/src/vendor/libev/ev_port.c +163 -0
  1880. data/src/vendor/libev/ev_select.c +300 -0
  1881. data/src/vendor/libev/ev_vars.h +164 -0
  1882. data/src/vendor/libev/ev_win32.c +154 -0
  1883. data/src/vendor/libev/ev_wrap.h +150 -0
  1884. data/src/vendor/libev/event.c +401 -0
  1885. data/src/vendor/libev/event.h +158 -0
  1886. data/src/vendor/libyaml/LICENSE +19 -0
  1887. data/src/vendor/libyaml/README +29 -0
  1888. data/src/vendor/libyaml/api.c +1388 -0
  1889. data/src/vendor/libyaml/config.h +78 -0
  1890. data/src/vendor/libyaml/dumper.c +394 -0
  1891. data/src/vendor/libyaml/emitter.c +2297 -0
  1892. data/src/vendor/libyaml/loader.c +430 -0
  1893. data/src/vendor/libyaml/parser.c +1374 -0
  1894. data/src/vendor/libyaml/reader.c +460 -0
  1895. data/src/vendor/libyaml/scanner.c +3568 -0
  1896. data/src/vendor/libyaml/writer.c +141 -0
  1897. data/src/vendor/libyaml/yaml.h +1971 -0
  1898. data/src/vendor/libyaml/yaml_private.h +635 -0
  1899. data/src/worker/wkr_controller.c +288 -0
  1900. data/src/worker/wkr_http.c +470 -0
  1901. data/src/worker/wkr_http.h +43 -0
  1902. data/src/worker/wkr_http_request.c +322 -0
  1903. data/src/worker/wkr_http_request.h +47 -0
  1904. data/src/worker/wkr_http_response.c +247 -0
  1905. data/src/worker/wkr_http_response.h +43 -0
  1906. data/src/worker/wkr_main.c +248 -0
  1907. data/src/worker/worker.c +336 -0
  1908. data/src/worker/worker.h +97 -0
  1909. data/tasks/compile.rake +297 -0
  1910. data/tasks/gem.rake +123 -0
  1911. data/tasks/test.rake +696 -0
  1912. data/test/load_test.rb +115 -0
  1913. data/test/spec/access_log_spec.rb +45 -0
  1914. data/test/spec/analytics_spec.rb +114 -0
  1915. data/test/spec/conditional_spec.rb +106 -0
  1916. data/test/spec/connection_keep_alive_spec.rb +76 -0
  1917. data/test/spec/content_encoding_spec.rb +52 -0
  1918. data/test/spec/heart_beat_spec.rb +41 -0
  1919. data/test/spec/host_name_spec.rb +215 -0
  1920. data/test/spec/http_request_parser_spec.rb +380 -0
  1921. data/test/spec/http_spec.rb +76 -0
  1922. data/test/spec/spec_helper.rb +254 -0
  1923. data/test/spec/test_app/Rakefile +10 -0
  1924. data/test/spec/test_app/app/controllers/application_controller.rb +28 -0
  1925. data/test/spec/test_app/app/controllers/test_controller.rb +91 -0
  1926. data/test/spec/test_app/app/controllers/users_controller.rb +103 -0
  1927. data/test/spec/test_app/app/helpers/application_helper.rb +21 -0
  1928. data/test/spec/test_app/app/helpers/test_helper.rb +20 -0
  1929. data/test/spec/test_app/app/helpers/users_helper.rb +20 -0
  1930. data/test/spec/test_app/app/models/user.rb +20 -0
  1931. data/test/spec/test_app/app/views/layouts/users.html.erb +37 -0
  1932. data/test/spec/test_app/app/views/test/post_data.html.erb +24 -0
  1933. data/test/spec/test_app/app/views/test/upload_file.html.erb +34 -0
  1934. data/test/spec/test_app/app/views/users/edit.html.erb +36 -0
  1935. data/test/spec/test_app/app/views/users/index.html.erb +40 -0
  1936. data/test/spec/test_app/app/views/users/new.html.erb +35 -0
  1937. data/test/spec/test_app/app/views/users/show.html.erb +28 -0
  1938. data/test/spec/test_app/config/boot.rb +110 -0
  1939. data/test/spec/test_app/config/database.yml +22 -0
  1940. data/test/spec/test_app/config/environment.rb +42 -0
  1941. data/test/spec/test_app/config/environments/development.rb +17 -0
  1942. data/test/spec/test_app/config/environments/production.rb +28 -0
  1943. data/test/spec/test_app/config/environments/test.rb +28 -0
  1944. data/test/spec/test_app/config/initializers/backtrace_silencers.rb +7 -0
  1945. data/test/spec/test_app/config/initializers/inflections.rb +10 -0
  1946. data/test/spec/test_app/config/initializers/mime_types.rb +5 -0
  1947. data/test/spec/test_app/config/initializers/new_rails_defaults.rb +19 -0
  1948. data/test/spec/test_app/config/initializers/session_store.rb +15 -0
  1949. data/test/spec/test_app/config/routes.rb +45 -0
  1950. data/test/spec/test_app/db/migrate/20090602102438_create_users.rb +31 -0
  1951. data/test/spec/test_app/public/404.html +30 -0
  1952. data/test/spec/test_app/public/422.html +30 -0
  1953. data/test/spec/test_app/public/500.html +30 -0
  1954. data/test/spec/test_app/public/index.html +275 -0
  1955. data/test/spec/test_app/public/javascripts/application.js +2 -0
  1956. data/test/spec/test_app/public/javascripts/controls.js +963 -0
  1957. data/test/spec/test_app/public/javascripts/dragdrop.js +973 -0
  1958. data/test/spec/test_app/public/javascripts/effects.js +1128 -0
  1959. data/test/spec/test_app/public/javascripts/prototype.js +4320 -0
  1960. data/test/spec/test_app/public/robots.txt +5 -0
  1961. data/test/spec/test_app/public/stylesheets/scaffold.css +54 -0
  1962. data/test/spec/test_app/script/about +4 -0
  1963. data/test/spec/test_app/script/console +3 -0
  1964. data/test/spec/test_app/script/dbconsole +3 -0
  1965. data/test/spec/test_app/script/destroy +3 -0
  1966. data/test/spec/test_app/script/generate +3 -0
  1967. data/test/spec/test_app/script/performance/benchmarker +3 -0
  1968. data/test/spec/test_app/script/performance/profiler +3 -0
  1969. data/test/spec/test_app/script/plugin +3 -0
  1970. data/test/spec/test_app/script/runner +3 -0
  1971. data/test/spec/test_app/script/server +3 -0
  1972. data/test/spec/test_app/vendor/.placeholder +0 -0
  1973. data/test/spec/upload_helper.rb +163 -0
  1974. data/test/spec/webroar_command_spec.rb +66 -0
  1975. data/test/unit/config/config1.yml +3 -0
  1976. data/test/unit/config/config2.yml +8 -0
  1977. data/test/unit/config/config3.yml +18 -0
  1978. data/test/unit/config/config4.yml +1 -0
  1979. data/test/unit/config/config5.yml +3 -0
  1980. data/test/unit/queue_test.c +89 -0
  1981. data/test/unit/scgi_test.c +194 -0
  1982. data/test/unit/test.c +42 -0
  1983. data/test/unit/test.h +38 -0
  1984. data/test/unit/ut_test.c +77 -0
  1985. data/test/unit/ut_test.h +62 -0
  1986. data/test/unit/util_test.c +57 -0
  1987. data/test/unit/yaml_test.c +144 -0
  1988. metadata +2114 -0
@@ -0,0 +1,3943 @@
1
+ =head1 NAME
2
+
3
+ libev - a high performance full-featured event loop written in C
4
+
5
+ =head1 SYNOPSIS
6
+
7
+ #include <ev.h>
8
+
9
+ =head2 EXAMPLE PROGRAM
10
+
11
+ // a single header file is required
12
+ #include <ev.h>
13
+
14
+ #include <stdio.h> // for puts
15
+
16
+ // every watcher type has its own typedef'd struct
17
+ // with the name ev_TYPE
18
+ ev_io stdin_watcher;
19
+ ev_timer timeout_watcher;
20
+
21
+ // all watcher callbacks have a similar signature
22
+ // this callback is called when data is readable on stdin
23
+ static void
24
+ stdin_cb (EV_P_ ev_io *w, int revents)
25
+ {
26
+ puts ("stdin ready");
27
+ // for one-shot events, one must manually stop the watcher
28
+ // with its corresponding stop function.
29
+ ev_io_stop (EV_A_ w);
30
+
31
+ // this causes all nested ev_loop's to stop iterating
32
+ ev_unloop (EV_A_ EVUNLOOP_ALL);
33
+ }
34
+
35
+ // another callback, this time for a time-out
36
+ static void
37
+ timeout_cb (EV_P_ ev_timer *w, int revents)
38
+ {
39
+ puts ("timeout");
40
+ // this causes the innermost ev_loop to stop iterating
41
+ ev_unloop (EV_A_ EVUNLOOP_ONE);
42
+ }
43
+
44
+ int
45
+ main (void)
46
+ {
47
+ // use the default event loop unless you have special needs
48
+ struct ev_loop *loop = ev_default_loop (0);
49
+
50
+ // initialise an io watcher, then start it
51
+ // this one will watch for stdin to become readable
52
+ ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);
53
+ ev_io_start (loop, &stdin_watcher);
54
+
55
+ // initialise a timer watcher, then start it
56
+ // simple non-repeating 5.5 second timeout
57
+ ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);
58
+ ev_timer_start (loop, &timeout_watcher);
59
+
60
+ // now wait for events to arrive
61
+ ev_loop (loop, 0);
62
+
63
+ // unloop was called, so exit
64
+ return 0;
65
+ }
66
+
67
+ =head1 DESCRIPTION
68
+
69
+ The newest version of this document is also available as an html-formatted
70
+ web page you might find easier to navigate when reading it for the first
71
+ time: L<http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod>.
72
+
73
+ Libev is an event loop: you register interest in certain events (such as a
74
+ file descriptor being readable or a timeout occurring), and it will manage
75
+ these event sources and provide your program with events.
76
+
77
+ To do this, it must take more or less complete control over your process
78
+ (or thread) by executing the I<event loop> handler, and will then
79
+ communicate events via a callback mechanism.
80
+
81
+ You register interest in certain events by registering so-called I<event
82
+ watchers>, which are relatively small C structures you initialise with the
83
+ details of the event, and then hand it over to libev by I<starting> the
84
+ watcher.
85
+
86
+ =head2 FEATURES
87
+
88
+ Libev supports C<select>, C<poll>, the Linux-specific C<epoll>, the
89
+ BSD-specific C<kqueue> and the Solaris-specific event port mechanisms
90
+ for file descriptor events (C<ev_io>), the Linux C<inotify> interface
91
+ (for C<ev_stat>), relative timers (C<ev_timer>), absolute timers
92
+ with customised rescheduling (C<ev_periodic>), synchronous signals
93
+ (C<ev_signal>), process status change events (C<ev_child>), and event
94
+ watchers dealing with the event loop mechanism itself (C<ev_idle>,
95
+ C<ev_embed>, C<ev_prepare> and C<ev_check> watchers) as well as
96
+ file watchers (C<ev_stat>) and even limited support for fork events
97
+ (C<ev_fork>).
98
+
99
+ It also is quite fast (see this
100
+ L<benchmark|http://libev.schmorp.de/bench.html> comparing it to libevent
101
+ for example).
102
+
103
+ =head2 CONVENTIONS
104
+
105
+ Libev is very configurable. In this manual the default (and most common)
106
+ configuration will be described, which supports multiple event loops. For
107
+ more info about various configuration options please have a look at
108
+ B<EMBED> section in this manual. If libev was configured without support
109
+ for multiple event loops, then all functions taking an initial argument of
110
+ name C<loop> (which is always of type C<ev_loop *>) will not have
111
+ this argument.
112
+
113
+ =head2 TIME REPRESENTATION
114
+
115
+ Libev represents time as a single floating point number, representing the
116
+ (fractional) number of seconds since the (POSIX) epoch (somewhere near
117
+ the beginning of 1970, details are complicated, don't ask). This type is
118
+ called C<ev_tstamp>, which is what you should use too. It usually aliases
119
+ to the C<double> type in C, and when you need to do any calculations on
120
+ it, you should treat it as some floating point value. Unlike the name
121
+ component C<stamp> might indicate, it is also used for time differences
122
+ throughout libev.
123
+
124
+ =head1 ERROR HANDLING
125
+
126
+ Libev knows three classes of errors: operating system errors, usage errors
127
+ and internal errors (bugs).
128
+
129
+ When libev catches an operating system error it cannot handle (for example
130
+ a system call indicating a condition libev cannot fix), it calls the callback
131
+ set via C<ev_set_syserr_cb>, which is supposed to fix the problem or
132
+ abort. The default is to print a diagnostic message and to call C<abort
133
+ ()>.
134
+
135
+ When libev detects a usage error such as a negative timer interval, then
136
+ it will print a diagnostic message and abort (via the C<assert> mechanism,
137
+ so C<NDEBUG> will disable this checking): these are programming errors in
138
+ the libev caller and need to be fixed there.
139
+
140
+ Libev also has a few internal error-checking C<assert>ions, and also has
141
+ extensive consistency checking code. These do not trigger under normal
142
+ circumstances, as they indicate either a bug in libev or worse.
143
+
144
+
145
+ =head1 GLOBAL FUNCTIONS
146
+
147
+ These functions can be called anytime, even before initialising the
148
+ library in any way.
149
+
150
+ =over 4
151
+
152
+ =item ev_tstamp ev_time ()
153
+
154
+ Returns the current time as libev would use it. Please note that the
155
+ C<ev_now> function is usually faster and also often returns the timestamp
156
+ you actually want to know.
157
+
158
+ =item ev_sleep (ev_tstamp interval)
159
+
160
+ Sleep for the given interval: The current thread will be blocked until
161
+ either it is interrupted or the given time interval has passed. Basically
162
+ this is a sub-second-resolution C<sleep ()>.
163
+
164
+ =item int ev_version_major ()
165
+
166
+ =item int ev_version_minor ()
167
+
168
+ You can find out the major and minor ABI version numbers of the library
169
+ you linked against by calling the functions C<ev_version_major> and
170
+ C<ev_version_minor>. If you want, you can compare against the global
171
+ symbols C<EV_VERSION_MAJOR> and C<EV_VERSION_MINOR>, which specify the
172
+ version of the library your program was compiled against.
173
+
174
+ These version numbers refer to the ABI version of the library, not the
175
+ release version.
176
+
177
+ Usually, it's a good idea to terminate if the major versions mismatch,
178
+ as this indicates an incompatible change. Minor versions are usually
179
+ compatible to older versions, so a larger minor version alone is usually
180
+ not a problem.
181
+
182
+ Example: Make sure we haven't accidentally been linked against the wrong
183
+ version.
184
+
185
+ assert (("libev version mismatch",
186
+ ev_version_major () == EV_VERSION_MAJOR
187
+ && ev_version_minor () >= EV_VERSION_MINOR));
188
+
189
+ =item unsigned int ev_supported_backends ()
190
+
191
+ Return the set of all backends (i.e. their corresponding C<EV_BACKEND_*>
192
+ value) compiled into this binary of libev (independent of their
193
+ availability on the system you are running on). See C<ev_default_loop> for
194
+ a description of the set values.
195
+
196
+ Example: make sure we have the epoll method, because yeah this is cool and
197
+ a must have and can we have a torrent of it please!!!11
198
+
199
+ assert (("sorry, no epoll, no sex",
200
+ ev_supported_backends () & EVBACKEND_EPOLL));
201
+
202
+ =item unsigned int ev_recommended_backends ()
203
+
204
+ Return the set of all backends compiled into this binary of libev and also
205
+ recommended for this platform. This set is often smaller than the one
206
+ returned by C<ev_supported_backends>, as for example kqueue is broken on
207
+ most BSDs and will not be auto-detected unless you explicitly request it
208
+ (assuming you know what you are doing). This is the set of backends that
209
+ libev will probe for if you specify no backends explicitly.
210
+
211
+ =item unsigned int ev_embeddable_backends ()
212
+
213
+ Returns the set of backends that are embeddable in other event loops. This
214
+ is the theoretical, all-platform, value. To find which backends
215
+ might be supported on the current system, you would need to look at
216
+ C<ev_embeddable_backends () & ev_supported_backends ()>, likewise for
217
+ recommended ones.
218
+
219
+ See the description of C<ev_embed> watchers for more info.
220
+
221
+ =item ev_set_allocator (void *(*cb)(void *ptr, long size)) [NOT REENTRANT]
222
+
223
+ Sets the allocation function to use (the prototype is similar - the
224
+ semantics are identical to the C<realloc> C89/SuS/POSIX function). It is
225
+ used to allocate and free memory (no surprises here). If it returns zero
226
+ when memory needs to be allocated (C<size != 0>), the library might abort
227
+ or take some potentially destructive action.
228
+
229
+ Since some systems (at least OpenBSD and Darwin) fail to implement
230
+ correct C<realloc> semantics, libev will use a wrapper around the system
231
+ C<realloc> and C<free> functions by default.
232
+
233
+ You could override this function in high-availability programs to, say,
234
+ free some memory if it cannot allocate memory, to use a special allocator,
235
+ or even to sleep a while and retry until some memory is available.
236
+
237
+ Example: Replace the libev allocator with one that waits a bit and then
238
+ retries (example requires a standards-compliant C<realloc>).
239
+
240
+ static void *
241
+ persistent_realloc (void *ptr, size_t size)
242
+ {
243
+ for (;;)
244
+ {
245
+ void *newptr = realloc (ptr, size);
246
+
247
+ if (newptr)
248
+ return newptr;
249
+
250
+ sleep (60);
251
+ }
252
+ }
253
+
254
+ ...
255
+ ev_set_allocator (persistent_realloc);
256
+
257
+ =item ev_set_syserr_cb (void (*cb)(const char *msg)); [NOT REENTRANT]
258
+
259
+ Set the callback function to call on a retryable system call error (such
260
+ as failed select, poll, epoll_wait). The message is a printable string
261
+ indicating the system call or subsystem causing the problem. If this
262
+ callback is set, then libev will expect it to remedy the situation, no
263
+ matter what, when it returns. That is, libev will generally retry the
264
+ requested operation, or, if the condition doesn't go away, do bad stuff
265
+ (such as abort).
266
+
267
+ Example: This is basically the same thing that libev does internally, too.
268
+
269
+ static void
270
+ fatal_error (const char *msg)
271
+ {
272
+ perror (msg);
273
+ abort ();
274
+ }
275
+
276
+ ...
277
+ ev_set_syserr_cb (fatal_error);
278
+
279
+ =back
280
+
281
+ =head1 FUNCTIONS CONTROLLING THE EVENT LOOP
282
+
283
+ An event loop is described by a C<struct ev_loop *> (the C<struct>
284
+ is I<not> optional in this case, as there is also an C<ev_loop>
285
+ I<function>).
286
+
287
+ The library knows two types of such loops, the I<default> loop, which
288
+ supports signals and child events, and dynamically created loops which do
289
+ not.
290
+
291
+ =over 4
292
+
293
+ =item struct ev_loop *ev_default_loop (unsigned int flags)
294
+
295
+ This will initialise the default event loop if it hasn't been initialised
296
+ yet and return it. If the default loop could not be initialised, returns
297
+ false. If it already was initialised it simply returns it (and ignores the
298
+ flags. If that is troubling you, check C<ev_backend ()> afterwards).
299
+
300
+ If you don't know what event loop to use, use the one returned from this
301
+ function.
302
+
303
+ Note that this function is I<not> thread-safe, so if you want to use it
304
+ from multiple threads, you have to lock (note also that this is unlikely,
305
+ as loops cannot be shared easily between threads anyway).
306
+
307
+ The default loop is the only loop that can handle C<ev_signal> and
308
+ C<ev_child> watchers, and to do this, it always registers a handler
309
+ for C<SIGCHLD>. If this is a problem for your application you can either
310
+ create a dynamic loop with C<ev_loop_new> that doesn't do that, or you
311
+ can simply overwrite the C<SIGCHLD> signal handler I<after> calling
312
+ C<ev_default_init>.
313
+
314
+ The flags argument can be used to specify special behaviour or specific
315
+ backends to use, and is usually specified as C<0> (or C<EVFLAG_AUTO>).
316
+
317
+ The following flags are supported:
318
+
319
+ =over 4
320
+
321
+ =item C<EVFLAG_AUTO>
322
+
323
+ The default flags value. Use this if you have no clue (it's the right
324
+ thing, believe me).
325
+
326
+ =item C<EVFLAG_NOENV>
327
+
328
+ If this flag bit is or'ed into the flag value (or the program runs setuid
329
+ or setgid) then libev will I<not> look at the environment variable
330
+ C<LIBEV_FLAGS>. Otherwise (the default), this environment variable will
331
+ override the flags completely if it is found in the environment. This is
332
+ useful to try out specific backends to test their performance, or to work
333
+ around bugs.
334
+
335
+ =item C<EVFLAG_FORKCHECK>
336
+
337
+ Instead of calling C<ev_default_fork> or C<ev_loop_fork> manually after
338
+ a fork, you can also make libev check for a fork in each iteration by
339
+ enabling this flag.
340
+
341
+ This works by calling C<getpid ()> on every iteration of the loop,
342
+ and thus this might slow down your event loop if you do a lot of loop
343
+ iterations and little real work, but is usually not noticeable (on my
344
+ GNU/Linux system for example, C<getpid> is actually a simple 5-insn sequence
345
+ without a system call and thus I<very> fast, but my GNU/Linux system also has
346
+ C<pthread_atfork> which is even faster).
347
+
348
+ The big advantage of this flag is that you can forget about fork (and
349
+ forget about forgetting to tell libev about forking) when you use this
350
+ flag.
351
+
352
+ This flag setting cannot be overridden or specified in the C<LIBEV_FLAGS>
353
+ environment variable.
354
+
355
+ =item C<EVBACKEND_SELECT> (value 1, portable select backend)
356
+
357
+ This is your standard select(2) backend. Not I<completely> standard, as
358
+ libev tries to roll its own fd_set with no limits on the number of fds,
359
+ but if that fails, expect a fairly low limit on the number of fds when
360
+ using this backend. It doesn't scale too well (O(highest_fd)), but its
361
+ usually the fastest backend for a low number of (low-numbered :) fds.
362
+
363
+ To get good performance out of this backend you need a high amount of
364
+ parallelism (most of the file descriptors should be busy). If you are
365
+ writing a server, you should C<accept ()> in a loop to accept as many
366
+ connections as possible during one iteration. You might also want to have
367
+ a look at C<ev_set_io_collect_interval ()> to increase the amount of
368
+ readiness notifications you get per iteration.
369
+
370
+ This backend maps C<EV_READ> to the C<readfds> set and C<EV_WRITE> to the
371
+ C<writefds> set (and to work around Microsoft Windows bugs, also onto the
372
+ C<exceptfds> set on that platform).
373
+
374
+ =item C<EVBACKEND_POLL> (value 2, poll backend, available everywhere except on windows)
375
+
376
+ And this is your standard poll(2) backend. It's more complicated
377
+ than select, but handles sparse fds better and has no artificial
378
+ limit on the number of fds you can use (except it will slow down
379
+ considerably with a lot of inactive fds). It scales similarly to select,
380
+ i.e. O(total_fds). See the entry for C<EVBACKEND_SELECT>, above, for
381
+ performance tips.
382
+
383
+ This backend maps C<EV_READ> to C<POLLIN | POLLERR | POLLHUP>, and
384
+ C<EV_WRITE> to C<POLLOUT | POLLERR | POLLHUP>.
385
+
386
+ =item C<EVBACKEND_EPOLL> (value 4, Linux)
387
+
388
+ For few fds, this backend is a bit little slower than poll and select,
389
+ but it scales phenomenally better. While poll and select usually scale
390
+ like O(total_fds) where n is the total number of fds (or the highest fd),
391
+ epoll scales either O(1) or O(active_fds).
392
+
393
+ The epoll mechanism deserves honorable mention as the most misdesigned
394
+ of the more advanced event mechanisms: mere annoyances include silently
395
+ dropping file descriptors, requiring a system call per change per file
396
+ descriptor (and unnecessary guessing of parameters), problems with dup and
397
+ so on. The biggest issue is fork races, however - if a program forks then
398
+ I<both> parent and child process have to recreate the epoll set, which can
399
+ take considerable time (one syscall per file descriptor) and is of course
400
+ hard to detect.
401
+
402
+ Epoll is also notoriously buggy - embedding epoll fds I<should> work, but
403
+ of course I<doesn't>, and epoll just loves to report events for totally
404
+ I<different> file descriptors (even already closed ones, so one cannot
405
+ even remove them from the set) than registered in the set (especially
406
+ on SMP systems). Libev tries to counter these spurious notifications by
407
+ employing an additional generation counter and comparing that against the
408
+ events to filter out spurious ones, recreating the set when required.
409
+
410
+ While stopping, setting and starting an I/O watcher in the same iteration
411
+ will result in some caching, there is still a system call per such
412
+ incident (because the same I<file descriptor> could point to a different
413
+ I<file description> now), so its best to avoid that. Also, C<dup ()>'ed
414
+ file descriptors might not work very well if you register events for both
415
+ file descriptors.
416
+
417
+ Best performance from this backend is achieved by not unregistering all
418
+ watchers for a file descriptor until it has been closed, if possible,
419
+ i.e. keep at least one watcher active per fd at all times. Stopping and
420
+ starting a watcher (without re-setting it) also usually doesn't cause
421
+ extra overhead. A fork can both result in spurious notifications as well
422
+ as in libev having to destroy and recreate the epoll object, which can
423
+ take considerable time and thus should be avoided.
424
+
425
+ All this means that, in practice, C<EVBACKEND_SELECT> can be as fast or
426
+ faster than epoll for maybe up to a hundred file descriptors, depending on
427
+ the usage. So sad.
428
+
429
+ While nominally embeddable in other event loops, this feature is broken in
430
+ all kernel versions tested so far.
431
+
432
+ This backend maps C<EV_READ> and C<EV_WRITE> in the same way as
433
+ C<EVBACKEND_POLL>.
434
+
435
+ =item C<EVBACKEND_KQUEUE> (value 8, most BSD clones)
436
+
437
+ Kqueue deserves special mention, as at the time of this writing, it
438
+ was broken on all BSDs except NetBSD (usually it doesn't work reliably
439
+ with anything but sockets and pipes, except on Darwin, where of course
440
+ it's completely useless). Unlike epoll, however, whose brokenness
441
+ is by design, these kqueue bugs can (and eventually will) be fixed
442
+ without API changes to existing programs. For this reason it's not being
443
+ "auto-detected" unless you explicitly specify it in the flags (i.e. using
444
+ C<EVBACKEND_KQUEUE>) or libev was compiled on a known-to-be-good (-enough)
445
+ system like NetBSD.
446
+
447
+ You still can embed kqueue into a normal poll or select backend and use it
448
+ only for sockets (after having made sure that sockets work with kqueue on
449
+ the target platform). See C<ev_embed> watchers for more info.
450
+
451
+ It scales in the same way as the epoll backend, but the interface to the
452
+ kernel is more efficient (which says nothing about its actual speed, of
453
+ course). While stopping, setting and starting an I/O watcher does never
454
+ cause an extra system call as with C<EVBACKEND_EPOLL>, it still adds up to
455
+ two event changes per incident. Support for C<fork ()> is very bad (but
456
+ sane, unlike epoll) and it drops fds silently in similarly hard-to-detect
457
+ cases
458
+
459
+ This backend usually performs well under most conditions.
460
+
461
+ While nominally embeddable in other event loops, this doesn't work
462
+ everywhere, so you might need to test for this. And since it is broken
463
+ almost everywhere, you should only use it when you have a lot of sockets
464
+ (for which it usually works), by embedding it into another event loop
465
+ (e.g. C<EVBACKEND_SELECT> or C<EVBACKEND_POLL> (but C<poll> is of course
466
+ also broken on OS X)) and, did I mention it, using it only for sockets.
467
+
468
+ This backend maps C<EV_READ> into an C<EVFILT_READ> kevent with
469
+ C<NOTE_EOF>, and C<EV_WRITE> into an C<EVFILT_WRITE> kevent with
470
+ C<NOTE_EOF>.
471
+
472
+ =item C<EVBACKEND_DEVPOLL> (value 16, Solaris 8)
473
+
474
+ This is not implemented yet (and might never be, unless you send me an
475
+ implementation). According to reports, C</dev/poll> only supports sockets
476
+ and is not embeddable, which would limit the usefulness of this backend
477
+ immensely.
478
+
479
+ =item C<EVBACKEND_PORT> (value 32, Solaris 10)
480
+
481
+ This uses the Solaris 10 event port mechanism. As with everything on Solaris,
482
+ it's really slow, but it still scales very well (O(active_fds)).
483
+
484
+ Please note that Solaris event ports can deliver a lot of spurious
485
+ notifications, so you need to use non-blocking I/O or other means to avoid
486
+ blocking when no data (or space) is available.
487
+
488
+ While this backend scales well, it requires one system call per active
489
+ file descriptor per loop iteration. For small and medium numbers of file
490
+ descriptors a "slow" C<EVBACKEND_SELECT> or C<EVBACKEND_POLL> backend
491
+ might perform better.
492
+
493
+ On the positive side, with the exception of the spurious readiness
494
+ notifications, this backend actually performed fully to specification
495
+ in all tests and is fully embeddable, which is a rare feat among the
496
+ OS-specific backends (I vastly prefer correctness over speed hacks).
497
+
498
+ This backend maps C<EV_READ> and C<EV_WRITE> in the same way as
499
+ C<EVBACKEND_POLL>.
500
+
501
+ =item C<EVBACKEND_ALL>
502
+
503
+ Try all backends (even potentially broken ones that wouldn't be tried
504
+ with C<EVFLAG_AUTO>). Since this is a mask, you can do stuff such as
505
+ C<EVBACKEND_ALL & ~EVBACKEND_KQUEUE>.
506
+
507
+ It is definitely not recommended to use this flag.
508
+
509
+ =back
510
+
511
+ If one or more of these are or'ed into the flags value, then only these
512
+ backends will be tried (in the reverse order as listed here). If none are
513
+ specified, all backends in C<ev_recommended_backends ()> will be tried.
514
+
515
+ Example: This is the most typical usage.
516
+
517
+ if (!ev_default_loop (0))
518
+ fatal ("could not initialise libev, bad $LIBEV_FLAGS in environment?");
519
+
520
+ Example: Restrict libev to the select and poll backends, and do not allow
521
+ environment settings to be taken into account:
522
+
523
+ ev_default_loop (EVBACKEND_POLL | EVBACKEND_SELECT | EVFLAG_NOENV);
524
+
525
+ Example: Use whatever libev has to offer, but make sure that kqueue is
526
+ used if available (warning, breaks stuff, best use only with your own
527
+ private event loop and only if you know the OS supports your types of
528
+ fds):
529
+
530
+ ev_default_loop (ev_recommended_backends () | EVBACKEND_KQUEUE);
531
+
532
+ =item struct ev_loop *ev_loop_new (unsigned int flags)
533
+
534
+ Similar to C<ev_default_loop>, but always creates a new event loop that is
535
+ always distinct from the default loop. Unlike the default loop, it cannot
536
+ handle signal and child watchers, and attempts to do so will be greeted by
537
+ undefined behaviour (or a failed assertion if assertions are enabled).
538
+
539
+ Note that this function I<is> thread-safe, and the recommended way to use
540
+ libev with threads is indeed to create one loop per thread, and using the
541
+ default loop in the "main" or "initial" thread.
542
+
543
+ Example: Try to create a event loop that uses epoll and nothing else.
544
+
545
+ struct ev_loop *epoller = ev_loop_new (EVBACKEND_EPOLL | EVFLAG_NOENV);
546
+ if (!epoller)
547
+ fatal ("no epoll found here, maybe it hides under your chair");
548
+
549
+ =item ev_default_destroy ()
550
+
551
+ Destroys the default loop again (frees all memory and kernel state
552
+ etc.). None of the active event watchers will be stopped in the normal
553
+ sense, so e.g. C<ev_is_active> might still return true. It is your
554
+ responsibility to either stop all watchers cleanly yourself I<before>
555
+ calling this function, or cope with the fact afterwards (which is usually
556
+ the easiest thing, you can just ignore the watchers and/or C<free ()> them
557
+ for example).
558
+
559
+ Note that certain global state, such as signal state (and installed signal
560
+ handlers), will not be freed by this function, and related watchers (such
561
+ as signal and child watchers) would need to be stopped manually.
562
+
563
+ In general it is not advisable to call this function except in the
564
+ rare occasion where you really need to free e.g. the signal handling
565
+ pipe fds. If you need dynamically allocated loops it is better to use
566
+ C<ev_loop_new> and C<ev_loop_destroy>).
567
+
568
+ =item ev_loop_destroy (loop)
569
+
570
+ Like C<ev_default_destroy>, but destroys an event loop created by an
571
+ earlier call to C<ev_loop_new>.
572
+
573
+ =item ev_default_fork ()
574
+
575
+ This function sets a flag that causes subsequent C<ev_loop> iterations
576
+ to reinitialise the kernel state for backends that have one. Despite the
577
+ name, you can call it anytime, but it makes most sense after forking, in
578
+ the child process (or both child and parent, but that again makes little
579
+ sense). You I<must> call it in the child before using any of the libev
580
+ functions, and it will only take effect at the next C<ev_loop> iteration.
581
+
582
+ On the other hand, you only need to call this function in the child
583
+ process if and only if you want to use the event library in the child. If
584
+ you just fork+exec, you don't have to call it at all.
585
+
586
+ The function itself is quite fast and it's usually not a problem to call
587
+ it just in case after a fork. To make this easy, the function will fit in
588
+ quite nicely into a call to C<pthread_atfork>:
589
+
590
+ pthread_atfork (0, 0, ev_default_fork);
591
+
592
+ =item ev_loop_fork (loop)
593
+
594
+ Like C<ev_default_fork>, but acts on an event loop created by
595
+ C<ev_loop_new>. Yes, you have to call this on every allocated event loop
596
+ after fork that you want to re-use in the child, and how you do this is
597
+ entirely your own problem.
598
+
599
+ =item int ev_is_default_loop (loop)
600
+
601
+ Returns true when the given loop is, in fact, the default loop, and false
602
+ otherwise.
603
+
604
+ =item unsigned int ev_loop_count (loop)
605
+
606
+ Returns the count of loop iterations for the loop, which is identical to
607
+ the number of times libev did poll for new events. It starts at C<0> and
608
+ happily wraps around with enough iterations.
609
+
610
+ This value can sometimes be useful as a generation counter of sorts (it
611
+ "ticks" the number of loop iterations), as it roughly corresponds with
612
+ C<ev_prepare> and C<ev_check> calls.
613
+
614
+ =item unsigned int ev_backend (loop)
615
+
616
+ Returns one of the C<EVBACKEND_*> flags indicating the event backend in
617
+ use.
618
+
619
+ =item ev_tstamp ev_now (loop)
620
+
621
+ Returns the current "event loop time", which is the time the event loop
622
+ received events and started processing them. This timestamp does not
623
+ change as long as callbacks are being processed, and this is also the base
624
+ time used for relative timers. You can treat it as the timestamp of the
625
+ event occurring (or more correctly, libev finding out about it).
626
+
627
+ =item ev_now_update (loop)
628
+
629
+ Establishes the current time by querying the kernel, updating the time
630
+ returned by C<ev_now ()> in the progress. This is a costly operation and
631
+ is usually done automatically within C<ev_loop ()>.
632
+
633
+ This function is rarely useful, but when some event callback runs for a
634
+ very long time without entering the event loop, updating libev's idea of
635
+ the current time is a good idea.
636
+
637
+ See also "The special problem of time updates" in the C<ev_timer> section.
638
+
639
+ =item ev_loop (loop, int flags)
640
+
641
+ Finally, this is it, the event handler. This function usually is called
642
+ after you initialised all your watchers and you want to start handling
643
+ events.
644
+
645
+ If the flags argument is specified as C<0>, it will not return until
646
+ either no event watchers are active anymore or C<ev_unloop> was called.
647
+
648
+ Please note that an explicit C<ev_unloop> is usually better than
649
+ relying on all watchers to be stopped when deciding when a program has
650
+ finished (especially in interactive programs), but having a program
651
+ that automatically loops as long as it has to and no longer by virtue
652
+ of relying on its watchers stopping correctly, that is truly a thing of
653
+ beauty.
654
+
655
+ A flags value of C<EVLOOP_NONBLOCK> will look for new events, will handle
656
+ those events and any already outstanding ones, but will not block your
657
+ process in case there are no events and will return after one iteration of
658
+ the loop.
659
+
660
+ A flags value of C<EVLOOP_ONESHOT> will look for new events (waiting if
661
+ necessary) and will handle those and any already outstanding ones. It
662
+ will block your process until at least one new event arrives (which could
663
+ be an event internal to libev itself, so there is no guarantee that a
664
+ user-registered callback will be called), and will return after one
665
+ iteration of the loop.
666
+
667
+ This is useful if you are waiting for some external event in conjunction
668
+ with something not expressible using other libev watchers (i.e. "roll your
669
+ own C<ev_loop>"). However, a pair of C<ev_prepare>/C<ev_check> watchers is
670
+ usually a better approach for this kind of thing.
671
+
672
+ Here are the gory details of what C<ev_loop> does:
673
+
674
+ - Before the first iteration, call any pending watchers.
675
+ * If EVFLAG_FORKCHECK was used, check for a fork.
676
+ - If a fork was detected (by any means), queue and call all fork watchers.
677
+ - Queue and call all prepare watchers.
678
+ - If we have been forked, detach and recreate the kernel state
679
+ as to not disturb the other process.
680
+ - Update the kernel state with all outstanding changes.
681
+ - Update the "event loop time" (ev_now ()).
682
+ - Calculate for how long to sleep or block, if at all
683
+ (active idle watchers, EVLOOP_NONBLOCK or not having
684
+ any active watchers at all will result in not sleeping).
685
+ - Sleep if the I/O and timer collect interval say so.
686
+ - Block the process, waiting for any events.
687
+ - Queue all outstanding I/O (fd) events.
688
+ - Update the "event loop time" (ev_now ()), and do time jump adjustments.
689
+ - Queue all expired timers.
690
+ - Queue all expired periodics.
691
+ - Unless any events are pending now, queue all idle watchers.
692
+ - Queue all check watchers.
693
+ - Call all queued watchers in reverse order (i.e. check watchers first).
694
+ Signals and child watchers are implemented as I/O watchers, and will
695
+ be handled here by queueing them when their watcher gets executed.
696
+ - If ev_unloop has been called, or EVLOOP_ONESHOT or EVLOOP_NONBLOCK
697
+ were used, or there are no active watchers, return, otherwise
698
+ continue with step *.
699
+
700
+ Example: Queue some jobs and then loop until no events are outstanding
701
+ anymore.
702
+
703
+ ... queue jobs here, make sure they register event watchers as long
704
+ ... as they still have work to do (even an idle watcher will do..)
705
+ ev_loop (my_loop, 0);
706
+ ... jobs done or somebody called unloop. yeah!
707
+
708
+ =item ev_unloop (loop, how)
709
+
710
+ Can be used to make a call to C<ev_loop> return early (but only after it
711
+ has processed all outstanding events). The C<how> argument must be either
712
+ C<EVUNLOOP_ONE>, which will make the innermost C<ev_loop> call return, or
713
+ C<EVUNLOOP_ALL>, which will make all nested C<ev_loop> calls return.
714
+
715
+ This "unloop state" will be cleared when entering C<ev_loop> again.
716
+
717
+ It is safe to call C<ev_unloop> from otuside any C<ev_loop> calls.
718
+
719
+ =item ev_ref (loop)
720
+
721
+ =item ev_unref (loop)
722
+
723
+ Ref/unref can be used to add or remove a reference count on the event
724
+ loop: Every watcher keeps one reference, and as long as the reference
725
+ count is nonzero, C<ev_loop> will not return on its own.
726
+
727
+ If you have a watcher you never unregister that should not keep C<ev_loop>
728
+ from returning, call ev_unref() after starting, and ev_ref() before
729
+ stopping it.
730
+
731
+ As an example, libev itself uses this for its internal signal pipe: It is
732
+ not visible to the libev user and should not keep C<ev_loop> from exiting
733
+ if no event watchers registered by it are active. It is also an excellent
734
+ way to do this for generic recurring timers or from within third-party
735
+ libraries. Just remember to I<unref after start> and I<ref before stop>
736
+ (but only if the watcher wasn't active before, or was active before,
737
+ respectively).
738
+
739
+ Example: Create a signal watcher, but keep it from keeping C<ev_loop>
740
+ running when nothing else is active.
741
+
742
+ ev_signal exitsig;
743
+ ev_signal_init (&exitsig, sig_cb, SIGINT);
744
+ ev_signal_start (loop, &exitsig);
745
+ evf_unref (loop);
746
+
747
+ Example: For some weird reason, unregister the above signal handler again.
748
+
749
+ ev_ref (loop);
750
+ ev_signal_stop (loop, &exitsig);
751
+
752
+ =item ev_set_io_collect_interval (loop, ev_tstamp interval)
753
+
754
+ =item ev_set_timeout_collect_interval (loop, ev_tstamp interval)
755
+
756
+ These advanced functions influence the time that libev will spend waiting
757
+ for events. Both time intervals are by default C<0>, meaning that libev
758
+ will try to invoke timer/periodic callbacks and I/O callbacks with minimum
759
+ latency.
760
+
761
+ Setting these to a higher value (the C<interval> I<must> be >= C<0>)
762
+ allows libev to delay invocation of I/O and timer/periodic callbacks
763
+ to increase efficiency of loop iterations (or to increase power-saving
764
+ opportunities).
765
+
766
+ The idea is that sometimes your program runs just fast enough to handle
767
+ one (or very few) event(s) per loop iteration. While this makes the
768
+ program responsive, it also wastes a lot of CPU time to poll for new
769
+ events, especially with backends like C<select ()> which have a high
770
+ overhead for the actual polling but can deliver many events at once.
771
+
772
+ By setting a higher I<io collect interval> you allow libev to spend more
773
+ time collecting I/O events, so you can handle more events per iteration,
774
+ at the cost of increasing latency. Timeouts (both C<ev_periodic> and
775
+ C<ev_timer>) will be not affected. Setting this to a non-null value will
776
+ introduce an additional C<ev_sleep ()> call into most loop iterations.
777
+
778
+ Likewise, by setting a higher I<timeout collect interval> you allow libev
779
+ to spend more time collecting timeouts, at the expense of increased
780
+ latency/jitter/inexactness (the watcher callback will be called
781
+ later). C<ev_io> watchers will not be affected. Setting this to a non-null
782
+ value will not introduce any overhead in libev.
783
+
784
+ Many (busy) programs can usually benefit by setting the I/O collect
785
+ interval to a value near C<0.1> or so, which is often enough for
786
+ interactive servers (of course not for games), likewise for timeouts. It
787
+ usually doesn't make much sense to set it to a lower value than C<0.01>,
788
+ as this approaches the timing granularity of most systems.
789
+
790
+ Setting the I<timeout collect interval> can improve the opportunity for
791
+ saving power, as the program will "bundle" timer callback invocations that
792
+ are "near" in time together, by delaying some, thus reducing the number of
793
+ times the process sleeps and wakes up again. Another useful technique to
794
+ reduce iterations/wake-ups is to use C<ev_periodic> watchers and make sure
795
+ they fire on, say, one-second boundaries only.
796
+
797
+ =item ev_loop_verify (loop)
798
+
799
+ This function only does something when C<EV_VERIFY> support has been
800
+ compiled in, which is the default for non-minimal builds. It tries to go
801
+ through all internal structures and checks them for validity. If anything
802
+ is found to be inconsistent, it will print an error message to standard
803
+ error and call C<abort ()>.
804
+
805
+ This can be used to catch bugs inside libev itself: under normal
806
+ circumstances, this function will never abort as of course libev keeps its
807
+ data structures consistent.
808
+
809
+ =back
810
+
811
+
812
+ =head1 ANATOMY OF A WATCHER
813
+
814
+ In the following description, uppercase C<TYPE> in names stands for the
815
+ watcher type, e.g. C<ev_TYPE_start> can mean C<ev_timer_start> for timer
816
+ watchers and C<ev_io_start> for I/O watchers.
817
+
818
+ A watcher is a structure that you create and register to record your
819
+ interest in some event. For instance, if you want to wait for STDIN to
820
+ become readable, you would create an C<ev_io> watcher for that:
821
+
822
+ static void my_cb (struct ev_loop *loop, ev_io *w, int revents)
823
+ {
824
+ ev_io_stop (w);
825
+ ev_unloop (loop, EVUNLOOP_ALL);
826
+ }
827
+
828
+ struct ev_loop *loop = ev_default_loop (0);
829
+
830
+ ev_io stdin_watcher;
831
+
832
+ ev_init (&stdin_watcher, my_cb);
833
+ ev_io_set (&stdin_watcher, STDIN_FILENO, EV_READ);
834
+ ev_io_start (loop, &stdin_watcher);
835
+
836
+ ev_loop (loop, 0);
837
+
838
+ As you can see, you are responsible for allocating the memory for your
839
+ watcher structures (and it is I<usually> a bad idea to do this on the
840
+ stack).
841
+
842
+ Each watcher has an associated watcher structure (called C<struct ev_TYPE>
843
+ or simply C<ev_TYPE>, as typedefs are provided for all watcher structs).
844
+
845
+ Each watcher structure must be initialised by a call to C<ev_init
846
+ (watcher *, callback)>, which expects a callback to be provided. This
847
+ callback gets invoked each time the event occurs (or, in the case of I/O
848
+ watchers, each time the event loop detects that the file descriptor given
849
+ is readable and/or writable).
850
+
851
+ Each watcher type further has its own C<< ev_TYPE_set (watcher *, ...) >>
852
+ macro to configure it, with arguments specific to the watcher type. There
853
+ is also a macro to combine initialisation and setting in one call: C<<
854
+ ev_TYPE_init (watcher *, callback, ...) >>.
855
+
856
+ To make the watcher actually watch out for events, you have to start it
857
+ with a watcher-specific start function (C<< ev_TYPE_start (loop, watcher
858
+ *) >>), and you can stop watching for events at any time by calling the
859
+ corresponding stop function (C<< ev_TYPE_stop (loop, watcher *) >>.
860
+
861
+ As long as your watcher is active (has been started but not stopped) you
862
+ must not touch the values stored in it. Most specifically you must never
863
+ reinitialise it or call its C<ev_TYPE_set> macro.
864
+
865
+ Each and every callback receives the event loop pointer as first, the
866
+ registered watcher structure as second, and a bitset of received events as
867
+ third argument.
868
+
869
+ The received events usually include a single bit per event type received
870
+ (you can receive multiple events at the same time). The possible bit masks
871
+ are:
872
+
873
+ =over 4
874
+
875
+ =item C<EV_READ>
876
+
877
+ =item C<EV_WRITE>
878
+
879
+ The file descriptor in the C<ev_io> watcher has become readable and/or
880
+ writable.
881
+
882
+ =item C<EV_TIMEOUT>
883
+
884
+ The C<ev_timer> watcher has timed out.
885
+
886
+ =item C<EV_PERIODIC>
887
+
888
+ The C<ev_periodic> watcher has timed out.
889
+
890
+ =item C<EV_SIGNAL>
891
+
892
+ The signal specified in the C<ev_signal> watcher has been received by a thread.
893
+
894
+ =item C<EV_CHILD>
895
+
896
+ The pid specified in the C<ev_child> watcher has received a status change.
897
+
898
+ =item C<EV_STAT>
899
+
900
+ The path specified in the C<ev_stat> watcher changed its attributes somehow.
901
+
902
+ =item C<EV_IDLE>
903
+
904
+ The C<ev_idle> watcher has determined that you have nothing better to do.
905
+
906
+ =item C<EV_PREPARE>
907
+
908
+ =item C<EV_CHECK>
909
+
910
+ All C<ev_prepare> watchers are invoked just I<before> C<ev_loop> starts
911
+ to gather new events, and all C<ev_check> watchers are invoked just after
912
+ C<ev_loop> has gathered them, but before it invokes any callbacks for any
913
+ received events. Callbacks of both watcher types can start and stop as
914
+ many watchers as they want, and all of them will be taken into account
915
+ (for example, a C<ev_prepare> watcher might start an idle watcher to keep
916
+ C<ev_loop> from blocking).
917
+
918
+ =item C<EV_EMBED>
919
+
920
+ The embedded event loop specified in the C<ev_embed> watcher needs attention.
921
+
922
+ =item C<EV_FORK>
923
+
924
+ The event loop has been resumed in the child process after fork (see
925
+ C<ev_fork>).
926
+
927
+ =item C<EV_ASYNC>
928
+
929
+ The given async watcher has been asynchronously notified (see C<ev_async>).
930
+
931
+ =item C<EV_ERROR>
932
+
933
+ An unspecified error has occurred, the watcher has been stopped. This might
934
+ happen because the watcher could not be properly started because libev
935
+ ran out of memory, a file descriptor was found to be closed or any other
936
+ problem. Libev considers these application bugs.
937
+
938
+ You best act on it by reporting the problem and somehow coping with the
939
+ watcher being stopped. Note that well-written programs should not receive
940
+ an error ever, so when your watcher receives it, this usually indicates a
941
+ bug in your program.
942
+
943
+ Libev will usually signal a few "dummy" events together with an error, for
944
+ example it might indicate that a fd is readable or writable, and if your
945
+ callbacks is well-written it can just attempt the operation and cope with
946
+ the error from read() or write(). This will not work in multi-threaded
947
+ programs, though, as the fd could already be closed and reused for another
948
+ thing, so beware.
949
+
950
+ =back
951
+
952
+ =head2 GENERIC WATCHER FUNCTIONS
953
+
954
+ =over 4
955
+
956
+ =item C<ev_init> (ev_TYPE *watcher, callback)
957
+
958
+ This macro initialises the generic portion of a watcher. The contents
959
+ of the watcher object can be arbitrary (so C<malloc> will do). Only
960
+ the generic parts of the watcher are initialised, you I<need> to call
961
+ the type-specific C<ev_TYPE_set> macro afterwards to initialise the
962
+ type-specific parts. For each type there is also a C<ev_TYPE_init> macro
963
+ which rolls both calls into one.
964
+
965
+ You can reinitialise a watcher at any time as long as it has been stopped
966
+ (or never started) and there are no pending events outstanding.
967
+
968
+ The callback is always of type C<void (*)(struct ev_loop *loop, ev_TYPE *watcher,
969
+ int revents)>.
970
+
971
+ Example: Initialise an C<ev_io> watcher in two steps.
972
+
973
+ ev_io w;
974
+ ev_init (&w, my_cb);
975
+ ev_io_set (&w, STDIN_FILENO, EV_READ);
976
+
977
+ =item C<ev_TYPE_set> (ev_TYPE *, [args])
978
+
979
+ This macro initialises the type-specific parts of a watcher. You need to
980
+ call C<ev_init> at least once before you call this macro, but you can
981
+ call C<ev_TYPE_set> any number of times. You must not, however, call this
982
+ macro on a watcher that is active (it can be pending, however, which is a
983
+ difference to the C<ev_init> macro).
984
+
985
+ Although some watcher types do not have type-specific arguments
986
+ (e.g. C<ev_prepare>) you still need to call its C<set> macro.
987
+
988
+ See C<ev_init>, above, for an example.
989
+
990
+ =item C<ev_TYPE_init> (ev_TYPE *watcher, callback, [args])
991
+
992
+ This convenience macro rolls both C<ev_init> and C<ev_TYPE_set> macro
993
+ calls into a single call. This is the most convenient method to initialise
994
+ a watcher. The same limitations apply, of course.
995
+
996
+ Example: Initialise and set an C<ev_io> watcher in one step.
997
+
998
+ ev_io_init (&w, my_cb, STDIN_FILENO, EV_READ);
999
+
1000
+ =item C<ev_TYPE_start> (loop *, ev_TYPE *watcher)
1001
+
1002
+ Starts (activates) the given watcher. Only active watchers will receive
1003
+ events. If the watcher is already active nothing will happen.
1004
+
1005
+ Example: Start the C<ev_io> watcher that is being abused as example in this
1006
+ whole section.
1007
+
1008
+ ev_io_start (EV_DEFAULT_UC, &w);
1009
+
1010
+ =item C<ev_TYPE_stop> (loop *, ev_TYPE *watcher)
1011
+
1012
+ Stops the given watcher if active, and clears the pending status (whether
1013
+ the watcher was active or not).
1014
+
1015
+ It is possible that stopped watchers are pending - for example,
1016
+ non-repeating timers are being stopped when they become pending - but
1017
+ calling C<ev_TYPE_stop> ensures that the watcher is neither active nor
1018
+ pending. If you want to free or reuse the memory used by the watcher it is
1019
+ therefore a good idea to always call its C<ev_TYPE_stop> function.
1020
+
1021
+ =item bool ev_is_active (ev_TYPE *watcher)
1022
+
1023
+ Returns a true value iff the watcher is active (i.e. it has been started
1024
+ and not yet been stopped). As long as a watcher is active you must not modify
1025
+ it.
1026
+
1027
+ =item bool ev_is_pending (ev_TYPE *watcher)
1028
+
1029
+ Returns a true value iff the watcher is pending, (i.e. it has outstanding
1030
+ events but its callback has not yet been invoked). As long as a watcher
1031
+ is pending (but not active) you must not call an init function on it (but
1032
+ C<ev_TYPE_set> is safe), you must not change its priority, and you must
1033
+ make sure the watcher is available to libev (e.g. you cannot C<free ()>
1034
+ it).
1035
+
1036
+ =item callback ev_cb (ev_TYPE *watcher)
1037
+
1038
+ Returns the callback currently set on the watcher.
1039
+
1040
+ =item ev_cb_set (ev_TYPE *watcher, callback)
1041
+
1042
+ Change the callback. You can change the callback at virtually any time
1043
+ (modulo threads).
1044
+
1045
+ =item ev_set_priority (ev_TYPE *watcher, priority)
1046
+
1047
+ =item int ev_priority (ev_TYPE *watcher)
1048
+
1049
+ Set and query the priority of the watcher. The priority is a small
1050
+ integer between C<EV_MAXPRI> (default: C<2>) and C<EV_MINPRI>
1051
+ (default: C<-2>). Pending watchers with higher priority will be invoked
1052
+ before watchers with lower priority, but priority will not keep watchers
1053
+ from being executed (except for C<ev_idle> watchers).
1054
+
1055
+ This means that priorities are I<only> used for ordering callback
1056
+ invocation after new events have been received. This is useful, for
1057
+ example, to reduce latency after idling, or more often, to bind two
1058
+ watchers on the same event and make sure one is called first.
1059
+
1060
+ If you need to suppress invocation when higher priority events are pending
1061
+ you need to look at C<ev_idle> watchers, which provide this functionality.
1062
+
1063
+ You I<must not> change the priority of a watcher as long as it is active or
1064
+ pending.
1065
+
1066
+ The default priority used by watchers when no priority has been set is
1067
+ always C<0>, which is supposed to not be too high and not be too low :).
1068
+
1069
+ Setting a priority outside the range of C<EV_MINPRI> to C<EV_MAXPRI> is
1070
+ fine, as long as you do not mind that the priority value you query might
1071
+ or might not have been clamped to the valid range.
1072
+
1073
+ =item ev_invoke (loop, ev_TYPE *watcher, int revents)
1074
+
1075
+ Invoke the C<watcher> with the given C<loop> and C<revents>. Neither
1076
+ C<loop> nor C<revents> need to be valid as long as the watcher callback
1077
+ can deal with that fact, as both are simply passed through to the
1078
+ callback.
1079
+
1080
+ =item int ev_clear_pending (loop, ev_TYPE *watcher)
1081
+
1082
+ If the watcher is pending, this function clears its pending status and
1083
+ returns its C<revents> bitset (as if its callback was invoked). If the
1084
+ watcher isn't pending it does nothing and returns C<0>.
1085
+
1086
+ Sometimes it can be useful to "poll" a watcher instead of waiting for its
1087
+ callback to be invoked, which can be accomplished with this function.
1088
+
1089
+ =back
1090
+
1091
+
1092
+ =head2 ASSOCIATING CUSTOM DATA WITH A WATCHER
1093
+
1094
+ Each watcher has, by default, a member C<void *data> that you can change
1095
+ and read at any time: libev will completely ignore it. This can be used
1096
+ to associate arbitrary data with your watcher. If you need more data and
1097
+ don't want to allocate memory and store a pointer to it in that data
1098
+ member, you can also "subclass" the watcher type and provide your own
1099
+ data:
1100
+
1101
+ struct my_io
1102
+ {
1103
+ ev_io io;
1104
+ int otherfd;
1105
+ void *somedata;
1106
+ struct whatever *mostinteresting;
1107
+ };
1108
+
1109
+ ...
1110
+ struct my_io w;
1111
+ ev_io_init (&w.io, my_cb, fd, EV_READ);
1112
+
1113
+ And since your callback will be called with a pointer to the watcher, you
1114
+ can cast it back to your own type:
1115
+
1116
+ static void my_cb (struct ev_loop *loop, ev_io *w_, int revents)
1117
+ {
1118
+ struct my_io *w = (struct my_io *)w_;
1119
+ ...
1120
+ }
1121
+
1122
+ More interesting and less C-conformant ways of casting your callback type
1123
+ instead have been omitted.
1124
+
1125
+ Another common scenario is to use some data structure with multiple
1126
+ embedded watchers:
1127
+
1128
+ struct my_biggy
1129
+ {
1130
+ int some_data;
1131
+ ev_timer t1;
1132
+ ev_timer t2;
1133
+ }
1134
+
1135
+ In this case getting the pointer to C<my_biggy> is a bit more
1136
+ complicated: Either you store the address of your C<my_biggy> struct
1137
+ in the C<data> member of the watcher (for woozies), or you need to use
1138
+ some pointer arithmetic using C<offsetof> inside your watchers (for real
1139
+ programmers):
1140
+
1141
+ #include <stddef.h>
1142
+
1143
+ static void
1144
+ t1_cb (EV_P_ ev_timer *w, int revents)
1145
+ {
1146
+ struct my_biggy big = (struct my_biggy *
1147
+ (((char *)w) - offsetof (struct my_biggy, t1));
1148
+ }
1149
+
1150
+ static void
1151
+ t2_cb (EV_P_ ev_timer *w, int revents)
1152
+ {
1153
+ struct my_biggy big = (struct my_biggy *
1154
+ (((char *)w) - offsetof (struct my_biggy, t2));
1155
+ }
1156
+
1157
+
1158
+ =head1 WATCHER TYPES
1159
+
1160
+ This section describes each watcher in detail, but will not repeat
1161
+ information given in the last section. Any initialisation/set macros,
1162
+ functions and members specific to the watcher type are explained.
1163
+
1164
+ Members are additionally marked with either I<[read-only]>, meaning that,
1165
+ while the watcher is active, you can look at the member and expect some
1166
+ sensible content, but you must not modify it (you can modify it while the
1167
+ watcher is stopped to your hearts content), or I<[read-write]>, which
1168
+ means you can expect it to have some sensible content while the watcher
1169
+ is active, but you can also modify it. Modifying it may not do something
1170
+ sensible or take immediate effect (or do anything at all), but libev will
1171
+ not crash or malfunction in any way.
1172
+
1173
+
1174
+ =head2 C<ev_io> - is this file descriptor readable or writable?
1175
+
1176
+ I/O watchers check whether a file descriptor is readable or writable
1177
+ in each iteration of the event loop, or, more precisely, when reading
1178
+ would not block the process and writing would at least be able to write
1179
+ some data. This behaviour is called level-triggering because you keep
1180
+ receiving events as long as the condition persists. Remember you can stop
1181
+ the watcher if you don't want to act on the event and neither want to
1182
+ receive future events.
1183
+
1184
+ In general you can register as many read and/or write event watchers per
1185
+ fd as you want (as long as you don't confuse yourself). Setting all file
1186
+ descriptors to non-blocking mode is also usually a good idea (but not
1187
+ required if you know what you are doing).
1188
+
1189
+ If you cannot use non-blocking mode, then force the use of a
1190
+ known-to-be-good backend (at the time of this writing, this includes only
1191
+ C<EVBACKEND_SELECT> and C<EVBACKEND_POLL>).
1192
+
1193
+ Another thing you have to watch out for is that it is quite easy to
1194
+ receive "spurious" readiness notifications, that is your callback might
1195
+ be called with C<EV_READ> but a subsequent C<read>(2) will actually block
1196
+ because there is no data. Not only are some backends known to create a
1197
+ lot of those (for example Solaris ports), it is very easy to get into
1198
+ this situation even with a relatively standard program structure. Thus
1199
+ it is best to always use non-blocking I/O: An extra C<read>(2) returning
1200
+ C<EAGAIN> is far preferable to a program hanging until some data arrives.
1201
+
1202
+ If you cannot run the fd in non-blocking mode (for example you should
1203
+ not play around with an Xlib connection), then you have to separately
1204
+ re-test whether a file descriptor is really ready with a known-to-be good
1205
+ interface such as poll (fortunately in our Xlib example, Xlib already
1206
+ does this on its own, so its quite safe to use). Some people additionally
1207
+ use C<SIGALRM> and an interval timer, just to be sure you won't block
1208
+ indefinitely.
1209
+
1210
+ But really, best use non-blocking mode.
1211
+
1212
+ =head3 The special problem of disappearing file descriptors
1213
+
1214
+ Some backends (e.g. kqueue, epoll) need to be told about closing a file
1215
+ descriptor (either due to calling C<close> explicitly or any other means,
1216
+ such as C<dup2>). The reason is that you register interest in some file
1217
+ descriptor, but when it goes away, the operating system will silently drop
1218
+ this interest. If another file descriptor with the same number then is
1219
+ registered with libev, there is no efficient way to see that this is, in
1220
+ fact, a different file descriptor.
1221
+
1222
+ To avoid having to explicitly tell libev about such cases, libev follows
1223
+ the following policy: Each time C<ev_io_set> is being called, libev
1224
+ will assume that this is potentially a new file descriptor, otherwise
1225
+ it is assumed that the file descriptor stays the same. That means that
1226
+ you I<have> to call C<ev_io_set> (or C<ev_io_init>) when you change the
1227
+ descriptor even if the file descriptor number itself did not change.
1228
+
1229
+ This is how one would do it normally anyway, the important point is that
1230
+ the libev application should not optimise around libev but should leave
1231
+ optimisations to libev.
1232
+
1233
+ =head3 The special problem of dup'ed file descriptors
1234
+
1235
+ Some backends (e.g. epoll), cannot register events for file descriptors,
1236
+ but only events for the underlying file descriptions. That means when you
1237
+ have C<dup ()>'ed file descriptors or weirder constellations, and register
1238
+ events for them, only one file descriptor might actually receive events.
1239
+
1240
+ There is no workaround possible except not registering events
1241
+ for potentially C<dup ()>'ed file descriptors, or to resort to
1242
+ C<EVBACKEND_SELECT> or C<EVBACKEND_POLL>.
1243
+
1244
+ =head3 The special problem of fork
1245
+
1246
+ Some backends (epoll, kqueue) do not support C<fork ()> at all or exhibit
1247
+ useless behaviour. Libev fully supports fork, but needs to be told about
1248
+ it in the child.
1249
+
1250
+ To support fork in your programs, you either have to call
1251
+ C<ev_default_fork ()> or C<ev_loop_fork ()> after a fork in the child,
1252
+ enable C<EVFLAG_FORKCHECK>, or resort to C<EVBACKEND_SELECT> or
1253
+ C<EVBACKEND_POLL>.
1254
+
1255
+ =head3 The special problem of SIGPIPE
1256
+
1257
+ While not really specific to libev, it is easy to forget about C<SIGPIPE>:
1258
+ when writing to a pipe whose other end has been closed, your program gets
1259
+ sent a SIGPIPE, which, by default, aborts your program. For most programs
1260
+ this is sensible behaviour, for daemons, this is usually undesirable.
1261
+
1262
+ So when you encounter spurious, unexplained daemon exits, make sure you
1263
+ ignore SIGPIPE (and maybe make sure you log the exit status of your daemon
1264
+ somewhere, as that would have given you a big clue).
1265
+
1266
+
1267
+ =head3 Watcher-Specific Functions
1268
+
1269
+ =over 4
1270
+
1271
+ =item ev_io_init (ev_io *, callback, int fd, int events)
1272
+
1273
+ =item ev_io_set (ev_io *, int fd, int events)
1274
+
1275
+ Configures an C<ev_io> watcher. The C<fd> is the file descriptor to
1276
+ receive events for and C<events> is either C<EV_READ>, C<EV_WRITE> or
1277
+ C<EV_READ | EV_WRITE>, to express the desire to receive the given events.
1278
+
1279
+ =item int fd [read-only]
1280
+
1281
+ The file descriptor being watched.
1282
+
1283
+ =item int events [read-only]
1284
+
1285
+ The events being watched.
1286
+
1287
+ =back
1288
+
1289
+ =head3 Examples
1290
+
1291
+ Example: Call C<stdin_readable_cb> when STDIN_FILENO has become, well
1292
+ readable, but only once. Since it is likely line-buffered, you could
1293
+ attempt to read a whole line in the callback.
1294
+
1295
+ static void
1296
+ stdin_readable_cb (struct ev_loop *loop, ev_io *w, int revents)
1297
+ {
1298
+ ev_io_stop (loop, w);
1299
+ .. read from stdin here (or from w->fd) and handle any I/O errors
1300
+ }
1301
+
1302
+ ...
1303
+ struct ev_loop *loop = ev_default_init (0);
1304
+ ev_io stdin_readable;
1305
+ ev_io_init (&stdin_readable, stdin_readable_cb, STDIN_FILENO, EV_READ);
1306
+ ev_io_start (loop, &stdin_readable);
1307
+ ev_loop (loop, 0);
1308
+
1309
+
1310
+ =head2 C<ev_timer> - relative and optionally repeating timeouts
1311
+
1312
+ Timer watchers are simple relative timers that generate an event after a
1313
+ given time, and optionally repeating in regular intervals after that.
1314
+
1315
+ The timers are based on real time, that is, if you register an event that
1316
+ times out after an hour and you reset your system clock to January last
1317
+ year, it will still time out after (roughly) one hour. "Roughly" because
1318
+ detecting time jumps is hard, and some inaccuracies are unavoidable (the
1319
+ monotonic clock option helps a lot here).
1320
+
1321
+ The callback is guaranteed to be invoked only I<after> its timeout has
1322
+ passed, but if multiple timers become ready during the same loop iteration
1323
+ then order of execution is undefined.
1324
+
1325
+ =head3 Be smart about timeouts
1326
+
1327
+ Many real-world problems involve some kind of timeout, usually for error
1328
+ recovery. A typical example is an HTTP request - if the other side hangs,
1329
+ you want to raise some error after a while.
1330
+
1331
+ What follows are some ways to handle this problem, from obvious and
1332
+ inefficient to smart and efficient.
1333
+
1334
+ In the following, a 60 second activity timeout is assumed - a timeout that
1335
+ gets reset to 60 seconds each time there is activity (e.g. each time some
1336
+ data or other life sign was received).
1337
+
1338
+ =over 4
1339
+
1340
+ =item 1. Use a timer and stop, reinitialise and start it on activity.
1341
+
1342
+ This is the most obvious, but not the most simple way: In the beginning,
1343
+ start the watcher:
1344
+
1345
+ ev_timer_init (timer, callback, 60., 0.);
1346
+ ev_timer_start (loop, timer);
1347
+
1348
+ Then, each time there is some activity, C<ev_timer_stop> it, initialise it
1349
+ and start it again:
1350
+
1351
+ ev_timer_stop (loop, timer);
1352
+ ev_timer_set (timer, 60., 0.);
1353
+ ev_timer_start (loop, timer);
1354
+
1355
+ This is relatively simple to implement, but means that each time there is
1356
+ some activity, libev will first have to remove the timer from its internal
1357
+ data structure and then add it again. Libev tries to be fast, but it's
1358
+ still not a constant-time operation.
1359
+
1360
+ =item 2. Use a timer and re-start it with C<ev_timer_again> inactivity.
1361
+
1362
+ This is the easiest way, and involves using C<ev_timer_again> instead of
1363
+ C<ev_timer_start>.
1364
+
1365
+ To implement this, configure an C<ev_timer> with a C<repeat> value
1366
+ of C<60> and then call C<ev_timer_again> at start and each time you
1367
+ successfully read or write some data. If you go into an idle state where
1368
+ you do not expect data to travel on the socket, you can C<ev_timer_stop>
1369
+ the timer, and C<ev_timer_again> will automatically restart it if need be.
1370
+
1371
+ That means you can ignore both the C<ev_timer_start> function and the
1372
+ C<after> argument to C<ev_timer_set>, and only ever use the C<repeat>
1373
+ member and C<ev_timer_again>.
1374
+
1375
+ At start:
1376
+
1377
+ ev_timer_init (timer, callback);
1378
+ timer->repeat = 60.;
1379
+ ev_timer_again (loop, timer);
1380
+
1381
+ Each time there is some activity:
1382
+
1383
+ ev_timer_again (loop, timer);
1384
+
1385
+ It is even possible to change the time-out on the fly, regardless of
1386
+ whether the watcher is active or not:
1387
+
1388
+ timer->repeat = 30.;
1389
+ ev_timer_again (loop, timer);
1390
+
1391
+ This is slightly more efficient then stopping/starting the timer each time
1392
+ you want to modify its timeout value, as libev does not have to completely
1393
+ remove and re-insert the timer from/into its internal data structure.
1394
+
1395
+ It is, however, even simpler than the "obvious" way to do it.
1396
+
1397
+ =item 3. Let the timer time out, but then re-arm it as required.
1398
+
1399
+ This method is more tricky, but usually most efficient: Most timeouts are
1400
+ relatively long compared to the intervals between other activity - in
1401
+ our example, within 60 seconds, there are usually many I/O events with
1402
+ associated activity resets.
1403
+
1404
+ In this case, it would be more efficient to leave the C<ev_timer> alone,
1405
+ but remember the time of last activity, and check for a real timeout only
1406
+ within the callback:
1407
+
1408
+ ev_tstamp last_activity; // time of last activity
1409
+
1410
+ static void
1411
+ callback (EV_P_ ev_timer *w, int revents)
1412
+ {
1413
+ ev_tstamp now = ev_now (EV_A);
1414
+ ev_tstamp timeout = last_activity + 60.;
1415
+
1416
+ // if last_activity + 60. is older than now, we did time out
1417
+ if (timeout < now)
1418
+ {
1419
+ // timeout occured, take action
1420
+ }
1421
+ else
1422
+ {
1423
+ // callback was invoked, but there was some activity, re-arm
1424
+ // the watcher to fire in last_activity + 60, which is
1425
+ // guaranteed to be in the future, so "again" is positive:
1426
+ w->repeat = timeout - now;
1427
+ ev_timer_again (EV_A_ w);
1428
+ }
1429
+ }
1430
+
1431
+ To summarise the callback: first calculate the real timeout (defined
1432
+ as "60 seconds after the last activity"), then check if that time has
1433
+ been reached, which means something I<did>, in fact, time out. Otherwise
1434
+ the callback was invoked too early (C<timeout> is in the future), so
1435
+ re-schedule the timer to fire at that future time, to see if maybe we have
1436
+ a timeout then.
1437
+
1438
+ Note how C<ev_timer_again> is used, taking advantage of the
1439
+ C<ev_timer_again> optimisation when the timer is already running.
1440
+
1441
+ This scheme causes more callback invocations (about one every 60 seconds
1442
+ minus half the average time between activity), but virtually no calls to
1443
+ libev to change the timeout.
1444
+
1445
+ To start the timer, simply initialise the watcher and set C<last_activity>
1446
+ to the current time (meaning we just have some activity :), then call the
1447
+ callback, which will "do the right thing" and start the timer:
1448
+
1449
+ ev_timer_init (timer, callback);
1450
+ last_activity = ev_now (loop);
1451
+ callback (loop, timer, EV_TIMEOUT);
1452
+
1453
+ And when there is some activity, simply store the current time in
1454
+ C<last_activity>, no libev calls at all:
1455
+
1456
+ last_actiivty = ev_now (loop);
1457
+
1458
+ This technique is slightly more complex, but in most cases where the
1459
+ time-out is unlikely to be triggered, much more efficient.
1460
+
1461
+ Changing the timeout is trivial as well (if it isn't hard-coded in the
1462
+ callback :) - just change the timeout and invoke the callback, which will
1463
+ fix things for you.
1464
+
1465
+ =item 4. Wee, just use a double-linked list for your timeouts.
1466
+
1467
+ If there is not one request, but many thousands (millions...), all
1468
+ employing some kind of timeout with the same timeout value, then one can
1469
+ do even better:
1470
+
1471
+ When starting the timeout, calculate the timeout value and put the timeout
1472
+ at the I<end> of the list.
1473
+
1474
+ Then use an C<ev_timer> to fire when the timeout at the I<beginning> of
1475
+ the list is expected to fire (for example, using the technique #3).
1476
+
1477
+ When there is some activity, remove the timer from the list, recalculate
1478
+ the timeout, append it to the end of the list again, and make sure to
1479
+ update the C<ev_timer> if it was taken from the beginning of the list.
1480
+
1481
+ This way, one can manage an unlimited number of timeouts in O(1) time for
1482
+ starting, stopping and updating the timers, at the expense of a major
1483
+ complication, and having to use a constant timeout. The constant timeout
1484
+ ensures that the list stays sorted.
1485
+
1486
+ =back
1487
+
1488
+ So which method the best?
1489
+
1490
+ Method #2 is a simple no-brain-required solution that is adequate in most
1491
+ situations. Method #3 requires a bit more thinking, but handles many cases
1492
+ better, and isn't very complicated either. In most case, choosing either
1493
+ one is fine, with #3 being better in typical situations.
1494
+
1495
+ Method #1 is almost always a bad idea, and buys you nothing. Method #4 is
1496
+ rather complicated, but extremely efficient, something that really pays
1497
+ off after the first million or so of active timers, i.e. it's usually
1498
+ overkill :)
1499
+
1500
+ =head3 The special problem of time updates
1501
+
1502
+ Establishing the current time is a costly operation (it usually takes at
1503
+ least two system calls): EV therefore updates its idea of the current
1504
+ time only before and after C<ev_loop> collects new events, which causes a
1505
+ growing difference between C<ev_now ()> and C<ev_time ()> when handling
1506
+ lots of events in one iteration.
1507
+
1508
+ The relative timeouts are calculated relative to the C<ev_now ()>
1509
+ time. This is usually the right thing as this timestamp refers to the time
1510
+ of the event triggering whatever timeout you are modifying/starting. If
1511
+ you suspect event processing to be delayed and you I<need> to base the
1512
+ timeout on the current time, use something like this to adjust for this:
1513
+
1514
+ ev_timer_set (&timer, after + ev_now () - ev_time (), 0.);
1515
+
1516
+ If the event loop is suspended for a long time, you can also force an
1517
+ update of the time returned by C<ev_now ()> by calling C<ev_now_update
1518
+ ()>.
1519
+
1520
+ =head3 Watcher-Specific Functions and Data Members
1521
+
1522
+ =over 4
1523
+
1524
+ =item ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)
1525
+
1526
+ =item ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)
1527
+
1528
+ Configure the timer to trigger after C<after> seconds. If C<repeat>
1529
+ is C<0.>, then it will automatically be stopped once the timeout is
1530
+ reached. If it is positive, then the timer will automatically be
1531
+ configured to trigger again C<repeat> seconds later, again, and again,
1532
+ until stopped manually.
1533
+
1534
+ The timer itself will do a best-effort at avoiding drift, that is, if
1535
+ you configure a timer to trigger every 10 seconds, then it will normally
1536
+ trigger at exactly 10 second intervals. If, however, your program cannot
1537
+ keep up with the timer (because it takes longer than those 10 seconds to
1538
+ do stuff) the timer will not fire more than once per event loop iteration.
1539
+
1540
+ =item ev_timer_again (loop, ev_timer *)
1541
+
1542
+ This will act as if the timer timed out and restart it again if it is
1543
+ repeating. The exact semantics are:
1544
+
1545
+ If the timer is pending, its pending status is cleared.
1546
+
1547
+ If the timer is started but non-repeating, stop it (as if it timed out).
1548
+
1549
+ If the timer is repeating, either start it if necessary (with the
1550
+ C<repeat> value), or reset the running timer to the C<repeat> value.
1551
+
1552
+ This sounds a bit complicated, see "Be smart about timeouts", above, for a
1553
+ usage example.
1554
+
1555
+ =item ev_tstamp repeat [read-write]
1556
+
1557
+ The current C<repeat> value. Will be used each time the watcher times out
1558
+ or C<ev_timer_again> is called, and determines the next timeout (if any),
1559
+ which is also when any modifications are taken into account.
1560
+
1561
+ =back
1562
+
1563
+ =head3 Examples
1564
+
1565
+ Example: Create a timer that fires after 60 seconds.
1566
+
1567
+ static void
1568
+ one_minute_cb (struct ev_loop *loop, ev_timer *w, int revents)
1569
+ {
1570
+ .. one minute over, w is actually stopped right here
1571
+ }
1572
+
1573
+ ev_timer mytimer;
1574
+ ev_timer_init (&mytimer, one_minute_cb, 60., 0.);
1575
+ ev_timer_start (loop, &mytimer);
1576
+
1577
+ Example: Create a timeout timer that times out after 10 seconds of
1578
+ inactivity.
1579
+
1580
+ static void
1581
+ timeout_cb (struct ev_loop *loop, ev_timer *w, int revents)
1582
+ {
1583
+ .. ten seconds without any activity
1584
+ }
1585
+
1586
+ ev_timer mytimer;
1587
+ ev_timer_init (&mytimer, timeout_cb, 0., 10.); /* note, only repeat used */
1588
+ ev_timer_again (&mytimer); /* start timer */
1589
+ ev_loop (loop, 0);
1590
+
1591
+ // and in some piece of code that gets executed on any "activity":
1592
+ // reset the timeout to start ticking again at 10 seconds
1593
+ ev_timer_again (&mytimer);
1594
+
1595
+
1596
+ =head2 C<ev_periodic> - to cron or not to cron?
1597
+
1598
+ Periodic watchers are also timers of a kind, but they are very versatile
1599
+ (and unfortunately a bit complex).
1600
+
1601
+ Unlike C<ev_timer>'s, they are not based on real time (or relative time)
1602
+ but on wall clock time (absolute time). You can tell a periodic watcher
1603
+ to trigger after some specific point in time. For example, if you tell a
1604
+ periodic watcher to trigger in 10 seconds (by specifying e.g. C<ev_now ()
1605
+ + 10.>, that is, an absolute time not a delay) and then reset your system
1606
+ clock to January of the previous year, then it will take more than year
1607
+ to trigger the event (unlike an C<ev_timer>, which would still trigger
1608
+ roughly 10 seconds later as it uses a relative timeout).
1609
+
1610
+ C<ev_periodic>s can also be used to implement vastly more complex timers,
1611
+ such as triggering an event on each "midnight, local time", or other
1612
+ complicated rules.
1613
+
1614
+ As with timers, the callback is guaranteed to be invoked only when the
1615
+ time (C<at>) has passed, but if multiple periodic timers become ready
1616
+ during the same loop iteration, then order of execution is undefined.
1617
+
1618
+ =head3 Watcher-Specific Functions and Data Members
1619
+
1620
+ =over 4
1621
+
1622
+ =item ev_periodic_init (ev_periodic *, callback, ev_tstamp at, ev_tstamp interval, reschedule_cb)
1623
+
1624
+ =item ev_periodic_set (ev_periodic *, ev_tstamp after, ev_tstamp repeat, reschedule_cb)
1625
+
1626
+ Lots of arguments, lets sort it out... There are basically three modes of
1627
+ operation, and we will explain them from simplest to most complex:
1628
+
1629
+ =over 4
1630
+
1631
+ =item * absolute timer (at = time, interval = reschedule_cb = 0)
1632
+
1633
+ In this configuration the watcher triggers an event after the wall clock
1634
+ time C<at> has passed. It will not repeat and will not adjust when a time
1635
+ jump occurs, that is, if it is to be run at January 1st 2011 then it will
1636
+ only run when the system clock reaches or surpasses this time.
1637
+
1638
+ =item * repeating interval timer (at = offset, interval > 0, reschedule_cb = 0)
1639
+
1640
+ In this mode the watcher will always be scheduled to time out at the next
1641
+ C<at + N * interval> time (for some integer N, which can also be negative)
1642
+ and then repeat, regardless of any time jumps.
1643
+
1644
+ This can be used to create timers that do not drift with respect to the
1645
+ system clock, for example, here is a C<ev_periodic> that triggers each
1646
+ hour, on the hour:
1647
+
1648
+ ev_periodic_set (&periodic, 0., 3600., 0);
1649
+
1650
+ This doesn't mean there will always be 3600 seconds in between triggers,
1651
+ but only that the callback will be called when the system time shows a
1652
+ full hour (UTC), or more correctly, when the system time is evenly divisible
1653
+ by 3600.
1654
+
1655
+ Another way to think about it (for the mathematically inclined) is that
1656
+ C<ev_periodic> will try to run the callback in this mode at the next possible
1657
+ time where C<time = at (mod interval)>, regardless of any time jumps.
1658
+
1659
+ For numerical stability it is preferable that the C<at> value is near
1660
+ C<ev_now ()> (the current time), but there is no range requirement for
1661
+ this value, and in fact is often specified as zero.
1662
+
1663
+ Note also that there is an upper limit to how often a timer can fire (CPU
1664
+ speed for example), so if C<interval> is very small then timing stability
1665
+ will of course deteriorate. Libev itself tries to be exact to be about one
1666
+ millisecond (if the OS supports it and the machine is fast enough).
1667
+
1668
+ =item * manual reschedule mode (at and interval ignored, reschedule_cb = callback)
1669
+
1670
+ In this mode the values for C<interval> and C<at> are both being
1671
+ ignored. Instead, each time the periodic watcher gets scheduled, the
1672
+ reschedule callback will be called with the watcher as first, and the
1673
+ current time as second argument.
1674
+
1675
+ NOTE: I<This callback MUST NOT stop or destroy any periodic watcher,
1676
+ ever, or make ANY event loop modifications whatsoever>.
1677
+
1678
+ If you need to stop it, return C<now + 1e30> (or so, fudge fudge) and stop
1679
+ it afterwards (e.g. by starting an C<ev_prepare> watcher, which is the
1680
+ only event loop modification you are allowed to do).
1681
+
1682
+ The callback prototype is C<ev_tstamp (*reschedule_cb)(ev_periodic
1683
+ *w, ev_tstamp now)>, e.g.:
1684
+
1685
+ static ev_tstamp
1686
+ my_rescheduler (ev_periodic *w, ev_tstamp now)
1687
+ {
1688
+ return now + 60.;
1689
+ }
1690
+
1691
+ It must return the next time to trigger, based on the passed time value
1692
+ (that is, the lowest time value larger than to the second argument). It
1693
+ will usually be called just before the callback will be triggered, but
1694
+ might be called at other times, too.
1695
+
1696
+ NOTE: I<< This callback must always return a time that is higher than or
1697
+ equal to the passed C<now> value >>.
1698
+
1699
+ This can be used to create very complex timers, such as a timer that
1700
+ triggers on "next midnight, local time". To do this, you would calculate the
1701
+ next midnight after C<now> and return the timestamp value for this. How
1702
+ you do this is, again, up to you (but it is not trivial, which is the main
1703
+ reason I omitted it as an example).
1704
+
1705
+ =back
1706
+
1707
+ =item ev_periodic_again (loop, ev_periodic *)
1708
+
1709
+ Simply stops and restarts the periodic watcher again. This is only useful
1710
+ when you changed some parameters or the reschedule callback would return
1711
+ a different time than the last time it was called (e.g. in a crond like
1712
+ program when the crontabs have changed).
1713
+
1714
+ =item ev_tstamp ev_periodic_at (ev_periodic *)
1715
+
1716
+ When active, returns the absolute time that the watcher is supposed to
1717
+ trigger next.
1718
+
1719
+ =item ev_tstamp offset [read-write]
1720
+
1721
+ When repeating, this contains the offset value, otherwise this is the
1722
+ absolute point in time (the C<at> value passed to C<ev_periodic_set>).
1723
+
1724
+ Can be modified any time, but changes only take effect when the periodic
1725
+ timer fires or C<ev_periodic_again> is being called.
1726
+
1727
+ =item ev_tstamp interval [read-write]
1728
+
1729
+ The current interval value. Can be modified any time, but changes only
1730
+ take effect when the periodic timer fires or C<ev_periodic_again> is being
1731
+ called.
1732
+
1733
+ =item ev_tstamp (*reschedule_cb)(ev_periodic *w, ev_tstamp now) [read-write]
1734
+
1735
+ The current reschedule callback, or C<0>, if this functionality is
1736
+ switched off. Can be changed any time, but changes only take effect when
1737
+ the periodic timer fires or C<ev_periodic_again> is being called.
1738
+
1739
+ =back
1740
+
1741
+ =head3 Examples
1742
+
1743
+ Example: Call a callback every hour, or, more precisely, whenever the
1744
+ system time is divisible by 3600. The callback invocation times have
1745
+ potentially a lot of jitter, but good long-term stability.
1746
+
1747
+ static void
1748
+ clock_cb (struct ev_loop *loop, ev_io *w, int revents)
1749
+ {
1750
+ ... its now a full hour (UTC, or TAI or whatever your clock follows)
1751
+ }
1752
+
1753
+ ev_periodic hourly_tick;
1754
+ ev_periodic_init (&hourly_tick, clock_cb, 0., 3600., 0);
1755
+ ev_periodic_start (loop, &hourly_tick);
1756
+
1757
+ Example: The same as above, but use a reschedule callback to do it:
1758
+
1759
+ #include <math.h>
1760
+
1761
+ static ev_tstamp
1762
+ my_scheduler_cb (ev_periodic *w, ev_tstamp now)
1763
+ {
1764
+ return now + (3600. - fmod (now, 3600.));
1765
+ }
1766
+
1767
+ ev_periodic_init (&hourly_tick, clock_cb, 0., 0., my_scheduler_cb);
1768
+
1769
+ Example: Call a callback every hour, starting now:
1770
+
1771
+ ev_periodic hourly_tick;
1772
+ ev_periodic_init (&hourly_tick, clock_cb,
1773
+ fmod (ev_now (loop), 3600.), 3600., 0);
1774
+ ev_periodic_start (loop, &hourly_tick);
1775
+
1776
+
1777
+ =head2 C<ev_signal> - signal me when a signal gets signalled!
1778
+
1779
+ Signal watchers will trigger an event when the process receives a specific
1780
+ signal one or more times. Even though signals are very asynchronous, libev
1781
+ will try it's best to deliver signals synchronously, i.e. as part of the
1782
+ normal event processing, like any other event.
1783
+
1784
+ If you want signals asynchronously, just use C<sigaction> as you would
1785
+ do without libev and forget about sharing the signal. You can even use
1786
+ C<ev_async> from a signal handler to synchronously wake up an event loop.
1787
+
1788
+ You can configure as many watchers as you like per signal. Only when the
1789
+ first watcher gets started will libev actually register a signal handler
1790
+ with the kernel (thus it coexists with your own signal handlers as long as
1791
+ you don't register any with libev for the same signal). Similarly, when
1792
+ the last signal watcher for a signal is stopped, libev will reset the
1793
+ signal handler to SIG_DFL (regardless of what it was set to before).
1794
+
1795
+ If possible and supported, libev will install its handlers with
1796
+ C<SA_RESTART> behaviour enabled, so system calls should not be unduly
1797
+ interrupted. If you have a problem with system calls getting interrupted by
1798
+ signals you can block all signals in an C<ev_check> watcher and unblock
1799
+ them in an C<ev_prepare> watcher.
1800
+
1801
+ =head3 Watcher-Specific Functions and Data Members
1802
+
1803
+ =over 4
1804
+
1805
+ =item ev_signal_init (ev_signal *, callback, int signum)
1806
+
1807
+ =item ev_signal_set (ev_signal *, int signum)
1808
+
1809
+ Configures the watcher to trigger on the given signal number (usually one
1810
+ of the C<SIGxxx> constants).
1811
+
1812
+ =item int signum [read-only]
1813
+
1814
+ The signal the watcher watches out for.
1815
+
1816
+ =back
1817
+
1818
+ =head3 Examples
1819
+
1820
+ Example: Try to exit cleanly on SIGINT.
1821
+
1822
+ static void
1823
+ sigint_cb (struct ev_loop *loop, ev_signal *w, int revents)
1824
+ {
1825
+ ev_unloop (loop, EVUNLOOP_ALL);
1826
+ }
1827
+
1828
+ ev_signal signal_watcher;
1829
+ ev_signal_init (&signal_watcher, sigint_cb, SIGINT);
1830
+ ev_signal_start (loop, &signal_watcher);
1831
+
1832
+
1833
+ =head2 C<ev_child> - watch out for process status changes
1834
+
1835
+ Child watchers trigger when your process receives a SIGCHLD in response to
1836
+ some child status changes (most typically when a child of yours dies or
1837
+ exits). It is permissible to install a child watcher I<after> the child
1838
+ has been forked (which implies it might have already exited), as long
1839
+ as the event loop isn't entered (or is continued from a watcher), i.e.,
1840
+ forking and then immediately registering a watcher for the child is fine,
1841
+ but forking and registering a watcher a few event loop iterations later is
1842
+ not.
1843
+
1844
+ Only the default event loop is capable of handling signals, and therefore
1845
+ you can only register child watchers in the default event loop.
1846
+
1847
+ =head3 Process Interaction
1848
+
1849
+ Libev grabs C<SIGCHLD> as soon as the default event loop is
1850
+ initialised. This is necessary to guarantee proper behaviour even if
1851
+ the first child watcher is started after the child exits. The occurrence
1852
+ of C<SIGCHLD> is recorded asynchronously, but child reaping is done
1853
+ synchronously as part of the event loop processing. Libev always reaps all
1854
+ children, even ones not watched.
1855
+
1856
+ =head3 Overriding the Built-In Processing
1857
+
1858
+ Libev offers no special support for overriding the built-in child
1859
+ processing, but if your application collides with libev's default child
1860
+ handler, you can override it easily by installing your own handler for
1861
+ C<SIGCHLD> after initialising the default loop, and making sure the
1862
+ default loop never gets destroyed. You are encouraged, however, to use an
1863
+ event-based approach to child reaping and thus use libev's support for
1864
+ that, so other libev users can use C<ev_child> watchers freely.
1865
+
1866
+ =head3 Stopping the Child Watcher
1867
+
1868
+ Currently, the child watcher never gets stopped, even when the
1869
+ child terminates, so normally one needs to stop the watcher in the
1870
+ callback. Future versions of libev might stop the watcher automatically
1871
+ when a child exit is detected.
1872
+
1873
+ =head3 Watcher-Specific Functions and Data Members
1874
+
1875
+ =over 4
1876
+
1877
+ =item ev_child_init (ev_child *, callback, int pid, int trace)
1878
+
1879
+ =item ev_child_set (ev_child *, int pid, int trace)
1880
+
1881
+ Configures the watcher to wait for status changes of process C<pid> (or
1882
+ I<any> process if C<pid> is specified as C<0>). The callback can look
1883
+ at the C<rstatus> member of the C<ev_child> watcher structure to see
1884
+ the status word (use the macros from C<sys/wait.h> and see your systems
1885
+ C<waitpid> documentation). The C<rpid> member contains the pid of the
1886
+ process causing the status change. C<trace> must be either C<0> (only
1887
+ activate the watcher when the process terminates) or C<1> (additionally
1888
+ activate the watcher when the process is stopped or continued).
1889
+
1890
+ =item int pid [read-only]
1891
+
1892
+ The process id this watcher watches out for, or C<0>, meaning any process id.
1893
+
1894
+ =item int rpid [read-write]
1895
+
1896
+ The process id that detected a status change.
1897
+
1898
+ =item int rstatus [read-write]
1899
+
1900
+ The process exit/trace status caused by C<rpid> (see your systems
1901
+ C<waitpid> and C<sys/wait.h> documentation for details).
1902
+
1903
+ =back
1904
+
1905
+ =head3 Examples
1906
+
1907
+ Example: C<fork()> a new process and install a child handler to wait for
1908
+ its completion.
1909
+
1910
+ ev_child cw;
1911
+
1912
+ static void
1913
+ child_cb (EV_P_ ev_child *w, int revents)
1914
+ {
1915
+ ev_child_stop (EV_A_ w);
1916
+ printf ("process %d exited with status %x\n", w->rpid, w->rstatus);
1917
+ }
1918
+
1919
+ pid_t pid = fork ();
1920
+
1921
+ if (pid < 0)
1922
+ // error
1923
+ else if (pid == 0)
1924
+ {
1925
+ // the forked child executes here
1926
+ exit (1);
1927
+ }
1928
+ else
1929
+ {
1930
+ ev_child_init (&cw, child_cb, pid, 0);
1931
+ ev_child_start (EV_DEFAULT_ &cw);
1932
+ }
1933
+
1934
+
1935
+ =head2 C<ev_stat> - did the file attributes just change?
1936
+
1937
+ This watches a file system path for attribute changes. That is, it calls
1938
+ C<stat> on that path in regular intervals (or when the OS says it changed)
1939
+ and sees if it changed compared to the last time, invoking the callback if
1940
+ it did.
1941
+
1942
+ The path does not need to exist: changing from "path exists" to "path does
1943
+ not exist" is a status change like any other. The condition "path does not
1944
+ exist" (or more correctly "path cannot be stat'ed") is signified by the
1945
+ C<st_nlink> field being zero (which is otherwise always forced to be at
1946
+ least one) and all the other fields of the stat buffer having unspecified
1947
+ contents.
1948
+
1949
+ The path I<must not> end in a slash or contain special components such as
1950
+ C<.> or C<..>. The path I<should> be absolute: If it is relative and
1951
+ your working directory changes, then the behaviour is undefined.
1952
+
1953
+ Since there is no portable change notification interface available, the
1954
+ portable implementation simply calls C<stat(2)> regularly on the path
1955
+ to see if it changed somehow. You can specify a recommended polling
1956
+ interval for this case. If you specify a polling interval of C<0> (highly
1957
+ recommended!) then a I<suitable, unspecified default> value will be used
1958
+ (which you can expect to be around five seconds, although this might
1959
+ change dynamically). Libev will also impose a minimum interval which is
1960
+ currently around C<0.1>, but that's usually overkill.
1961
+
1962
+ This watcher type is not meant for massive numbers of stat watchers,
1963
+ as even with OS-supported change notifications, this can be
1964
+ resource-intensive.
1965
+
1966
+ At the time of this writing, the only OS-specific interface implemented
1967
+ is the Linux inotify interface (implementing kqueue support is left as an
1968
+ exercise for the reader. Note, however, that the author sees no way of
1969
+ implementing C<ev_stat> semantics with kqueue, except as a hint).
1970
+
1971
+ =head3 ABI Issues (Largefile Support)
1972
+
1973
+ Libev by default (unless the user overrides this) uses the default
1974
+ compilation environment, which means that on systems with large file
1975
+ support disabled by default, you get the 32 bit version of the stat
1976
+ structure. When using the library from programs that change the ABI to
1977
+ use 64 bit file offsets the programs will fail. In that case you have to
1978
+ compile libev with the same flags to get binary compatibility. This is
1979
+ obviously the case with any flags that change the ABI, but the problem is
1980
+ most noticeably displayed with ev_stat and large file support.
1981
+
1982
+ The solution for this is to lobby your distribution maker to make large
1983
+ file interfaces available by default (as e.g. FreeBSD does) and not
1984
+ optional. Libev cannot simply switch on large file support because it has
1985
+ to exchange stat structures with application programs compiled using the
1986
+ default compilation environment.
1987
+
1988
+ =head3 Inotify and Kqueue
1989
+
1990
+ When C<inotify (7)> support has been compiled into libev and present at
1991
+ runtime, it will be used to speed up change detection where possible. The
1992
+ inotify descriptor will be created lazily when the first C<ev_stat>
1993
+ watcher is being started.
1994
+
1995
+ Inotify presence does not change the semantics of C<ev_stat> watchers
1996
+ except that changes might be detected earlier, and in some cases, to avoid
1997
+ making regular C<stat> calls. Even in the presence of inotify support
1998
+ there are many cases where libev has to resort to regular C<stat> polling,
1999
+ but as long as kernel 2.6.25 or newer is used (2.6.24 and older have too
2000
+ many bugs), the path exists (i.e. stat succeeds), and the path resides on
2001
+ a local filesystem (libev currently assumes only ext2/3, jfs, reiserfs and
2002
+ xfs are fully working) libev usually gets away without polling.
2003
+
2004
+ There is no support for kqueue, as apparently it cannot be used to
2005
+ implement this functionality, due to the requirement of having a file
2006
+ descriptor open on the object at all times, and detecting renames, unlinks
2007
+ etc. is difficult.
2008
+
2009
+ =head3 C<stat ()> is a synchronous operation
2010
+
2011
+ Libev doesn't normally do any kind of I/O itself, and so is not blocking
2012
+ the process. The exception are C<ev_stat> watchers - those call C<stat
2013
+ ()>, which is a synchronous operation.
2014
+
2015
+ For local paths, this usually doesn't matter: unless the system is very
2016
+ busy or the intervals between stat's are large, a stat call will be fast,
2017
+ as the path data is usually in memory already (except when starting the
2018
+ watcher).
2019
+
2020
+ For networked file systems, calling C<stat ()> can block an indefinite
2021
+ time due to network issues, and even under good conditions, a stat call
2022
+ often takes multiple milliseconds.
2023
+
2024
+ Therefore, it is best to avoid using C<ev_stat> watchers on networked
2025
+ paths, although this is fully supported by libev.
2026
+
2027
+ =head3 The special problem of stat time resolution
2028
+
2029
+ The C<stat ()> system call only supports full-second resolution portably,
2030
+ and even on systems where the resolution is higher, most file systems
2031
+ still only support whole seconds.
2032
+
2033
+ That means that, if the time is the only thing that changes, you can
2034
+ easily miss updates: on the first update, C<ev_stat> detects a change and
2035
+ calls your callback, which does something. When there is another update
2036
+ within the same second, C<ev_stat> will be unable to detect unless the
2037
+ stat data does change in other ways (e.g. file size).
2038
+
2039
+ The solution to this is to delay acting on a change for slightly more
2040
+ than a second (or till slightly after the next full second boundary), using
2041
+ a roughly one-second-delay C<ev_timer> (e.g. C<ev_timer_set (w, 0., 1.02);
2042
+ ev_timer_again (loop, w)>).
2043
+
2044
+ The C<.02> offset is added to work around small timing inconsistencies
2045
+ of some operating systems (where the second counter of the current time
2046
+ might be be delayed. One such system is the Linux kernel, where a call to
2047
+ C<gettimeofday> might return a timestamp with a full second later than
2048
+ a subsequent C<time> call - if the equivalent of C<time ()> is used to
2049
+ update file times then there will be a small window where the kernel uses
2050
+ the previous second to update file times but libev might already execute
2051
+ the timer callback).
2052
+
2053
+ =head3 Watcher-Specific Functions and Data Members
2054
+
2055
+ =over 4
2056
+
2057
+ =item ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)
2058
+
2059
+ =item ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)
2060
+
2061
+ Configures the watcher to wait for status changes of the given
2062
+ C<path>. The C<interval> is a hint on how quickly a change is expected to
2063
+ be detected and should normally be specified as C<0> to let libev choose
2064
+ a suitable value. The memory pointed to by C<path> must point to the same
2065
+ path for as long as the watcher is active.
2066
+
2067
+ The callback will receive an C<EV_STAT> event when a change was detected,
2068
+ relative to the attributes at the time the watcher was started (or the
2069
+ last change was detected).
2070
+
2071
+ =item ev_stat_stat (loop, ev_stat *)
2072
+
2073
+ Updates the stat buffer immediately with new values. If you change the
2074
+ watched path in your callback, you could call this function to avoid
2075
+ detecting this change (while introducing a race condition if you are not
2076
+ the only one changing the path). Can also be useful simply to find out the
2077
+ new values.
2078
+
2079
+ =item ev_statdata attr [read-only]
2080
+
2081
+ The most-recently detected attributes of the file. Although the type is
2082
+ C<ev_statdata>, this is usually the (or one of the) C<struct stat> types
2083
+ suitable for your system, but you can only rely on the POSIX-standardised
2084
+ members to be present. If the C<st_nlink> member is C<0>, then there was
2085
+ some error while C<stat>ing the file.
2086
+
2087
+ =item ev_statdata prev [read-only]
2088
+
2089
+ The previous attributes of the file. The callback gets invoked whenever
2090
+ C<prev> != C<attr>, or, more precisely, one or more of these members
2091
+ differ: C<st_dev>, C<st_ino>, C<st_mode>, C<st_nlink>, C<st_uid>,
2092
+ C<st_gid>, C<st_rdev>, C<st_size>, C<st_atime>, C<st_mtime>, C<st_ctime>.
2093
+
2094
+ =item ev_tstamp interval [read-only]
2095
+
2096
+ The specified interval.
2097
+
2098
+ =item const char *path [read-only]
2099
+
2100
+ The file system path that is being watched.
2101
+
2102
+ =back
2103
+
2104
+ =head3 Examples
2105
+
2106
+ Example: Watch C</etc/passwd> for attribute changes.
2107
+
2108
+ static void
2109
+ passwd_cb (struct ev_loop *loop, ev_stat *w, int revents)
2110
+ {
2111
+ /* /etc/passwd changed in some way */
2112
+ if (w->attr.st_nlink)
2113
+ {
2114
+ printf ("passwd current size %ld\n", (long)w->attr.st_size);
2115
+ printf ("passwd current atime %ld\n", (long)w->attr.st_mtime);
2116
+ printf ("passwd current mtime %ld\n", (long)w->attr.st_mtime);
2117
+ }
2118
+ else
2119
+ /* you shalt not abuse printf for puts */
2120
+ puts ("wow, /etc/passwd is not there, expect problems. "
2121
+ "if this is windows, they already arrived\n");
2122
+ }
2123
+
2124
+ ...
2125
+ ev_stat passwd;
2126
+
2127
+ ev_stat_init (&passwd, passwd_cb, "/etc/passwd", 0.);
2128
+ ev_stat_start (loop, &passwd);
2129
+
2130
+ Example: Like above, but additionally use a one-second delay so we do not
2131
+ miss updates (however, frequent updates will delay processing, too, so
2132
+ one might do the work both on C<ev_stat> callback invocation I<and> on
2133
+ C<ev_timer> callback invocation).
2134
+
2135
+ static ev_stat passwd;
2136
+ static ev_timer timer;
2137
+
2138
+ static void
2139
+ timer_cb (EV_P_ ev_timer *w, int revents)
2140
+ {
2141
+ ev_timer_stop (EV_A_ w);
2142
+
2143
+ /* now it's one second after the most recent passwd change */
2144
+ }
2145
+
2146
+ static void
2147
+ stat_cb (EV_P_ ev_stat *w, int revents)
2148
+ {
2149
+ /* reset the one-second timer */
2150
+ ev_timer_again (EV_A_ &timer);
2151
+ }
2152
+
2153
+ ...
2154
+ ev_stat_init (&passwd, stat_cb, "/etc/passwd", 0.);
2155
+ ev_stat_start (loop, &passwd);
2156
+ ev_timer_init (&timer, timer_cb, 0., 1.02);
2157
+
2158
+
2159
+ =head2 C<ev_idle> - when you've got nothing better to do...
2160
+
2161
+ Idle watchers trigger events when no other events of the same or higher
2162
+ priority are pending (prepare, check and other idle watchers do not count
2163
+ as receiving "events").
2164
+
2165
+ That is, as long as your process is busy handling sockets or timeouts
2166
+ (or even signals, imagine) of the same or higher priority it will not be
2167
+ triggered. But when your process is idle (or only lower-priority watchers
2168
+ are pending), the idle watchers are being called once per event loop
2169
+ iteration - until stopped, that is, or your process receives more events
2170
+ and becomes busy again with higher priority stuff.
2171
+
2172
+ The most noteworthy effect is that as long as any idle watchers are
2173
+ active, the process will not block when waiting for new events.
2174
+
2175
+ Apart from keeping your process non-blocking (which is a useful
2176
+ effect on its own sometimes), idle watchers are a good place to do
2177
+ "pseudo-background processing", or delay processing stuff to after the
2178
+ event loop has handled all outstanding events.
2179
+
2180
+ =head3 Watcher-Specific Functions and Data Members
2181
+
2182
+ =over 4
2183
+
2184
+ =item ev_idle_init (ev_signal *, callback)
2185
+
2186
+ Initialises and configures the idle watcher - it has no parameters of any
2187
+ kind. There is a C<ev_idle_set> macro, but using it is utterly pointless,
2188
+ believe me.
2189
+
2190
+ =back
2191
+
2192
+ =head3 Examples
2193
+
2194
+ Example: Dynamically allocate an C<ev_idle> watcher, start it, and in the
2195
+ callback, free it. Also, use no error checking, as usual.
2196
+
2197
+ static void
2198
+ idle_cb (struct ev_loop *loop, ev_idle *w, int revents)
2199
+ {
2200
+ free (w);
2201
+ // now do something you wanted to do when the program has
2202
+ // no longer anything immediate to do.
2203
+ }
2204
+
2205
+ ev_idle *idle_watcher = malloc (sizeof (ev_idle));
2206
+ ev_idle_init (idle_watcher, idle_cb);
2207
+ ev_idle_start (loop, idle_cb);
2208
+
2209
+
2210
+ =head2 C<ev_prepare> and C<ev_check> - customise your event loop!
2211
+
2212
+ Prepare and check watchers are usually (but not always) used in pairs:
2213
+ prepare watchers get invoked before the process blocks and check watchers
2214
+ afterwards.
2215
+
2216
+ You I<must not> call C<ev_loop> or similar functions that enter
2217
+ the current event loop from either C<ev_prepare> or C<ev_check>
2218
+ watchers. Other loops than the current one are fine, however. The
2219
+ rationale behind this is that you do not need to check for recursion in
2220
+ those watchers, i.e. the sequence will always be C<ev_prepare>, blocking,
2221
+ C<ev_check> so if you have one watcher of each kind they will always be
2222
+ called in pairs bracketing the blocking call.
2223
+
2224
+ Their main purpose is to integrate other event mechanisms into libev and
2225
+ their use is somewhat advanced. They could be used, for example, to track
2226
+ variable changes, implement your own watchers, integrate net-snmp or a
2227
+ coroutine library and lots more. They are also occasionally useful if
2228
+ you cache some data and want to flush it before blocking (for example,
2229
+ in X programs you might want to do an C<XFlush ()> in an C<ev_prepare>
2230
+ watcher).
2231
+
2232
+ This is done by examining in each prepare call which file descriptors
2233
+ need to be watched by the other library, registering C<ev_io> watchers
2234
+ for them and starting an C<ev_timer> watcher for any timeouts (many
2235
+ libraries provide exactly this functionality). Then, in the check watcher,
2236
+ you check for any events that occurred (by checking the pending status
2237
+ of all watchers and stopping them) and call back into the library. The
2238
+ I/O and timer callbacks will never actually be called (but must be valid
2239
+ nevertheless, because you never know, you know?).
2240
+
2241
+ As another example, the Perl Coro module uses these hooks to integrate
2242
+ coroutines into libev programs, by yielding to other active coroutines
2243
+ during each prepare and only letting the process block if no coroutines
2244
+ are ready to run (it's actually more complicated: it only runs coroutines
2245
+ with priority higher than or equal to the event loop and one coroutine
2246
+ of lower priority, but only once, using idle watchers to keep the event
2247
+ loop from blocking if lower-priority coroutines are active, thus mapping
2248
+ low-priority coroutines to idle/background tasks).
2249
+
2250
+ It is recommended to give C<ev_check> watchers highest (C<EV_MAXPRI>)
2251
+ priority, to ensure that they are being run before any other watchers
2252
+ after the poll (this doesn't matter for C<ev_prepare> watchers).
2253
+
2254
+ Also, C<ev_check> watchers (and C<ev_prepare> watchers, too) should not
2255
+ activate ("feed") events into libev. While libev fully supports this, they
2256
+ might get executed before other C<ev_check> watchers did their job. As
2257
+ C<ev_check> watchers are often used to embed other (non-libev) event
2258
+ loops those other event loops might be in an unusable state until their
2259
+ C<ev_check> watcher ran (always remind yourself to coexist peacefully with
2260
+ others).
2261
+
2262
+ =head3 Watcher-Specific Functions and Data Members
2263
+
2264
+ =over 4
2265
+
2266
+ =item ev_prepare_init (ev_prepare *, callback)
2267
+
2268
+ =item ev_check_init (ev_check *, callback)
2269
+
2270
+ Initialises and configures the prepare or check watcher - they have no
2271
+ parameters of any kind. There are C<ev_prepare_set> and C<ev_check_set>
2272
+ macros, but using them is utterly, utterly, utterly and completely
2273
+ pointless.
2274
+
2275
+ =back
2276
+
2277
+ =head3 Examples
2278
+
2279
+ There are a number of principal ways to embed other event loops or modules
2280
+ into libev. Here are some ideas on how to include libadns into libev
2281
+ (there is a Perl module named C<EV::ADNS> that does this, which you could
2282
+ use as a working example. Another Perl module named C<EV::Glib> embeds a
2283
+ Glib main context into libev, and finally, C<Glib::EV> embeds EV into the
2284
+ Glib event loop).
2285
+
2286
+ Method 1: Add IO watchers and a timeout watcher in a prepare handler,
2287
+ and in a check watcher, destroy them and call into libadns. What follows
2288
+ is pseudo-code only of course. This requires you to either use a low
2289
+ priority for the check watcher or use C<ev_clear_pending> explicitly, as
2290
+ the callbacks for the IO/timeout watchers might not have been called yet.
2291
+
2292
+ static ev_io iow [nfd];
2293
+ static ev_timer tw;
2294
+
2295
+ static void
2296
+ io_cb (struct ev_loop *loop, ev_io *w, int revents)
2297
+ {
2298
+ }
2299
+
2300
+ // create io watchers for each fd and a timer before blocking
2301
+ static void
2302
+ adns_prepare_cb (struct ev_loop *loop, ev_prepare *w, int revents)
2303
+ {
2304
+ int timeout = 3600000;
2305
+ struct pollfd fds [nfd];
2306
+ // actual code will need to loop here and realloc etc.
2307
+ adns_beforepoll (ads, fds, &nfd, &timeout, timeval_from (ev_time ()));
2308
+
2309
+ /* the callback is illegal, but won't be called as we stop during check */
2310
+ ev_timer_init (&tw, 0, timeout * 1e-3);
2311
+ ev_timer_start (loop, &tw);
2312
+
2313
+ // create one ev_io per pollfd
2314
+ for (int i = 0; i < nfd; ++i)
2315
+ {
2316
+ ev_io_init (iow + i, io_cb, fds [i].fd,
2317
+ ((fds [i].events & POLLIN ? EV_READ : 0)
2318
+ | (fds [i].events & POLLOUT ? EV_WRITE : 0)));
2319
+
2320
+ fds [i].revents = 0;
2321
+ ev_io_start (loop, iow + i);
2322
+ }
2323
+ }
2324
+
2325
+ // stop all watchers after blocking
2326
+ static void
2327
+ adns_check_cb (struct ev_loop *loop, ev_check *w, int revents)
2328
+ {
2329
+ ev_timer_stop (loop, &tw);
2330
+
2331
+ for (int i = 0; i < nfd; ++i)
2332
+ {
2333
+ // set the relevant poll flags
2334
+ // could also call adns_processreadable etc. here
2335
+ struct pollfd *fd = fds + i;
2336
+ int revents = ev_clear_pending (iow + i);
2337
+ if (revents & EV_READ ) fd->revents |= fd->events & POLLIN;
2338
+ if (revents & EV_WRITE) fd->revents |= fd->events & POLLOUT;
2339
+
2340
+ // now stop the watcher
2341
+ ev_io_stop (loop, iow + i);
2342
+ }
2343
+
2344
+ adns_afterpoll (adns, fds, nfd, timeval_from (ev_now (loop));
2345
+ }
2346
+
2347
+ Method 2: This would be just like method 1, but you run C<adns_afterpoll>
2348
+ in the prepare watcher and would dispose of the check watcher.
2349
+
2350
+ Method 3: If the module to be embedded supports explicit event
2351
+ notification (libadns does), you can also make use of the actual watcher
2352
+ callbacks, and only destroy/create the watchers in the prepare watcher.
2353
+
2354
+ static void
2355
+ timer_cb (EV_P_ ev_timer *w, int revents)
2356
+ {
2357
+ adns_state ads = (adns_state)w->data;
2358
+ update_now (EV_A);
2359
+
2360
+ adns_processtimeouts (ads, &tv_now);
2361
+ }
2362
+
2363
+ static void
2364
+ io_cb (EV_P_ ev_io *w, int revents)
2365
+ {
2366
+ adns_state ads = (adns_state)w->data;
2367
+ update_now (EV_A);
2368
+
2369
+ if (revents & EV_READ ) adns_processreadable (ads, w->fd, &tv_now);
2370
+ if (revents & EV_WRITE) adns_processwriteable (ads, w->fd, &tv_now);
2371
+ }
2372
+
2373
+ // do not ever call adns_afterpoll
2374
+
2375
+ Method 4: Do not use a prepare or check watcher because the module you
2376
+ want to embed is not flexible enough to support it. Instead, you can
2377
+ override their poll function. The drawback with this solution is that the
2378
+ main loop is now no longer controllable by EV. The C<Glib::EV> module uses
2379
+ this approach, effectively embedding EV as a client into the horrible
2380
+ libglib event loop.
2381
+
2382
+ static gint
2383
+ event_poll_func (GPollFD *fds, guint nfds, gint timeout)
2384
+ {
2385
+ int got_events = 0;
2386
+
2387
+ for (n = 0; n < nfds; ++n)
2388
+ // create/start io watcher that sets the relevant bits in fds[n] and increment got_events
2389
+
2390
+ if (timeout >= 0)
2391
+ // create/start timer
2392
+
2393
+ // poll
2394
+ ev_loop (EV_A_ 0);
2395
+
2396
+ // stop timer again
2397
+ if (timeout >= 0)
2398
+ ev_timer_stop (EV_A_ &to);
2399
+
2400
+ // stop io watchers again - their callbacks should have set
2401
+ for (n = 0; n < nfds; ++n)
2402
+ ev_io_stop (EV_A_ iow [n]);
2403
+
2404
+ return got_events;
2405
+ }
2406
+
2407
+
2408
+ =head2 C<ev_embed> - when one backend isn't enough...
2409
+
2410
+ This is a rather advanced watcher type that lets you embed one event loop
2411
+ into another (currently only C<ev_io> events are supported in the embedded
2412
+ loop, other types of watchers might be handled in a delayed or incorrect
2413
+ fashion and must not be used).
2414
+
2415
+ There are primarily two reasons you would want that: work around bugs and
2416
+ prioritise I/O.
2417
+
2418
+ As an example for a bug workaround, the kqueue backend might only support
2419
+ sockets on some platform, so it is unusable as generic backend, but you
2420
+ still want to make use of it because you have many sockets and it scales
2421
+ so nicely. In this case, you would create a kqueue-based loop and embed
2422
+ it into your default loop (which might use e.g. poll). Overall operation
2423
+ will be a bit slower because first libev has to call C<poll> and then
2424
+ C<kevent>, but at least you can use both mechanisms for what they are
2425
+ best: C<kqueue> for scalable sockets and C<poll> if you want it to work :)
2426
+
2427
+ As for prioritising I/O: under rare circumstances you have the case where
2428
+ some fds have to be watched and handled very quickly (with low latency),
2429
+ and even priorities and idle watchers might have too much overhead. In
2430
+ this case you would put all the high priority stuff in one loop and all
2431
+ the rest in a second one, and embed the second one in the first.
2432
+
2433
+ As long as the watcher is active, the callback will be invoked every
2434
+ time there might be events pending in the embedded loop. The callback
2435
+ must then call C<ev_embed_sweep (mainloop, watcher)> to make a single
2436
+ sweep and invoke their callbacks (the callback doesn't need to invoke the
2437
+ C<ev_embed_sweep> function directly, it could also start an idle watcher
2438
+ to give the embedded loop strictly lower priority for example).
2439
+
2440
+ You can also set the callback to C<0>, in which case the embed watcher
2441
+ will automatically execute the embedded loop sweep whenever necessary.
2442
+
2443
+ Fork detection will be handled transparently while the C<ev_embed> watcher
2444
+ is active, i.e., the embedded loop will automatically be forked when the
2445
+ embedding loop forks. In other cases, the user is responsible for calling
2446
+ C<ev_loop_fork> on the embedded loop.
2447
+
2448
+ Unfortunately, not all backends are embeddable: only the ones returned by
2449
+ C<ev_embeddable_backends> are, which, unfortunately, does not include any
2450
+ portable one.
2451
+
2452
+ So when you want to use this feature you will always have to be prepared
2453
+ that you cannot get an embeddable loop. The recommended way to get around
2454
+ this is to have a separate variables for your embeddable loop, try to
2455
+ create it, and if that fails, use the normal loop for everything.
2456
+
2457
+ =head3 C<ev_embed> and fork
2458
+
2459
+ While the C<ev_embed> watcher is running, forks in the embedding loop will
2460
+ automatically be applied to the embedded loop as well, so no special
2461
+ fork handling is required in that case. When the watcher is not running,
2462
+ however, it is still the task of the libev user to call C<ev_loop_fork ()>
2463
+ as applicable.
2464
+
2465
+ =head3 Watcher-Specific Functions and Data Members
2466
+
2467
+ =over 4
2468
+
2469
+ =item ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)
2470
+
2471
+ =item ev_embed_set (ev_embed *, callback, struct ev_loop *embedded_loop)
2472
+
2473
+ Configures the watcher to embed the given loop, which must be
2474
+ embeddable. If the callback is C<0>, then C<ev_embed_sweep> will be
2475
+ invoked automatically, otherwise it is the responsibility of the callback
2476
+ to invoke it (it will continue to be called until the sweep has been done,
2477
+ if you do not want that, you need to temporarily stop the embed watcher).
2478
+
2479
+ =item ev_embed_sweep (loop, ev_embed *)
2480
+
2481
+ Make a single, non-blocking sweep over the embedded loop. This works
2482
+ similarly to C<ev_loop (embedded_loop, EVLOOP_NONBLOCK)>, but in the most
2483
+ appropriate way for embedded loops.
2484
+
2485
+ =item struct ev_loop *other [read-only]
2486
+
2487
+ The embedded event loop.
2488
+
2489
+ =back
2490
+
2491
+ =head3 Examples
2492
+
2493
+ Example: Try to get an embeddable event loop and embed it into the default
2494
+ event loop. If that is not possible, use the default loop. The default
2495
+ loop is stored in C<loop_hi>, while the embeddable loop is stored in
2496
+ C<loop_lo> (which is C<loop_hi> in the case no embeddable loop can be
2497
+ used).
2498
+
2499
+ struct ev_loop *loop_hi = ev_default_init (0);
2500
+ struct ev_loop *loop_lo = 0;
2501
+ ev_embed embed;
2502
+
2503
+ // see if there is a chance of getting one that works
2504
+ // (remember that a flags value of 0 means autodetection)
2505
+ loop_lo = ev_embeddable_backends () & ev_recommended_backends ()
2506
+ ? ev_loop_new (ev_embeddable_backends () & ev_recommended_backends ())
2507
+ : 0;
2508
+
2509
+ // if we got one, then embed it, otherwise default to loop_hi
2510
+ if (loop_lo)
2511
+ {
2512
+ ev_embed_init (&embed, 0, loop_lo);
2513
+ ev_embed_start (loop_hi, &embed);
2514
+ }
2515
+ else
2516
+ loop_lo = loop_hi;
2517
+
2518
+ Example: Check if kqueue is available but not recommended and create
2519
+ a kqueue backend for use with sockets (which usually work with any
2520
+ kqueue implementation). Store the kqueue/socket-only event loop in
2521
+ C<loop_socket>. (One might optionally use C<EVFLAG_NOENV>, too).
2522
+
2523
+ struct ev_loop *loop = ev_default_init (0);
2524
+ struct ev_loop *loop_socket = 0;
2525
+ ev_embed embed;
2526
+
2527
+ if (ev_supported_backends () & ~ev_recommended_backends () & EVBACKEND_KQUEUE)
2528
+ if ((loop_socket = ev_loop_new (EVBACKEND_KQUEUE))
2529
+ {
2530
+ ev_embed_init (&embed, 0, loop_socket);
2531
+ ev_embed_start (loop, &embed);
2532
+ }
2533
+
2534
+ if (!loop_socket)
2535
+ loop_socket = loop;
2536
+
2537
+ // now use loop_socket for all sockets, and loop for everything else
2538
+
2539
+
2540
+ =head2 C<ev_fork> - the audacity to resume the event loop after a fork
2541
+
2542
+ Fork watchers are called when a C<fork ()> was detected (usually because
2543
+ whoever is a good citizen cared to tell libev about it by calling
2544
+ C<ev_default_fork> or C<ev_loop_fork>). The invocation is done before the
2545
+ event loop blocks next and before C<ev_check> watchers are being called,
2546
+ and only in the child after the fork. If whoever good citizen calling
2547
+ C<ev_default_fork> cheats and calls it in the wrong process, the fork
2548
+ handlers will be invoked, too, of course.
2549
+
2550
+ =head3 Watcher-Specific Functions and Data Members
2551
+
2552
+ =over 4
2553
+
2554
+ =item ev_fork_init (ev_signal *, callback)
2555
+
2556
+ Initialises and configures the fork watcher - it has no parameters of any
2557
+ kind. There is a C<ev_fork_set> macro, but using it is utterly pointless,
2558
+ believe me.
2559
+
2560
+ =back
2561
+
2562
+
2563
+ =head2 C<ev_async> - how to wake up another event loop
2564
+
2565
+ In general, you cannot use an C<ev_loop> from multiple threads or other
2566
+ asynchronous sources such as signal handlers (as opposed to multiple event
2567
+ loops - those are of course safe to use in different threads).
2568
+
2569
+ Sometimes, however, you need to wake up another event loop you do not
2570
+ control, for example because it belongs to another thread. This is what
2571
+ C<ev_async> watchers do: as long as the C<ev_async> watcher is active, you
2572
+ can signal it by calling C<ev_async_send>, which is thread- and signal
2573
+ safe.
2574
+
2575
+ This functionality is very similar to C<ev_signal> watchers, as signals,
2576
+ too, are asynchronous in nature, and signals, too, will be compressed
2577
+ (i.e. the number of callback invocations may be less than the number of
2578
+ C<ev_async_sent> calls).
2579
+
2580
+ Unlike C<ev_signal> watchers, C<ev_async> works with any event loop, not
2581
+ just the default loop.
2582
+
2583
+ =head3 Queueing
2584
+
2585
+ C<ev_async> does not support queueing of data in any way. The reason
2586
+ is that the author does not know of a simple (or any) algorithm for a
2587
+ multiple-writer-single-reader queue that works in all cases and doesn't
2588
+ need elaborate support such as pthreads.
2589
+
2590
+ That means that if you want to queue data, you have to provide your own
2591
+ queue. But at least I can tell you how to implement locking around your
2592
+ queue:
2593
+
2594
+ =over 4
2595
+
2596
+ =item queueing from a signal handler context
2597
+
2598
+ To implement race-free queueing, you simply add to the queue in the signal
2599
+ handler but you block the signal handler in the watcher callback. Here is
2600
+ an example that does that for some fictitious SIGUSR1 handler:
2601
+
2602
+ static ev_async mysig;
2603
+
2604
+ static void
2605
+ sigusr1_handler (void)
2606
+ {
2607
+ sometype data;
2608
+
2609
+ // no locking etc.
2610
+ queue_put (data);
2611
+ ev_async_send (EV_DEFAULT_ &mysig);
2612
+ }
2613
+
2614
+ static void
2615
+ mysig_cb (EV_P_ ev_async *w, int revents)
2616
+ {
2617
+ sometype data;
2618
+ sigset_t block, prev;
2619
+
2620
+ sigemptyset (&block);
2621
+ sigaddset (&block, SIGUSR1);
2622
+ sigprocmask (SIG_BLOCK, &block, &prev);
2623
+
2624
+ while (queue_get (&data))
2625
+ process (data);
2626
+
2627
+ if (sigismember (&prev, SIGUSR1)
2628
+ sigprocmask (SIG_UNBLOCK, &block, 0);
2629
+ }
2630
+
2631
+ (Note: pthreads in theory requires you to use C<pthread_setmask>
2632
+ instead of C<sigprocmask> when you use threads, but libev doesn't do it
2633
+ either...).
2634
+
2635
+ =item queueing from a thread context
2636
+
2637
+ The strategy for threads is different, as you cannot (easily) block
2638
+ threads but you can easily preempt them, so to queue safely you need to
2639
+ employ a traditional mutex lock, such as in this pthread example:
2640
+
2641
+ static ev_async mysig;
2642
+ static pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;
2643
+
2644
+ static void
2645
+ otherthread (void)
2646
+ {
2647
+ // only need to lock the actual queueing operation
2648
+ pthread_mutex_lock (&mymutex);
2649
+ queue_put (data);
2650
+ pthread_mutex_unlock (&mymutex);
2651
+
2652
+ ev_async_send (EV_DEFAULT_ &mysig);
2653
+ }
2654
+
2655
+ static void
2656
+ mysig_cb (EV_P_ ev_async *w, int revents)
2657
+ {
2658
+ pthread_mutex_lock (&mymutex);
2659
+
2660
+ while (queue_get (&data))
2661
+ process (data);
2662
+
2663
+ pthread_mutex_unlock (&mymutex);
2664
+ }
2665
+
2666
+ =back
2667
+
2668
+
2669
+ =head3 Watcher-Specific Functions and Data Members
2670
+
2671
+ =over 4
2672
+
2673
+ =item ev_async_init (ev_async *, callback)
2674
+
2675
+ Initialises and configures the async watcher - it has no parameters of any
2676
+ kind. There is a C<ev_async_set> macro, but using it is utterly pointless,
2677
+ trust me.
2678
+
2679
+ =item ev_async_send (loop, ev_async *)
2680
+
2681
+ Sends/signals/activates the given C<ev_async> watcher, that is, feeds
2682
+ an C<EV_ASYNC> event on the watcher into the event loop. Unlike
2683
+ C<ev_feed_event>, this call is safe to do from other threads, signal or
2684
+ similar contexts (see the discussion of C<EV_ATOMIC_T> in the embedding
2685
+ section below on what exactly this means).
2686
+
2687
+ This call incurs the overhead of a system call only once per loop iteration,
2688
+ so while the overhead might be noticeable, it doesn't apply to repeated
2689
+ calls to C<ev_async_send>.
2690
+
2691
+ =item bool = ev_async_pending (ev_async *)
2692
+
2693
+ Returns a non-zero value when C<ev_async_send> has been called on the
2694
+ watcher but the event has not yet been processed (or even noted) by the
2695
+ event loop.
2696
+
2697
+ C<ev_async_send> sets a flag in the watcher and wakes up the loop. When
2698
+ the loop iterates next and checks for the watcher to have become active,
2699
+ it will reset the flag again. C<ev_async_pending> can be used to very
2700
+ quickly check whether invoking the loop might be a good idea.
2701
+
2702
+ Not that this does I<not> check whether the watcher itself is pending, only
2703
+ whether it has been requested to make this watcher pending.
2704
+
2705
+ =back
2706
+
2707
+
2708
+ =head1 OTHER FUNCTIONS
2709
+
2710
+ There are some other functions of possible interest. Described. Here. Now.
2711
+
2712
+ =over 4
2713
+
2714
+ =item ev_once (loop, int fd, int events, ev_tstamp timeout, callback)
2715
+
2716
+ This function combines a simple timer and an I/O watcher, calls your
2717
+ callback on whichever event happens first and automatically stops both
2718
+ watchers. This is useful if you want to wait for a single event on an fd
2719
+ or timeout without having to allocate/configure/start/stop/free one or
2720
+ more watchers yourself.
2721
+
2722
+ If C<fd> is less than 0, then no I/O watcher will be started and the
2723
+ C<events> argument is being ignored. Otherwise, an C<ev_io> watcher for
2724
+ the given C<fd> and C<events> set will be created and started.
2725
+
2726
+ If C<timeout> is less than 0, then no timeout watcher will be
2727
+ started. Otherwise an C<ev_timer> watcher with after = C<timeout> (and
2728
+ repeat = 0) will be started. C<0> is a valid timeout.
2729
+
2730
+ The callback has the type C<void (*cb)(int revents, void *arg)> and gets
2731
+ passed an C<revents> set like normal event callbacks (a combination of
2732
+ C<EV_ERROR>, C<EV_READ>, C<EV_WRITE> or C<EV_TIMEOUT>) and the C<arg>
2733
+ value passed to C<ev_once>. Note that it is possible to receive I<both>
2734
+ a timeout and an io event at the same time - you probably should give io
2735
+ events precedence.
2736
+
2737
+ Example: wait up to ten seconds for data to appear on STDIN_FILENO.
2738
+
2739
+ static void stdin_ready (int revents, void *arg)
2740
+ {
2741
+ if (revents & EV_READ)
2742
+ /* stdin might have data for us, joy! */;
2743
+ else if (revents & EV_TIMEOUT)
2744
+ /* doh, nothing entered */;
2745
+ }
2746
+
2747
+ ev_once (STDIN_FILENO, EV_READ, 10., stdin_ready, 0);
2748
+
2749
+ =item ev_feed_event (struct ev_loop *, watcher *, int revents)
2750
+
2751
+ Feeds the given event set into the event loop, as if the specified event
2752
+ had happened for the specified watcher (which must be a pointer to an
2753
+ initialised but not necessarily started event watcher).
2754
+
2755
+ =item ev_feed_fd_event (struct ev_loop *, int fd, int revents)
2756
+
2757
+ Feed an event on the given fd, as if a file descriptor backend detected
2758
+ the given events it.
2759
+
2760
+ =item ev_feed_signal_event (struct ev_loop *loop, int signum)
2761
+
2762
+ Feed an event as if the given signal occurred (C<loop> must be the default
2763
+ loop!).
2764
+
2765
+ =back
2766
+
2767
+
2768
+ =head1 LIBEVENT EMULATION
2769
+
2770
+ Libev offers a compatibility emulation layer for libevent. It cannot
2771
+ emulate the internals of libevent, so here are some usage hints:
2772
+
2773
+ =over 4
2774
+
2775
+ =item * Use it by including <event.h>, as usual.
2776
+
2777
+ =item * The following members are fully supported: ev_base, ev_callback,
2778
+ ev_arg, ev_fd, ev_res, ev_events.
2779
+
2780
+ =item * Avoid using ev_flags and the EVLIST_*-macros, while it is
2781
+ maintained by libev, it does not work exactly the same way as in libevent (consider
2782
+ it a private API).
2783
+
2784
+ =item * Priorities are not currently supported. Initialising priorities
2785
+ will fail and all watchers will have the same priority, even though there
2786
+ is an ev_pri field.
2787
+
2788
+ =item * In libevent, the last base created gets the signals, in libev, the
2789
+ first base created (== the default loop) gets the signals.
2790
+
2791
+ =item * Other members are not supported.
2792
+
2793
+ =item * The libev emulation is I<not> ABI compatible to libevent, you need
2794
+ to use the libev header file and library.
2795
+
2796
+ =back
2797
+
2798
+ =head1 C++ SUPPORT
2799
+
2800
+ Libev comes with some simplistic wrapper classes for C++ that mainly allow
2801
+ you to use some convenience methods to start/stop watchers and also change
2802
+ the callback model to a model using method callbacks on objects.
2803
+
2804
+ To use it,
2805
+
2806
+ #include <ev++.h>
2807
+
2808
+ This automatically includes F<ev.h> and puts all of its definitions (many
2809
+ of them macros) into the global namespace. All C++ specific things are
2810
+ put into the C<ev> namespace. It should support all the same embedding
2811
+ options as F<ev.h>, most notably C<EV_MULTIPLICITY>.
2812
+
2813
+ Care has been taken to keep the overhead low. The only data member the C++
2814
+ classes add (compared to plain C-style watchers) is the event loop pointer
2815
+ that the watcher is associated with (or no additional members at all if
2816
+ you disable C<EV_MULTIPLICITY> when embedding libev).
2817
+
2818
+ Currently, functions, and static and non-static member functions can be
2819
+ used as callbacks. Other types should be easy to add as long as they only
2820
+ need one additional pointer for context. If you need support for other
2821
+ types of functors please contact the author (preferably after implementing
2822
+ it).
2823
+
2824
+ Here is a list of things available in the C<ev> namespace:
2825
+
2826
+ =over 4
2827
+
2828
+ =item C<ev::READ>, C<ev::WRITE> etc.
2829
+
2830
+ These are just enum values with the same values as the C<EV_READ> etc.
2831
+ macros from F<ev.h>.
2832
+
2833
+ =item C<ev::tstamp>, C<ev::now>
2834
+
2835
+ Aliases to the same types/functions as with the C<ev_> prefix.
2836
+
2837
+ =item C<ev::io>, C<ev::timer>, C<ev::periodic>, C<ev::idle>, C<ev::sig> etc.
2838
+
2839
+ For each C<ev_TYPE> watcher in F<ev.h> there is a corresponding class of
2840
+ the same name in the C<ev> namespace, with the exception of C<ev_signal>
2841
+ which is called C<ev::sig> to avoid clashes with the C<signal> macro
2842
+ defines by many implementations.
2843
+
2844
+ All of those classes have these methods:
2845
+
2846
+ =over 4
2847
+
2848
+ =item ev::TYPE::TYPE ()
2849
+
2850
+ =item ev::TYPE::TYPE (struct ev_loop *)
2851
+
2852
+ =item ev::TYPE::~TYPE
2853
+
2854
+ The constructor (optionally) takes an event loop to associate the watcher
2855
+ with. If it is omitted, it will use C<EV_DEFAULT>.
2856
+
2857
+ The constructor calls C<ev_init> for you, which means you have to call the
2858
+ C<set> method before starting it.
2859
+
2860
+ It will not set a callback, however: You have to call the templated C<set>
2861
+ method to set a callback before you can start the watcher.
2862
+
2863
+ (The reason why you have to use a method is a limitation in C++ which does
2864
+ not allow explicit template arguments for constructors).
2865
+
2866
+ The destructor automatically stops the watcher if it is active.
2867
+
2868
+ =item w->set<class, &class::method> (object *)
2869
+
2870
+ This method sets the callback method to call. The method has to have a
2871
+ signature of C<void (*)(ev_TYPE &, int)>, it receives the watcher as
2872
+ first argument and the C<revents> as second. The object must be given as
2873
+ parameter and is stored in the C<data> member of the watcher.
2874
+
2875
+ This method synthesizes efficient thunking code to call your method from
2876
+ the C callback that libev requires. If your compiler can inline your
2877
+ callback (i.e. it is visible to it at the place of the C<set> call and
2878
+ your compiler is good :), then the method will be fully inlined into the
2879
+ thunking function, making it as fast as a direct C callback.
2880
+
2881
+ Example: simple class declaration and watcher initialisation
2882
+
2883
+ struct myclass
2884
+ {
2885
+ void io_cb (ev::io &w, int revents) { }
2886
+ }
2887
+
2888
+ myclass obj;
2889
+ ev::io iow;
2890
+ iow.set <myclass, &myclass::io_cb> (&obj);
2891
+
2892
+ =item w->set (object *)
2893
+
2894
+ This is an B<experimental> feature that might go away in a future version.
2895
+
2896
+ This is a variation of a method callback - leaving out the method to call
2897
+ will default the method to C<operator ()>, which makes it possible to use
2898
+ functor objects without having to manually specify the C<operator ()> all
2899
+ the time. Incidentally, you can then also leave out the template argument
2900
+ list.
2901
+
2902
+ The C<operator ()> method prototype must be C<void operator ()(watcher &w,
2903
+ int revents)>.
2904
+
2905
+ See the method-C<set> above for more details.
2906
+
2907
+ Example: use a functor object as callback.
2908
+
2909
+ struct myfunctor
2910
+ {
2911
+ void operator() (ev::io &w, int revents)
2912
+ {
2913
+ ...
2914
+ }
2915
+ }
2916
+
2917
+ myfunctor f;
2918
+
2919
+ ev::io w;
2920
+ w.set (&f);
2921
+
2922
+ =item w->set<function> (void *data = 0)
2923
+
2924
+ Also sets a callback, but uses a static method or plain function as
2925
+ callback. The optional C<data> argument will be stored in the watcher's
2926
+ C<data> member and is free for you to use.
2927
+
2928
+ The prototype of the C<function> must be C<void (*)(ev::TYPE &w, int)>.
2929
+
2930
+ See the method-C<set> above for more details.
2931
+
2932
+ Example: Use a plain function as callback.
2933
+
2934
+ static void io_cb (ev::io &w, int revents) { }
2935
+ iow.set <io_cb> ();
2936
+
2937
+ =item w->set (struct ev_loop *)
2938
+
2939
+ Associates a different C<struct ev_loop> with this watcher. You can only
2940
+ do this when the watcher is inactive (and not pending either).
2941
+
2942
+ =item w->set ([arguments])
2943
+
2944
+ Basically the same as C<ev_TYPE_set>, with the same arguments. Must be
2945
+ called at least once. Unlike the C counterpart, an active watcher gets
2946
+ automatically stopped and restarted when reconfiguring it with this
2947
+ method.
2948
+
2949
+ =item w->start ()
2950
+
2951
+ Starts the watcher. Note that there is no C<loop> argument, as the
2952
+ constructor already stores the event loop.
2953
+
2954
+ =item w->stop ()
2955
+
2956
+ Stops the watcher if it is active. Again, no C<loop> argument.
2957
+
2958
+ =item w->again () (C<ev::timer>, C<ev::periodic> only)
2959
+
2960
+ For C<ev::timer> and C<ev::periodic>, this invokes the corresponding
2961
+ C<ev_TYPE_again> function.
2962
+
2963
+ =item w->sweep () (C<ev::embed> only)
2964
+
2965
+ Invokes C<ev_embed_sweep>.
2966
+
2967
+ =item w->update () (C<ev::stat> only)
2968
+
2969
+ Invokes C<ev_stat_stat>.
2970
+
2971
+ =back
2972
+
2973
+ =back
2974
+
2975
+ Example: Define a class with an IO and idle watcher, start one of them in
2976
+ the constructor.
2977
+
2978
+ class myclass
2979
+ {
2980
+ ev::io io ; void io_cb (ev::io &w, int revents);
2981
+ ev::idle idle; void idle_cb (ev::idle &w, int revents);
2982
+
2983
+ myclass (int fd)
2984
+ {
2985
+ io .set <myclass, &myclass::io_cb > (this);
2986
+ idle.set <myclass, &myclass::idle_cb> (this);
2987
+
2988
+ io.start (fd, ev::READ);
2989
+ }
2990
+ };
2991
+
2992
+
2993
+ =head1 OTHER LANGUAGE BINDINGS
2994
+
2995
+ Libev does not offer other language bindings itself, but bindings for a
2996
+ number of languages exist in the form of third-party packages. If you know
2997
+ any interesting language binding in addition to the ones listed here, drop
2998
+ me a note.
2999
+
3000
+ =over 4
3001
+
3002
+ =item Perl
3003
+
3004
+ The EV module implements the full libev API and is actually used to test
3005
+ libev. EV is developed together with libev. Apart from the EV core module,
3006
+ there are additional modules that implement libev-compatible interfaces
3007
+ to C<libadns> (C<EV::ADNS>, but C<AnyEvent::DNS> is preferred nowadays),
3008
+ C<Net::SNMP> (C<Net::SNMP::EV>) and the C<libglib> event core (C<Glib::EV>
3009
+ and C<EV::Glib>).
3010
+
3011
+ It can be found and installed via CPAN, its homepage is at
3012
+ L<http://software.schmorp.de/pkg/EV>.
3013
+
3014
+ =item Python
3015
+
3016
+ Python bindings can be found at L<http://code.google.com/p/pyev/>. It
3017
+ seems to be quite complete and well-documented. Note, however, that the
3018
+ patch they require for libev is outright dangerous as it breaks the ABI
3019
+ for everybody else, and therefore, should never be applied in an installed
3020
+ libev (if python requires an incompatible ABI then it needs to embed
3021
+ libev).
3022
+
3023
+ =item Ruby
3024
+
3025
+ Tony Arcieri has written a ruby extension that offers access to a subset
3026
+ of the libev API and adds file handle abstractions, asynchronous DNS and
3027
+ more on top of it. It can be found via gem servers. Its homepage is at
3028
+ L<http://rev.rubyforge.org/>.
3029
+
3030
+ Roger Pack reports that using the link order C<-lws2_32 -lmsvcrt-ruby-190>
3031
+ makes rev work even on mingw.
3032
+
3033
+ =item D
3034
+
3035
+ Leandro Lucarella has written a D language binding (F<ev.d>) for libev, to
3036
+ be found at L<http://proj.llucax.com.ar/wiki/evd>.
3037
+
3038
+ =item Ocaml
3039
+
3040
+ Erkki Seppala has written Ocaml bindings for libev, to be found at
3041
+ L<http://modeemi.cs.tut.fi/~flux/software/ocaml-ev/>.
3042
+
3043
+ =back
3044
+
3045
+
3046
+ =head1 MACRO MAGIC
3047
+
3048
+ Libev can be compiled with a variety of options, the most fundamental
3049
+ of which is C<EV_MULTIPLICITY>. This option determines whether (most)
3050
+ functions and callbacks have an initial C<struct ev_loop *> argument.
3051
+
3052
+ To make it easier to write programs that cope with either variant, the
3053
+ following macros are defined:
3054
+
3055
+ =over 4
3056
+
3057
+ =item C<EV_A>, C<EV_A_>
3058
+
3059
+ This provides the loop I<argument> for functions, if one is required ("ev
3060
+ loop argument"). The C<EV_A> form is used when this is the sole argument,
3061
+ C<EV_A_> is used when other arguments are following. Example:
3062
+
3063
+ ev_unref (EV_A);
3064
+ ev_timer_add (EV_A_ watcher);
3065
+ ev_loop (EV_A_ 0);
3066
+
3067
+ It assumes the variable C<loop> of type C<struct ev_loop *> is in scope,
3068
+ which is often provided by the following macro.
3069
+
3070
+ =item C<EV_P>, C<EV_P_>
3071
+
3072
+ This provides the loop I<parameter> for functions, if one is required ("ev
3073
+ loop parameter"). The C<EV_P> form is used when this is the sole parameter,
3074
+ C<EV_P_> is used when other parameters are following. Example:
3075
+
3076
+ // this is how ev_unref is being declared
3077
+ static void ev_unref (EV_P);
3078
+
3079
+ // this is how you can declare your typical callback
3080
+ static void cb (EV_P_ ev_timer *w, int revents)
3081
+
3082
+ It declares a parameter C<loop> of type C<struct ev_loop *>, quite
3083
+ suitable for use with C<EV_A>.
3084
+
3085
+ =item C<EV_DEFAULT>, C<EV_DEFAULT_>
3086
+
3087
+ Similar to the other two macros, this gives you the value of the default
3088
+ loop, if multiple loops are supported ("ev loop default").
3089
+
3090
+ =item C<EV_DEFAULT_UC>, C<EV_DEFAULT_UC_>
3091
+
3092
+ Usage identical to C<EV_DEFAULT> and C<EV_DEFAULT_>, but requires that the
3093
+ default loop has been initialised (C<UC> == unchecked). Their behaviour
3094
+ is undefined when the default loop has not been initialised by a previous
3095
+ execution of C<EV_DEFAULT>, C<EV_DEFAULT_> or C<ev_default_init (...)>.
3096
+
3097
+ It is often prudent to use C<EV_DEFAULT> when initialising the first
3098
+ watcher in a function but use C<EV_DEFAULT_UC> afterwards.
3099
+
3100
+ =back
3101
+
3102
+ Example: Declare and initialise a check watcher, utilising the above
3103
+ macros so it will work regardless of whether multiple loops are supported
3104
+ or not.
3105
+
3106
+ static void
3107
+ check_cb (EV_P_ ev_timer *w, int revents)
3108
+ {
3109
+ ev_check_stop (EV_A_ w);
3110
+ }
3111
+
3112
+ ev_check check;
3113
+ ev_check_init (&check, check_cb);
3114
+ ev_check_start (EV_DEFAULT_ &check);
3115
+ ev_loop (EV_DEFAULT_ 0);
3116
+
3117
+ =head1 EMBEDDING
3118
+
3119
+ Libev can (and often is) directly embedded into host
3120
+ applications. Examples of applications that embed it include the Deliantra
3121
+ Game Server, the EV perl module, the GNU Virtual Private Ethernet (gvpe)
3122
+ and rxvt-unicode.
3123
+
3124
+ The goal is to enable you to just copy the necessary files into your
3125
+ source directory without having to change even a single line in them, so
3126
+ you can easily upgrade by simply copying (or having a checked-out copy of
3127
+ libev somewhere in your source tree).
3128
+
3129
+ =head2 FILESETS
3130
+
3131
+ Depending on what features you need you need to include one or more sets of files
3132
+ in your application.
3133
+
3134
+ =head3 CORE EVENT LOOP
3135
+
3136
+ To include only the libev core (all the C<ev_*> functions), with manual
3137
+ configuration (no autoconf):
3138
+
3139
+ #define EV_STANDALONE 1
3140
+ #include "ev.c"
3141
+
3142
+ This will automatically include F<ev.h>, too, and should be done in a
3143
+ single C source file only to provide the function implementations. To use
3144
+ it, do the same for F<ev.h> in all files wishing to use this API (best
3145
+ done by writing a wrapper around F<ev.h> that you can include instead and
3146
+ where you can put other configuration options):
3147
+
3148
+ #define EV_STANDALONE 1
3149
+ #include "ev.h"
3150
+
3151
+ Both header files and implementation files can be compiled with a C++
3152
+ compiler (at least, that's a stated goal, and breakage will be treated
3153
+ as a bug).
3154
+
3155
+ You need the following files in your source tree, or in a directory
3156
+ in your include path (e.g. in libev/ when using -Ilibev):
3157
+
3158
+ ev.h
3159
+ ev.c
3160
+ ev_vars.h
3161
+ ev_wrap.h
3162
+
3163
+ ev_win32.c required on win32 platforms only
3164
+
3165
+ ev_select.c only when select backend is enabled (which is enabled by default)
3166
+ ev_poll.c only when poll backend is enabled (disabled by default)
3167
+ ev_epoll.c only when the epoll backend is enabled (disabled by default)
3168
+ ev_kqueue.c only when the kqueue backend is enabled (disabled by default)
3169
+ ev_port.c only when the solaris port backend is enabled (disabled by default)
3170
+
3171
+ F<ev.c> includes the backend files directly when enabled, so you only need
3172
+ to compile this single file.
3173
+
3174
+ =head3 LIBEVENT COMPATIBILITY API
3175
+
3176
+ To include the libevent compatibility API, also include:
3177
+
3178
+ #include "event.c"
3179
+
3180
+ in the file including F<ev.c>, and:
3181
+
3182
+ #include "event.h"
3183
+
3184
+ in the files that want to use the libevent API. This also includes F<ev.h>.
3185
+
3186
+ You need the following additional files for this:
3187
+
3188
+ event.h
3189
+ event.c
3190
+
3191
+ =head3 AUTOCONF SUPPORT
3192
+
3193
+ Instead of using C<EV_STANDALONE=1> and providing your configuration in
3194
+ whatever way you want, you can also C<m4_include([libev.m4])> in your
3195
+ F<configure.ac> and leave C<EV_STANDALONE> undefined. F<ev.c> will then
3196
+ include F<config.h> and configure itself accordingly.
3197
+
3198
+ For this of course you need the m4 file:
3199
+
3200
+ libev.m4
3201
+
3202
+ =head2 PREPROCESSOR SYMBOLS/MACROS
3203
+
3204
+ Libev can be configured via a variety of preprocessor symbols you have to
3205
+ define before including any of its files. The default in the absence of
3206
+ autoconf is documented for every option.
3207
+
3208
+ =over 4
3209
+
3210
+ =item EV_STANDALONE
3211
+
3212
+ Must always be C<1> if you do not use autoconf configuration, which
3213
+ keeps libev from including F<config.h>, and it also defines dummy
3214
+ implementations for some libevent functions (such as logging, which is not
3215
+ supported). It will also not define any of the structs usually found in
3216
+ F<event.h> that are not directly supported by the libev core alone.
3217
+
3218
+ In stanbdalone mode, libev will still try to automatically deduce the
3219
+ configuration, but has to be more conservative.
3220
+
3221
+ =item EV_USE_MONOTONIC
3222
+
3223
+ If defined to be C<1>, libev will try to detect the availability of the
3224
+ monotonic clock option at both compile time and runtime. Otherwise no
3225
+ use of the monotonic clock option will be attempted. If you enable this,
3226
+ you usually have to link against librt or something similar. Enabling it
3227
+ when the functionality isn't available is safe, though, although you have
3228
+ to make sure you link against any libraries where the C<clock_gettime>
3229
+ function is hiding in (often F<-lrt>). See also C<EV_USE_CLOCK_SYSCALL>.
3230
+
3231
+ =item EV_USE_REALTIME
3232
+
3233
+ If defined to be C<1>, libev will try to detect the availability of the
3234
+ real-time clock option at compile time (and assume its availability
3235
+ at runtime if successful). Otherwise no use of the real-time clock
3236
+ option will be attempted. This effectively replaces C<gettimeofday>
3237
+ by C<clock_get (CLOCK_REALTIME, ...)> and will not normally affect
3238
+ correctness. See the note about libraries in the description of
3239
+ C<EV_USE_MONOTONIC>, though. Defaults to the opposite value of
3240
+ C<EV_USE_CLOCK_SYSCALL>.
3241
+
3242
+ =item EV_USE_CLOCK_SYSCALL
3243
+
3244
+ If defined to be C<1>, libev will try to use a direct syscall instead
3245
+ of calling the system-provided C<clock_gettime> function. This option
3246
+ exists because on GNU/Linux, C<clock_gettime> is in C<librt>, but C<librt>
3247
+ unconditionally pulls in C<libpthread>, slowing down single-threaded
3248
+ programs needlessly. Using a direct syscall is slightly slower (in
3249
+ theory), because no optimised vdso implementation can be used, but avoids
3250
+ the pthread dependency. Defaults to C<1> on GNU/Linux with glibc 2.x or
3251
+ higher, as it simplifies linking (no need for C<-lrt>).
3252
+
3253
+ =item EV_USE_NANOSLEEP
3254
+
3255
+ If defined to be C<1>, libev will assume that C<nanosleep ()> is available
3256
+ and will use it for delays. Otherwise it will use C<select ()>.
3257
+
3258
+ =item EV_USE_EVENTFD
3259
+
3260
+ If defined to be C<1>, then libev will assume that C<eventfd ()> is
3261
+ available and will probe for kernel support at runtime. This will improve
3262
+ C<ev_signal> and C<ev_async> performance and reduce resource consumption.
3263
+ If undefined, it will be enabled if the headers indicate GNU/Linux + Glibc
3264
+ 2.7 or newer, otherwise disabled.
3265
+
3266
+ =item EV_USE_SELECT
3267
+
3268
+ If undefined or defined to be C<1>, libev will compile in support for the
3269
+ C<select>(2) backend. No attempt at auto-detection will be done: if no
3270
+ other method takes over, select will be it. Otherwise the select backend
3271
+ will not be compiled in.
3272
+
3273
+ =item EV_SELECT_USE_FD_SET
3274
+
3275
+ If defined to C<1>, then the select backend will use the system C<fd_set>
3276
+ structure. This is useful if libev doesn't compile due to a missing
3277
+ C<NFDBITS> or C<fd_mask> definition or it mis-guesses the bitset layout
3278
+ on exotic systems. This usually limits the range of file descriptors to
3279
+ some low limit such as 1024 or might have other limitations (winsocket
3280
+ only allows 64 sockets). The C<FD_SETSIZE> macro, set before compilation,
3281
+ configures the maximum size of the C<fd_set>.
3282
+
3283
+ =item EV_SELECT_IS_WINSOCKET
3284
+
3285
+ When defined to C<1>, the select backend will assume that
3286
+ select/socket/connect etc. don't understand file descriptors but
3287
+ wants osf handles on win32 (this is the case when the select to
3288
+ be used is the winsock select). This means that it will call
3289
+ C<_get_osfhandle> on the fd to convert it to an OS handle. Otherwise,
3290
+ it is assumed that all these functions actually work on fds, even
3291
+ on win32. Should not be defined on non-win32 platforms.
3292
+
3293
+ =item EV_FD_TO_WIN32_HANDLE
3294
+
3295
+ If C<EV_SELECT_IS_WINSOCKET> is enabled, then libev needs a way to map
3296
+ file descriptors to socket handles. When not defining this symbol (the
3297
+ default), then libev will call C<_get_osfhandle>, which is usually
3298
+ correct. In some cases, programs use their own file descriptor management,
3299
+ in which case they can provide this function to map fds to socket handles.
3300
+
3301
+ =item EV_USE_POLL
3302
+
3303
+ If defined to be C<1>, libev will compile in support for the C<poll>(2)
3304
+ backend. Otherwise it will be enabled on non-win32 platforms. It
3305
+ takes precedence over select.
3306
+
3307
+ =item EV_USE_EPOLL
3308
+
3309
+ If defined to be C<1>, libev will compile in support for the Linux
3310
+ C<epoll>(7) backend. Its availability will be detected at runtime,
3311
+ otherwise another method will be used as fallback. This is the preferred
3312
+ backend for GNU/Linux systems. If undefined, it will be enabled if the
3313
+ headers indicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled.
3314
+
3315
+ =item EV_USE_KQUEUE
3316
+
3317
+ If defined to be C<1>, libev will compile in support for the BSD style
3318
+ C<kqueue>(2) backend. Its actual availability will be detected at runtime,
3319
+ otherwise another method will be used as fallback. This is the preferred
3320
+ backend for BSD and BSD-like systems, although on most BSDs kqueue only
3321
+ supports some types of fds correctly (the only platform we found that
3322
+ supports ptys for example was NetBSD), so kqueue might be compiled in, but
3323
+ not be used unless explicitly requested. The best way to use it is to find
3324
+ out whether kqueue supports your type of fd properly and use an embedded
3325
+ kqueue loop.
3326
+
3327
+ =item EV_USE_PORT
3328
+
3329
+ If defined to be C<1>, libev will compile in support for the Solaris
3330
+ 10 port style backend. Its availability will be detected at runtime,
3331
+ otherwise another method will be used as fallback. This is the preferred
3332
+ backend for Solaris 10 systems.
3333
+
3334
+ =item EV_USE_DEVPOLL
3335
+
3336
+ Reserved for future expansion, works like the USE symbols above.
3337
+
3338
+ =item EV_USE_INOTIFY
3339
+
3340
+ If defined to be C<1>, libev will compile in support for the Linux inotify
3341
+ interface to speed up C<ev_stat> watchers. Its actual availability will
3342
+ be detected at runtime. If undefined, it will be enabled if the headers
3343
+ indicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled.
3344
+
3345
+ =item EV_ATOMIC_T
3346
+
3347
+ Libev requires an integer type (suitable for storing C<0> or C<1>) whose
3348
+ access is atomic with respect to other threads or signal contexts. No such
3349
+ type is easily found in the C language, so you can provide your own type
3350
+ that you know is safe for your purposes. It is used both for signal handler "locking"
3351
+ as well as for signal and thread safety in C<ev_async> watchers.
3352
+
3353
+ In the absence of this define, libev will use C<sig_atomic_t volatile>
3354
+ (from F<signal.h>), which is usually good enough on most platforms.
3355
+
3356
+ =item EV_H
3357
+
3358
+ The name of the F<ev.h> header file used to include it. The default if
3359
+ undefined is C<"ev.h"> in F<event.h>, F<ev.c> and F<ev++.h>. This can be
3360
+ used to virtually rename the F<ev.h> header file in case of conflicts.
3361
+
3362
+ =item EV_CONFIG_H
3363
+
3364
+ If C<EV_STANDALONE> isn't C<1>, this variable can be used to override
3365
+ F<ev.c>'s idea of where to find the F<config.h> file, similarly to
3366
+ C<EV_H>, above.
3367
+
3368
+ =item EV_EVENT_H
3369
+
3370
+ Similarly to C<EV_H>, this macro can be used to override F<event.c>'s idea
3371
+ of how the F<event.h> header can be found, the default is C<"event.h">.
3372
+
3373
+ =item EV_PROTOTYPES
3374
+
3375
+ If defined to be C<0>, then F<ev.h> will not define any function
3376
+ prototypes, but still define all the structs and other symbols. This is
3377
+ occasionally useful if you want to provide your own wrapper functions
3378
+ around libev functions.
3379
+
3380
+ =item EV_MULTIPLICITY
3381
+
3382
+ If undefined or defined to C<1>, then all event-loop-specific functions
3383
+ will have the C<struct ev_loop *> as first argument, and you can create
3384
+ additional independent event loops. Otherwise there will be no support
3385
+ for multiple event loops and there is no first event loop pointer
3386
+ argument. Instead, all functions act on the single default loop.
3387
+
3388
+ =item EV_MINPRI
3389
+
3390
+ =item EV_MAXPRI
3391
+
3392
+ The range of allowed priorities. C<EV_MINPRI> must be smaller or equal to
3393
+ C<EV_MAXPRI>, but otherwise there are no non-obvious limitations. You can
3394
+ provide for more priorities by overriding those symbols (usually defined
3395
+ to be C<-2> and C<2>, respectively).
3396
+
3397
+ When doing priority-based operations, libev usually has to linearly search
3398
+ all the priorities, so having many of them (hundreds) uses a lot of space
3399
+ and time, so using the defaults of five priorities (-2 .. +2) is usually
3400
+ fine.
3401
+
3402
+ If your embedding application does not need any priorities, defining these
3403
+ both to C<0> will save some memory and CPU.
3404
+
3405
+ =item EV_PERIODIC_ENABLE
3406
+
3407
+ If undefined or defined to be C<1>, then periodic timers are supported. If
3408
+ defined to be C<0>, then they are not. Disabling them saves a few kB of
3409
+ code.
3410
+
3411
+ =item EV_IDLE_ENABLE
3412
+
3413
+ If undefined or defined to be C<1>, then idle watchers are supported. If
3414
+ defined to be C<0>, then they are not. Disabling them saves a few kB of
3415
+ code.
3416
+
3417
+ =item EV_EMBED_ENABLE
3418
+
3419
+ If undefined or defined to be C<1>, then embed watchers are supported. If
3420
+ defined to be C<0>, then they are not. Embed watchers rely on most other
3421
+ watcher types, which therefore must not be disabled.
3422
+
3423
+ =item EV_STAT_ENABLE
3424
+
3425
+ If undefined or defined to be C<1>, then stat watchers are supported. If
3426
+ defined to be C<0>, then they are not.
3427
+
3428
+ =item EV_FORK_ENABLE
3429
+
3430
+ If undefined or defined to be C<1>, then fork watchers are supported. If
3431
+ defined to be C<0>, then they are not.
3432
+
3433
+ =item EV_ASYNC_ENABLE
3434
+
3435
+ If undefined or defined to be C<1>, then async watchers are supported. If
3436
+ defined to be C<0>, then they are not.
3437
+
3438
+ =item EV_MINIMAL
3439
+
3440
+ If you need to shave off some kilobytes of code at the expense of some
3441
+ speed, define this symbol to C<1>. Currently this is used to override some
3442
+ inlining decisions, saves roughly 30% code size on amd64. It also selects a
3443
+ much smaller 2-heap for timer management over the default 4-heap.
3444
+
3445
+ =item EV_PID_HASHSIZE
3446
+
3447
+ C<ev_child> watchers use a small hash table to distribute workload by
3448
+ pid. The default size is C<16> (or C<1> with C<EV_MINIMAL>), usually more
3449
+ than enough. If you need to manage thousands of children you might want to
3450
+ increase this value (I<must> be a power of two).
3451
+
3452
+ =item EV_INOTIFY_HASHSIZE
3453
+
3454
+ C<ev_stat> watchers use a small hash table to distribute workload by
3455
+ inotify watch id. The default size is C<16> (or C<1> with C<EV_MINIMAL>),
3456
+ usually more than enough. If you need to manage thousands of C<ev_stat>
3457
+ watchers you might want to increase this value (I<must> be a power of
3458
+ two).
3459
+
3460
+ =item EV_USE_4HEAP
3461
+
3462
+ Heaps are not very cache-efficient. To improve the cache-efficiency of the
3463
+ timer and periodics heaps, libev uses a 4-heap when this symbol is defined
3464
+ to C<1>. The 4-heap uses more complicated (longer) code but has noticeably
3465
+ faster performance with many (thousands) of watchers.
3466
+
3467
+ The default is C<1> unless C<EV_MINIMAL> is set in which case it is C<0>
3468
+ (disabled).
3469
+
3470
+ =item EV_HEAP_CACHE_AT
3471
+
3472
+ Heaps are not very cache-efficient. To improve the cache-efficiency of the
3473
+ timer and periodics heaps, libev can cache the timestamp (I<at>) within
3474
+ the heap structure (selected by defining C<EV_HEAP_CACHE_AT> to C<1>),
3475
+ which uses 8-12 bytes more per watcher and a few hundred bytes more code,
3476
+ but avoids random read accesses on heap changes. This improves performance
3477
+ noticeably with many (hundreds) of watchers.
3478
+
3479
+ The default is C<1> unless C<EV_MINIMAL> is set in which case it is C<0>
3480
+ (disabled).
3481
+
3482
+ =item EV_VERIFY
3483
+
3484
+ Controls how much internal verification (see C<ev_loop_verify ()>) will
3485
+ be done: If set to C<0>, no internal verification code will be compiled
3486
+ in. If set to C<1>, then verification code will be compiled in, but not
3487
+ called. If set to C<2>, then the internal verification code will be
3488
+ called once per loop, which can slow down libev. If set to C<3>, then the
3489
+ verification code will be called very frequently, which will slow down
3490
+ libev considerably.
3491
+
3492
+ The default is C<1>, unless C<EV_MINIMAL> is set, in which case it will be
3493
+ C<0>.
3494
+
3495
+ =item EV_COMMON
3496
+
3497
+ By default, all watchers have a C<void *data> member. By redefining
3498
+ this macro to a something else you can include more and other types of
3499
+ members. You have to define it each time you include one of the files,
3500
+ though, and it must be identical each time.
3501
+
3502
+ For example, the perl EV module uses something like this:
3503
+
3504
+ #define EV_COMMON \
3505
+ SV *self; /* contains this struct */ \
3506
+ SV *cb_sv, *fh /* note no trailing ";" */
3507
+
3508
+ =item EV_CB_DECLARE (type)
3509
+
3510
+ =item EV_CB_INVOKE (watcher, revents)
3511
+
3512
+ =item ev_set_cb (ev, cb)
3513
+
3514
+ Can be used to change the callback member declaration in each watcher,
3515
+ and the way callbacks are invoked and set. Must expand to a struct member
3516
+ definition and a statement, respectively. See the F<ev.h> header file for
3517
+ their default definitions. One possible use for overriding these is to
3518
+ avoid the C<struct ev_loop *> as first argument in all cases, or to use
3519
+ method calls instead of plain function calls in C++.
3520
+
3521
+ =back
3522
+
3523
+ =head2 EXPORTED API SYMBOLS
3524
+
3525
+ If you need to re-export the API (e.g. via a DLL) and you need a list of
3526
+ exported symbols, you can use the provided F<Symbol.*> files which list
3527
+ all public symbols, one per line:
3528
+
3529
+ Symbols.ev for libev proper
3530
+ Symbols.event for the libevent emulation
3531
+
3532
+ This can also be used to rename all public symbols to avoid clashes with
3533
+ multiple versions of libev linked together (which is obviously bad in
3534
+ itself, but sometimes it is inconvenient to avoid this).
3535
+
3536
+ A sed command like this will create wrapper C<#define>'s that you need to
3537
+ include before including F<ev.h>:
3538
+
3539
+ <Symbols.ev sed -e "s/.*/#define & myprefix_&/" >wrap.h
3540
+
3541
+ This would create a file F<wrap.h> which essentially looks like this:
3542
+
3543
+ #define ev_backend myprefix_ev_backend
3544
+ #define ev_check_start myprefix_ev_check_start
3545
+ #define ev_check_stop myprefix_ev_check_stop
3546
+ ...
3547
+
3548
+ =head2 EXAMPLES
3549
+
3550
+ For a real-world example of a program the includes libev
3551
+ verbatim, you can have a look at the EV perl module
3552
+ (L<http://software.schmorp.de/pkg/EV.html>). It has the libev files in
3553
+ the F<libev/> subdirectory and includes them in the F<EV/EVAPI.h> (public
3554
+ interface) and F<EV.xs> (implementation) files. Only the F<EV.xs> file
3555
+ will be compiled. It is pretty complex because it provides its own header
3556
+ file.
3557
+
3558
+ The usage in rxvt-unicode is simpler. It has a F<ev_cpp.h> header file
3559
+ that everybody includes and which overrides some configure choices:
3560
+
3561
+ #define EV_MINIMAL 1
3562
+ #define EV_USE_POLL 0
3563
+ #define EV_MULTIPLICITY 0
3564
+ #define EV_PERIODIC_ENABLE 0
3565
+ #define EV_STAT_ENABLE 0
3566
+ #define EV_FORK_ENABLE 0
3567
+ #define EV_CONFIG_H <config.h>
3568
+ #define EV_MINPRI 0
3569
+ #define EV_MAXPRI 0
3570
+
3571
+ #include "ev++.h"
3572
+
3573
+ And a F<ev_cpp.C> implementation file that contains libev proper and is compiled:
3574
+
3575
+ #include "ev_cpp.h"
3576
+ #include "ev.c"
3577
+
3578
+ =head1 INTERACTION WITH OTHER PROGRAMS OR LIBRARIES
3579
+
3580
+ =head2 THREADS AND COROUTINES
3581
+
3582
+ =head3 THREADS
3583
+
3584
+ All libev functions are reentrant and thread-safe unless explicitly
3585
+ documented otherwise, but libev implements no locking itself. This means
3586
+ that you can use as many loops as you want in parallel, as long as there
3587
+ are no concurrent calls into any libev function with the same loop
3588
+ parameter (C<ev_default_*> calls have an implicit default loop parameter,
3589
+ of course): libev guarantees that different event loops share no data
3590
+ structures that need any locking.
3591
+
3592
+ Or to put it differently: calls with different loop parameters can be done
3593
+ concurrently from multiple threads, calls with the same loop parameter
3594
+ must be done serially (but can be done from different threads, as long as
3595
+ only one thread ever is inside a call at any point in time, e.g. by using
3596
+ a mutex per loop).
3597
+
3598
+ Specifically to support threads (and signal handlers), libev implements
3599
+ so-called C<ev_async> watchers, which allow some limited form of
3600
+ concurrency on the same event loop, namely waking it up "from the
3601
+ outside".
3602
+
3603
+ If you want to know which design (one loop, locking, or multiple loops
3604
+ without or something else still) is best for your problem, then I cannot
3605
+ help you, but here is some generic advice:
3606
+
3607
+ =over 4
3608
+
3609
+ =item * most applications have a main thread: use the default libev loop
3610
+ in that thread, or create a separate thread running only the default loop.
3611
+
3612
+ This helps integrating other libraries or software modules that use libev
3613
+ themselves and don't care/know about threading.
3614
+
3615
+ =item * one loop per thread is usually a good model.
3616
+
3617
+ Doing this is almost never wrong, sometimes a better-performance model
3618
+ exists, but it is always a good start.
3619
+
3620
+ =item * other models exist, such as the leader/follower pattern, where one
3621
+ loop is handed through multiple threads in a kind of round-robin fashion.
3622
+
3623
+ Choosing a model is hard - look around, learn, know that usually you can do
3624
+ better than you currently do :-)
3625
+
3626
+ =item * often you need to talk to some other thread which blocks in the
3627
+ event loop.
3628
+
3629
+ C<ev_async> watchers can be used to wake them up from other threads safely
3630
+ (or from signal contexts...).
3631
+
3632
+ An example use would be to communicate signals or other events that only
3633
+ work in the default loop by registering the signal watcher with the
3634
+ default loop and triggering an C<ev_async> watcher from the default loop
3635
+ watcher callback into the event loop interested in the signal.
3636
+
3637
+ =back
3638
+
3639
+ =head3 COROUTINES
3640
+
3641
+ Libev is very accommodating to coroutines ("cooperative threads"):
3642
+ libev fully supports nesting calls to its functions from different
3643
+ coroutines (e.g. you can call C<ev_loop> on the same loop from two
3644
+ different coroutines, and switch freely between both coroutines running the
3645
+ loop, as long as you don't confuse yourself). The only exception is that
3646
+ you must not do this from C<ev_periodic> reschedule callbacks.
3647
+
3648
+ Care has been taken to ensure that libev does not keep local state inside
3649
+ C<ev_loop>, and other calls do not usually allow for coroutine switches as
3650
+ they do not call any callbacks.
3651
+
3652
+ =head2 COMPILER WARNINGS
3653
+
3654
+ Depending on your compiler and compiler settings, you might get no or a
3655
+ lot of warnings when compiling libev code. Some people are apparently
3656
+ scared by this.
3657
+
3658
+ However, these are unavoidable for many reasons. For one, each compiler
3659
+ has different warnings, and each user has different tastes regarding
3660
+ warning options. "Warn-free" code therefore cannot be a goal except when
3661
+ targeting a specific compiler and compiler-version.
3662
+
3663
+ Another reason is that some compiler warnings require elaborate
3664
+ workarounds, or other changes to the code that make it less clear and less
3665
+ maintainable.
3666
+
3667
+ And of course, some compiler warnings are just plain stupid, or simply
3668
+ wrong (because they don't actually warn about the condition their message
3669
+ seems to warn about). For example, certain older gcc versions had some
3670
+ warnings that resulted an extreme number of false positives. These have
3671
+ been fixed, but some people still insist on making code warn-free with
3672
+ such buggy versions.
3673
+
3674
+ While libev is written to generate as few warnings as possible,
3675
+ "warn-free" code is not a goal, and it is recommended not to build libev
3676
+ with any compiler warnings enabled unless you are prepared to cope with
3677
+ them (e.g. by ignoring them). Remember that warnings are just that:
3678
+ warnings, not errors, or proof of bugs.
3679
+
3680
+
3681
+ =head2 VALGRIND
3682
+
3683
+ Valgrind has a special section here because it is a popular tool that is
3684
+ highly useful. Unfortunately, valgrind reports are very hard to interpret.
3685
+
3686
+ If you think you found a bug (memory leak, uninitialised data access etc.)
3687
+ in libev, then check twice: If valgrind reports something like:
3688
+
3689
+ ==2274== definitely lost: 0 bytes in 0 blocks.
3690
+ ==2274== possibly lost: 0 bytes in 0 blocks.
3691
+ ==2274== still reachable: 256 bytes in 1 blocks.
3692
+
3693
+ Then there is no memory leak, just as memory accounted to global variables
3694
+ is not a memleak - the memory is still being referenced, and didn't leak.
3695
+
3696
+ Similarly, under some circumstances, valgrind might report kernel bugs
3697
+ as if it were a bug in libev (e.g. in realloc or in the poll backend,
3698
+ although an acceptable workaround has been found here), or it might be
3699
+ confused.
3700
+
3701
+ Keep in mind that valgrind is a very good tool, but only a tool. Don't
3702
+ make it into some kind of religion.
3703
+
3704
+ If you are unsure about something, feel free to contact the mailing list
3705
+ with the full valgrind report and an explanation on why you think this
3706
+ is a bug in libev (best check the archives, too :). However, don't be
3707
+ annoyed when you get a brisk "this is no bug" answer and take the chance
3708
+ of learning how to interpret valgrind properly.
3709
+
3710
+ If you need, for some reason, empty reports from valgrind for your project
3711
+ I suggest using suppression lists.
3712
+
3713
+
3714
+ =head1 PORTABILITY NOTES
3715
+
3716
+ =head2 WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS
3717
+
3718
+ Win32 doesn't support any of the standards (e.g. POSIX) that libev
3719
+ requires, and its I/O model is fundamentally incompatible with the POSIX
3720
+ model. Libev still offers limited functionality on this platform in
3721
+ the form of the C<EVBACKEND_SELECT> backend, and only supports socket
3722
+ descriptors. This only applies when using Win32 natively, not when using
3723
+ e.g. cygwin.
3724
+
3725
+ Lifting these limitations would basically require the full
3726
+ re-implementation of the I/O system. If you are into these kinds of
3727
+ things, then note that glib does exactly that for you in a very portable
3728
+ way (note also that glib is the slowest event library known to man).
3729
+
3730
+ There is no supported compilation method available on windows except
3731
+ embedding it into other applications.
3732
+
3733
+ Not a libev limitation but worth mentioning: windows apparently doesn't
3734
+ accept large writes: instead of resulting in a partial write, windows will
3735
+ either accept everything or return C<ENOBUFS> if the buffer is too large,
3736
+ so make sure you only write small amounts into your sockets (less than a
3737
+ megabyte seems safe, but this apparently depends on the amount of memory
3738
+ available).
3739
+
3740
+ Due to the many, low, and arbitrary limits on the win32 platform and
3741
+ the abysmal performance of winsockets, using a large number of sockets
3742
+ is not recommended (and not reasonable). If your program needs to use
3743
+ more than a hundred or so sockets, then likely it needs to use a totally
3744
+ different implementation for windows, as libev offers the POSIX readiness
3745
+ notification model, which cannot be implemented efficiently on windows
3746
+ (Microsoft monopoly games).
3747
+
3748
+ A typical way to use libev under windows is to embed it (see the embedding
3749
+ section for details) and use the following F<evwrap.h> header file instead
3750
+ of F<ev.h>:
3751
+
3752
+ #define EV_STANDALONE /* keeps ev from requiring config.h */
3753
+ #define EV_SELECT_IS_WINSOCKET 1 /* configure libev for windows select */
3754
+
3755
+ #include "ev.h"
3756
+
3757
+ And compile the following F<evwrap.c> file into your project (make sure
3758
+ you do I<not> compile the F<ev.c> or any other embedded source files!):
3759
+
3760
+ #include "evwrap.h"
3761
+ #include "ev.c"
3762
+
3763
+ =over 4
3764
+
3765
+ =item The winsocket select function
3766
+
3767
+ The winsocket C<select> function doesn't follow POSIX in that it
3768
+ requires socket I<handles> and not socket I<file descriptors> (it is
3769
+ also extremely buggy). This makes select very inefficient, and also
3770
+ requires a mapping from file descriptors to socket handles (the Microsoft
3771
+ C runtime provides the function C<_open_osfhandle> for this). See the
3772
+ discussion of the C<EV_SELECT_USE_FD_SET>, C<EV_SELECT_IS_WINSOCKET> and
3773
+ C<EV_FD_TO_WIN32_HANDLE> preprocessor symbols for more info.
3774
+
3775
+ The configuration for a "naked" win32 using the Microsoft runtime
3776
+ libraries and raw winsocket select is:
3777
+
3778
+ #define EV_USE_SELECT 1
3779
+ #define EV_SELECT_IS_WINSOCKET 1 /* forces EV_SELECT_USE_FD_SET, too */
3780
+
3781
+ Note that winsockets handling of fd sets is O(n), so you can easily get a
3782
+ complexity in the O(n²) range when using win32.
3783
+
3784
+ =item Limited number of file descriptors
3785
+
3786
+ Windows has numerous arbitrary (and low) limits on things.
3787
+
3788
+ Early versions of winsocket's select only supported waiting for a maximum
3789
+ of C<64> handles (probably owning to the fact that all windows kernels
3790
+ can only wait for C<64> things at the same time internally; Microsoft
3791
+ recommends spawning a chain of threads and wait for 63 handles and the
3792
+ previous thread in each. Great).
3793
+
3794
+ Newer versions support more handles, but you need to define C<FD_SETSIZE>
3795
+ to some high number (e.g. C<2048>) before compiling the winsocket select
3796
+ call (which might be in libev or elsewhere, for example, perl does its own
3797
+ select emulation on windows).
3798
+
3799
+ Another limit is the number of file descriptors in the Microsoft runtime
3800
+ libraries, which by default is C<64> (there must be a hidden I<64> fetish
3801
+ or something like this inside Microsoft). You can increase this by calling
3802
+ C<_setmaxstdio>, which can increase this limit to C<2048> (another
3803
+ arbitrary limit), but is broken in many versions of the Microsoft runtime
3804
+ libraries.
3805
+
3806
+ This might get you to about C<512> or C<2048> sockets (depending on
3807
+ windows version and/or the phase of the moon). To get more, you need to
3808
+ wrap all I/O functions and provide your own fd management, but the cost of
3809
+ calling select (O(n²)) will likely make this unworkable.
3810
+
3811
+ =back
3812
+
3813
+ =head2 PORTABILITY REQUIREMENTS
3814
+
3815
+ In addition to a working ISO-C implementation and of course the
3816
+ backend-specific APIs, libev relies on a few additional extensions:
3817
+
3818
+ =over 4
3819
+
3820
+ =item C<void (*)(ev_watcher_type *, int revents)> must have compatible
3821
+ calling conventions regardless of C<ev_watcher_type *>.
3822
+
3823
+ Libev assumes not only that all watcher pointers have the same internal
3824
+ structure (guaranteed by POSIX but not by ISO C for example), but it also
3825
+ assumes that the same (machine) code can be used to call any watcher
3826
+ callback: The watcher callbacks have different type signatures, but libev
3827
+ calls them using an C<ev_watcher *> internally.
3828
+
3829
+ =item C<sig_atomic_t volatile> must be thread-atomic as well
3830
+
3831
+ The type C<sig_atomic_t volatile> (or whatever is defined as
3832
+ C<EV_ATOMIC_T>) must be atomic with respect to accesses from different
3833
+ threads. This is not part of the specification for C<sig_atomic_t>, but is
3834
+ believed to be sufficiently portable.
3835
+
3836
+ =item C<sigprocmask> must work in a threaded environment
3837
+
3838
+ Libev uses C<sigprocmask> to temporarily block signals. This is not
3839
+ allowed in a threaded program (C<pthread_sigmask> has to be used). Typical
3840
+ pthread implementations will either allow C<sigprocmask> in the "main
3841
+ thread" or will block signals process-wide, both behaviours would
3842
+ be compatible with libev. Interaction between C<sigprocmask> and
3843
+ C<pthread_sigmask> could complicate things, however.
3844
+
3845
+ The most portable way to handle signals is to block signals in all threads
3846
+ except the initial one, and run the default loop in the initial thread as
3847
+ well.
3848
+
3849
+ =item C<long> must be large enough for common memory allocation sizes
3850
+
3851
+ To improve portability and simplify its API, libev uses C<long> internally
3852
+ instead of C<size_t> when allocating its data structures. On non-POSIX
3853
+ systems (Microsoft...) this might be unexpectedly low, but is still at
3854
+ least 31 bits everywhere, which is enough for hundreds of millions of
3855
+ watchers.
3856
+
3857
+ =item C<double> must hold a time value in seconds with enough accuracy
3858
+
3859
+ The type C<double> is used to represent timestamps. It is required to
3860
+ have at least 51 bits of mantissa (and 9 bits of exponent), which is good
3861
+ enough for at least into the year 4000. This requirement is fulfilled by
3862
+ implementations implementing IEEE 754 (basically all existing ones).
3863
+
3864
+ =back
3865
+
3866
+ If you know of other additional requirements drop me a note.
3867
+
3868
+
3869
+ =head1 ALGORITHMIC COMPLEXITIES
3870
+
3871
+ In this section the complexities of (many of) the algorithms used inside
3872
+ libev will be documented. For complexity discussions about backends see
3873
+ the documentation for C<ev_default_init>.
3874
+
3875
+ All of the following are about amortised time: If an array needs to be
3876
+ extended, libev needs to realloc and move the whole array, but this
3877
+ happens asymptotically rarer with higher number of elements, so O(1) might
3878
+ mean that libev does a lengthy realloc operation in rare cases, but on
3879
+ average it is much faster and asymptotically approaches constant time.
3880
+
3881
+ =over 4
3882
+
3883
+ =item Starting and stopping timer/periodic watchers: O(log skipped_other_timers)
3884
+
3885
+ This means that, when you have a watcher that triggers in one hour and
3886
+ there are 100 watchers that would trigger before that, then inserting will
3887
+ have to skip roughly seven (C<ld 100>) of these watchers.
3888
+
3889
+ =item Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)
3890
+
3891
+ That means that changing a timer costs less than removing/adding them,
3892
+ as only the relative motion in the event queue has to be paid for.
3893
+
3894
+ =item Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)
3895
+
3896
+ These just add the watcher into an array or at the head of a list.
3897
+
3898
+ =item Stopping check/prepare/idle/fork/async watchers: O(1)
3899
+
3900
+ =item Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))
3901
+
3902
+ These watchers are stored in lists, so they need to be walked to find the
3903
+ correct watcher to remove. The lists are usually short (you don't usually
3904
+ have many watchers waiting for the same fd or signal: one is typical, two
3905
+ is rare).
3906
+
3907
+ =item Finding the next timer in each loop iteration: O(1)
3908
+
3909
+ By virtue of using a binary or 4-heap, the next timer is always found at a
3910
+ fixed position in the storage array.
3911
+
3912
+ =item Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)
3913
+
3914
+ A change means an I/O watcher gets started or stopped, which requires
3915
+ libev to recalculate its status (and possibly tell the kernel, depending
3916
+ on backend and whether C<ev_io_set> was used).
3917
+
3918
+ =item Activating one watcher (putting it into the pending state): O(1)
3919
+
3920
+ =item Priority handling: O(number_of_priorities)
3921
+
3922
+ Priorities are implemented by allocating some space for each
3923
+ priority. When doing priority-based operations, libev usually has to
3924
+ linearly search all the priorities, but starting/stopping and activating
3925
+ watchers becomes O(1) with respect to priority handling.
3926
+
3927
+ =item Sending an ev_async: O(1)
3928
+
3929
+ =item Processing ev_async_send: O(number_of_async_watchers)
3930
+
3931
+ =item Processing signals: O(max_signal_number)
3932
+
3933
+ Sending involves a system call I<iff> there were no other C<ev_async_send>
3934
+ calls in the current loop iteration. Checking for async and signal events
3935
+ involves iterating over all running async watchers or all signal numbers.
3936
+
3937
+ =back
3938
+
3939
+
3940
+ =head1 AUTHOR
3941
+
3942
+ Marc Lehmann <libev@schmorp.de>, with repeated corrections by Mikael Magnusson.
3943
+