asyncengine 0.0.1.testing

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. data/README.markdown +0 -0
  2. data/asyncengine.gemspec +26 -0
  3. data/ext/asyncengine_ext/asyncengine_ruby.c +82 -0
  4. data/ext/asyncengine_ext/extconf.rb +47 -0
  5. data/ext/asyncengine_ext/libuv/AUTHORS +45 -0
  6. data/ext/asyncengine_ext/libuv/LICENSE +42 -0
  7. data/ext/asyncengine_ext/libuv/Makefile +119 -0
  8. data/ext/asyncengine_ext/libuv/README.md +88 -0
  9. data/ext/asyncengine_ext/libuv/build/gcc_version.py +20 -0
  10. data/ext/asyncengine_ext/libuv/common.gypi +176 -0
  11. data/ext/asyncengine_ext/libuv/config-mingw.mk +61 -0
  12. data/ext/asyncengine_ext/libuv/config-unix.mk +173 -0
  13. data/ext/asyncengine_ext/libuv/gyp_uv +60 -0
  14. data/ext/asyncengine_ext/libuv/include/ares.h +591 -0
  15. data/ext/asyncengine_ext/libuv/include/ares_version.h +24 -0
  16. data/ext/asyncengine_ext/libuv/include/uv-private/eio.h +403 -0
  17. data/ext/asyncengine_ext/libuv/include/uv-private/ev.h +838 -0
  18. data/ext/asyncengine_ext/libuv/include/uv-private/ngx-queue.h +106 -0
  19. data/ext/asyncengine_ext/libuv/include/uv-private/tree.h +768 -0
  20. data/ext/asyncengine_ext/libuv/include/uv-private/uv-unix.h +256 -0
  21. data/ext/asyncengine_ext/libuv/include/uv-private/uv-win.h +458 -0
  22. data/ext/asyncengine_ext/libuv/include/uv.h +1556 -0
  23. data/ext/asyncengine_ext/libuv/src/ares/AUTHORS +37 -0
  24. data/ext/asyncengine_ext/libuv/src/ares/CHANGES +1218 -0
  25. data/ext/asyncengine_ext/libuv/src/ares/CMakeLists.txt +22 -0
  26. data/ext/asyncengine_ext/libuv/src/ares/NEWS +21 -0
  27. data/ext/asyncengine_ext/libuv/src/ares/README +60 -0
  28. data/ext/asyncengine_ext/libuv/src/ares/README.cares +13 -0
  29. data/ext/asyncengine_ext/libuv/src/ares/README.msvc +142 -0
  30. data/ext/asyncengine_ext/libuv/src/ares/README.node +21 -0
  31. data/ext/asyncengine_ext/libuv/src/ares/RELEASE-NOTES +26 -0
  32. data/ext/asyncengine_ext/libuv/src/ares/TODO +23 -0
  33. data/ext/asyncengine_ext/libuv/src/ares/ares__close_sockets.c +66 -0
  34. data/ext/asyncengine_ext/libuv/src/ares/ares__get_hostent.c +263 -0
  35. data/ext/asyncengine_ext/libuv/src/ares/ares__read_line.c +71 -0
  36. data/ext/asyncengine_ext/libuv/src/ares/ares__timeval.c +111 -0
  37. data/ext/asyncengine_ext/libuv/src/ares/ares_cancel.c +63 -0
  38. data/ext/asyncengine_ext/libuv/src/ares/ares_data.c +190 -0
  39. data/ext/asyncengine_ext/libuv/src/ares/ares_data.h +65 -0
  40. data/ext/asyncengine_ext/libuv/src/ares/ares_destroy.c +105 -0
  41. data/ext/asyncengine_ext/libuv/src/ares/ares_dns.h +90 -0
  42. data/ext/asyncengine_ext/libuv/src/ares/ares_expand_name.c +200 -0
  43. data/ext/asyncengine_ext/libuv/src/ares/ares_expand_string.c +75 -0
  44. data/ext/asyncengine_ext/libuv/src/ares/ares_fds.c +63 -0
  45. data/ext/asyncengine_ext/libuv/src/ares/ares_free_hostent.c +42 -0
  46. data/ext/asyncengine_ext/libuv/src/ares/ares_free_string.c +25 -0
  47. data/ext/asyncengine_ext/libuv/src/ares/ares_getenv.c +30 -0
  48. data/ext/asyncengine_ext/libuv/src/ares/ares_getenv.h +26 -0
  49. data/ext/asyncengine_ext/libuv/src/ares/ares_gethostbyaddr.c +301 -0
  50. data/ext/asyncengine_ext/libuv/src/ares/ares_gethostbyname.c +523 -0
  51. data/ext/asyncengine_ext/libuv/src/ares/ares_getnameinfo.c +427 -0
  52. data/ext/asyncengine_ext/libuv/src/ares/ares_getopt.c +122 -0
  53. data/ext/asyncengine_ext/libuv/src/ares/ares_getopt.h +53 -0
  54. data/ext/asyncengine_ext/libuv/src/ares/ares_getsock.c +72 -0
  55. data/ext/asyncengine_ext/libuv/src/ares/ares_init.c +1809 -0
  56. data/ext/asyncengine_ext/libuv/src/ares/ares_iphlpapi.h +221 -0
  57. data/ext/asyncengine_ext/libuv/src/ares/ares_ipv6.h +78 -0
  58. data/ext/asyncengine_ext/libuv/src/ares/ares_library_init.c +142 -0
  59. data/ext/asyncengine_ext/libuv/src/ares/ares_library_init.h +42 -0
  60. data/ext/asyncengine_ext/libuv/src/ares/ares_llist.c +86 -0
  61. data/ext/asyncengine_ext/libuv/src/ares/ares_llist.h +42 -0
  62. data/ext/asyncengine_ext/libuv/src/ares/ares_mkquery.c +195 -0
  63. data/ext/asyncengine_ext/libuv/src/ares/ares_nowarn.c +181 -0
  64. data/ext/asyncengine_ext/libuv/src/ares/ares_nowarn.h +55 -0
  65. data/ext/asyncengine_ext/libuv/src/ares/ares_options.c +248 -0
  66. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_a_reply.c +263 -0
  67. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_aaaa_reply.c +259 -0
  68. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_mx_reply.c +170 -0
  69. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_ns_reply.c +182 -0
  70. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_ptr_reply.c +217 -0
  71. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_srv_reply.c +179 -0
  72. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_txt_reply.c +201 -0
  73. data/ext/asyncengine_ext/libuv/src/ares/ares_platform.c +11035 -0
  74. data/ext/asyncengine_ext/libuv/src/ares/ares_platform.h +43 -0
  75. data/ext/asyncengine_ext/libuv/src/ares/ares_private.h +355 -0
  76. data/ext/asyncengine_ext/libuv/src/ares/ares_process.c +1295 -0
  77. data/ext/asyncengine_ext/libuv/src/ares/ares_query.c +183 -0
  78. data/ext/asyncengine_ext/libuv/src/ares/ares_rules.h +144 -0
  79. data/ext/asyncengine_ext/libuv/src/ares/ares_search.c +321 -0
  80. data/ext/asyncengine_ext/libuv/src/ares/ares_send.c +134 -0
  81. data/ext/asyncengine_ext/libuv/src/ares/ares_setup.h +199 -0
  82. data/ext/asyncengine_ext/libuv/src/ares/ares_strcasecmp.c +66 -0
  83. data/ext/asyncengine_ext/libuv/src/ares/ares_strcasecmp.h +30 -0
  84. data/ext/asyncengine_ext/libuv/src/ares/ares_strdup.c +42 -0
  85. data/ext/asyncengine_ext/libuv/src/ares/ares_strdup.h +26 -0
  86. data/ext/asyncengine_ext/libuv/src/ares/ares_strerror.c +56 -0
  87. data/ext/asyncengine_ext/libuv/src/ares/ares_timeout.c +80 -0
  88. data/ext/asyncengine_ext/libuv/src/ares/ares_version.c +11 -0
  89. data/ext/asyncengine_ext/libuv/src/ares/ares_writev.c +79 -0
  90. data/ext/asyncengine_ext/libuv/src/ares/ares_writev.h +36 -0
  91. data/ext/asyncengine_ext/libuv/src/ares/bitncmp.c +59 -0
  92. data/ext/asyncengine_ext/libuv/src/ares/bitncmp.h +26 -0
  93. data/ext/asyncengine_ext/libuv/src/ares/config_cygwin/ares_config.h +512 -0
  94. data/ext/asyncengine_ext/libuv/src/ares/config_darwin/ares_config.h +512 -0
  95. data/ext/asyncengine_ext/libuv/src/ares/config_freebsd/ares_config.h +512 -0
  96. data/ext/asyncengine_ext/libuv/src/ares/config_linux/ares_config.h +512 -0
  97. data/ext/asyncengine_ext/libuv/src/ares/config_netbsd/ares_config.h +512 -0
  98. data/ext/asyncengine_ext/libuv/src/ares/config_openbsd/ares_config.h +512 -0
  99. data/ext/asyncengine_ext/libuv/src/ares/config_sunos/ares_config.h +512 -0
  100. data/ext/asyncengine_ext/libuv/src/ares/config_win32/ares_config.h +369 -0
  101. data/ext/asyncengine_ext/libuv/src/ares/get_ver.awk +35 -0
  102. data/ext/asyncengine_ext/libuv/src/ares/inet_net_pton.c +451 -0
  103. data/ext/asyncengine_ext/libuv/src/ares/inet_net_pton.h +31 -0
  104. data/ext/asyncengine_ext/libuv/src/ares/inet_ntop.c +208 -0
  105. data/ext/asyncengine_ext/libuv/src/ares/inet_ntop.h +26 -0
  106. data/ext/asyncengine_ext/libuv/src/ares/nameser.h +203 -0
  107. data/ext/asyncengine_ext/libuv/src/ares/setup_once.h +504 -0
  108. data/ext/asyncengine_ext/libuv/src/ares/windows_port.c +22 -0
  109. data/ext/asyncengine_ext/libuv/src/unix/async.c +58 -0
  110. data/ext/asyncengine_ext/libuv/src/unix/cares.c +194 -0
  111. data/ext/asyncengine_ext/libuv/src/unix/check.c +80 -0
  112. data/ext/asyncengine_ext/libuv/src/unix/core.c +588 -0
  113. data/ext/asyncengine_ext/libuv/src/unix/cygwin.c +84 -0
  114. data/ext/asyncengine_ext/libuv/src/unix/darwin.c +341 -0
  115. data/ext/asyncengine_ext/libuv/src/unix/dl.c +91 -0
  116. data/ext/asyncengine_ext/libuv/src/unix/eio/Changes +63 -0
  117. data/ext/asyncengine_ext/libuv/src/unix/eio/LICENSE +36 -0
  118. data/ext/asyncengine_ext/libuv/src/unix/eio/Makefile.am +15 -0
  119. data/ext/asyncengine_ext/libuv/src/unix/eio/aclocal.m4 +8957 -0
  120. data/ext/asyncengine_ext/libuv/src/unix/eio/autogen.sh +3 -0
  121. data/ext/asyncengine_ext/libuv/src/unix/eio/config.h.in +86 -0
  122. data/ext/asyncengine_ext/libuv/src/unix/eio/config_cygwin.h +80 -0
  123. data/ext/asyncengine_ext/libuv/src/unix/eio/config_darwin.h +141 -0
  124. data/ext/asyncengine_ext/libuv/src/unix/eio/config_freebsd.h +81 -0
  125. data/ext/asyncengine_ext/libuv/src/unix/eio/config_linux.h +94 -0
  126. data/ext/asyncengine_ext/libuv/src/unix/eio/config_netbsd.h +81 -0
  127. data/ext/asyncengine_ext/libuv/src/unix/eio/config_openbsd.h +137 -0
  128. data/ext/asyncengine_ext/libuv/src/unix/eio/config_sunos.h +84 -0
  129. data/ext/asyncengine_ext/libuv/src/unix/eio/configure.ac +22 -0
  130. data/ext/asyncengine_ext/libuv/src/unix/eio/demo.c +194 -0
  131. data/ext/asyncengine_ext/libuv/src/unix/eio/ecb.h +370 -0
  132. data/ext/asyncengine_ext/libuv/src/unix/eio/eio.3 +3428 -0
  133. data/ext/asyncengine_ext/libuv/src/unix/eio/eio.c +2593 -0
  134. data/ext/asyncengine_ext/libuv/src/unix/eio/eio.pod +969 -0
  135. data/ext/asyncengine_ext/libuv/src/unix/eio/libeio.m4 +195 -0
  136. data/ext/asyncengine_ext/libuv/src/unix/eio/xthread.h +164 -0
  137. data/ext/asyncengine_ext/libuv/src/unix/error.c +98 -0
  138. data/ext/asyncengine_ext/libuv/src/unix/ev/Changes +388 -0
  139. data/ext/asyncengine_ext/libuv/src/unix/ev/LICENSE +36 -0
  140. data/ext/asyncengine_ext/libuv/src/unix/ev/Makefile.am +18 -0
  141. data/ext/asyncengine_ext/libuv/src/unix/ev/Makefile.in +771 -0
  142. data/ext/asyncengine_ext/libuv/src/unix/ev/README +58 -0
  143. data/ext/asyncengine_ext/libuv/src/unix/ev/aclocal.m4 +8957 -0
  144. data/ext/asyncengine_ext/libuv/src/unix/ev/autogen.sh +6 -0
  145. data/ext/asyncengine_ext/libuv/src/unix/ev/config.guess +1526 -0
  146. data/ext/asyncengine_ext/libuv/src/unix/ev/config.h.in +125 -0
  147. data/ext/asyncengine_ext/libuv/src/unix/ev/config.sub +1658 -0
  148. data/ext/asyncengine_ext/libuv/src/unix/ev/config_cygwin.h +123 -0
  149. data/ext/asyncengine_ext/libuv/src/unix/ev/config_darwin.h +122 -0
  150. data/ext/asyncengine_ext/libuv/src/unix/ev/config_freebsd.h +120 -0
  151. data/ext/asyncengine_ext/libuv/src/unix/ev/config_linux.h +141 -0
  152. data/ext/asyncengine_ext/libuv/src/unix/ev/config_netbsd.h +120 -0
  153. data/ext/asyncengine_ext/libuv/src/unix/ev/config_openbsd.h +126 -0
  154. data/ext/asyncengine_ext/libuv/src/unix/ev/config_sunos.h +122 -0
  155. data/ext/asyncengine_ext/libuv/src/unix/ev/configure +13037 -0
  156. data/ext/asyncengine_ext/libuv/src/unix/ev/configure.ac +18 -0
  157. data/ext/asyncengine_ext/libuv/src/unix/ev/depcomp +630 -0
  158. data/ext/asyncengine_ext/libuv/src/unix/ev/ev++.h +816 -0
  159. data/ext/asyncengine_ext/libuv/src/unix/ev/ev.3 +5311 -0
  160. data/ext/asyncengine_ext/libuv/src/unix/ev/ev.c +3921 -0
  161. data/ext/asyncengine_ext/libuv/src/unix/ev/ev.pod +5243 -0
  162. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_epoll.c +266 -0
  163. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_kqueue.c +235 -0
  164. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_poll.c +148 -0
  165. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_port.c +179 -0
  166. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_select.c +310 -0
  167. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_vars.h +203 -0
  168. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_win32.c +153 -0
  169. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_wrap.h +196 -0
  170. data/ext/asyncengine_ext/libuv/src/unix/ev/event.c +402 -0
  171. data/ext/asyncengine_ext/libuv/src/unix/ev/event.h +170 -0
  172. data/ext/asyncengine_ext/libuv/src/unix/ev/install-sh +294 -0
  173. data/ext/asyncengine_ext/libuv/src/unix/ev/libev.m4 +39 -0
  174. data/ext/asyncengine_ext/libuv/src/unix/ev/ltmain.sh +8413 -0
  175. data/ext/asyncengine_ext/libuv/src/unix/ev/missing +336 -0
  176. data/ext/asyncengine_ext/libuv/src/unix/ev/mkinstalldirs +111 -0
  177. data/ext/asyncengine_ext/libuv/src/unix/freebsd.c +312 -0
  178. data/ext/asyncengine_ext/libuv/src/unix/fs.c +707 -0
  179. data/ext/asyncengine_ext/libuv/src/unix/idle.c +79 -0
  180. data/ext/asyncengine_ext/libuv/src/unix/internal.h +161 -0
  181. data/ext/asyncengine_ext/libuv/src/unix/kqueue.c +127 -0
  182. data/ext/asyncengine_ext/libuv/src/unix/linux/core.c +474 -0
  183. data/ext/asyncengine_ext/libuv/src/unix/linux/inotify.c +211 -0
  184. data/ext/asyncengine_ext/libuv/src/unix/linux/syscalls.c +230 -0
  185. data/ext/asyncengine_ext/libuv/src/unix/linux/syscalls.h +87 -0
  186. data/ext/asyncengine_ext/libuv/src/unix/loop.c +58 -0
  187. data/ext/asyncengine_ext/libuv/src/unix/netbsd.c +108 -0
  188. data/ext/asyncengine_ext/libuv/src/unix/openbsd.c +295 -0
  189. data/ext/asyncengine_ext/libuv/src/unix/pipe.c +266 -0
  190. data/ext/asyncengine_ext/libuv/src/unix/prepare.c +79 -0
  191. data/ext/asyncengine_ext/libuv/src/unix/process.c +369 -0
  192. data/ext/asyncengine_ext/libuv/src/unix/stream.c +1033 -0
  193. data/ext/asyncengine_ext/libuv/src/unix/sunos.c +466 -0
  194. data/ext/asyncengine_ext/libuv/src/unix/tcp.c +327 -0
  195. data/ext/asyncengine_ext/libuv/src/unix/thread.c +154 -0
  196. data/ext/asyncengine_ext/libuv/src/unix/timer.c +127 -0
  197. data/ext/asyncengine_ext/libuv/src/unix/tty.c +146 -0
  198. data/ext/asyncengine_ext/libuv/src/unix/udp.c +670 -0
  199. data/ext/asyncengine_ext/libuv/src/unix/uv-eio.c +124 -0
  200. data/ext/asyncengine_ext/libuv/src/unix/uv-eio.h +13 -0
  201. data/ext/asyncengine_ext/libuv/src/uv-common.c +354 -0
  202. data/ext/asyncengine_ext/libuv/src/uv-common.h +87 -0
  203. data/ext/asyncengine_ext/libuv/src/win/async.c +127 -0
  204. data/ext/asyncengine_ext/libuv/src/win/cares.c +290 -0
  205. data/ext/asyncengine_ext/libuv/src/win/core.c +270 -0
  206. data/ext/asyncengine_ext/libuv/src/win/dl.c +82 -0
  207. data/ext/asyncengine_ext/libuv/src/win/error.c +132 -0
  208. data/ext/asyncengine_ext/libuv/src/win/fs-event.c +514 -0
  209. data/ext/asyncengine_ext/libuv/src/win/fs.c +1576 -0
  210. data/ext/asyncengine_ext/libuv/src/win/getaddrinfo.c +372 -0
  211. data/ext/asyncengine_ext/libuv/src/win/handle.c +225 -0
  212. data/ext/asyncengine_ext/libuv/src/win/internal.h +352 -0
  213. data/ext/asyncengine_ext/libuv/src/win/loop-watcher.c +131 -0
  214. data/ext/asyncengine_ext/libuv/src/win/pipe.c +1661 -0
  215. data/ext/asyncengine_ext/libuv/src/win/process.c +1140 -0
  216. data/ext/asyncengine_ext/libuv/src/win/req.c +174 -0
  217. data/ext/asyncengine_ext/libuv/src/win/stream.c +201 -0
  218. data/ext/asyncengine_ext/libuv/src/win/tcp.c +1282 -0
  219. data/ext/asyncengine_ext/libuv/src/win/thread.c +332 -0
  220. data/ext/asyncengine_ext/libuv/src/win/threadpool.c +73 -0
  221. data/ext/asyncengine_ext/libuv/src/win/timer.c +276 -0
  222. data/ext/asyncengine_ext/libuv/src/win/tty.c +1795 -0
  223. data/ext/asyncengine_ext/libuv/src/win/udp.c +709 -0
  224. data/ext/asyncengine_ext/libuv/src/win/util.c +719 -0
  225. data/ext/asyncengine_ext/libuv/src/win/winapi.c +117 -0
  226. data/ext/asyncengine_ext/libuv/src/win/winapi.h +4419 -0
  227. data/ext/asyncengine_ext/libuv/src/win/winsock.c +470 -0
  228. data/ext/asyncengine_ext/libuv/src/win/winsock.h +138 -0
  229. data/ext/asyncengine_ext/libuv/test/benchmark-ares.c +118 -0
  230. data/ext/asyncengine_ext/libuv/test/benchmark-getaddrinfo.c +94 -0
  231. data/ext/asyncengine_ext/libuv/test/benchmark-list.h +105 -0
  232. data/ext/asyncengine_ext/libuv/test/benchmark-ping-pongs.c +213 -0
  233. data/ext/asyncengine_ext/libuv/test/benchmark-pound.c +324 -0
  234. data/ext/asyncengine_ext/libuv/test/benchmark-pump.c +462 -0
  235. data/ext/asyncengine_ext/libuv/test/benchmark-sizes.c +40 -0
  236. data/ext/asyncengine_ext/libuv/test/benchmark-spawn.c +156 -0
  237. data/ext/asyncengine_ext/libuv/test/benchmark-tcp-write-batch.c +140 -0
  238. data/ext/asyncengine_ext/libuv/test/benchmark-thread.c +64 -0
  239. data/ext/asyncengine_ext/libuv/test/benchmark-udp-packet-storm.c +247 -0
  240. data/ext/asyncengine_ext/libuv/test/blackhole-server.c +118 -0
  241. data/ext/asyncengine_ext/libuv/test/dns-server.c +321 -0
  242. data/ext/asyncengine_ext/libuv/test/echo-server.c +370 -0
  243. data/ext/asyncengine_ext/libuv/test/fixtures/empty_file +0 -0
  244. data/ext/asyncengine_ext/libuv/test/fixtures/load_error.node +1 -0
  245. data/ext/asyncengine_ext/libuv/test/run-benchmarks.c +64 -0
  246. data/ext/asyncengine_ext/libuv/test/run-tests.c +108 -0
  247. data/ext/asyncengine_ext/libuv/test/runner-unix.c +315 -0
  248. data/ext/asyncengine_ext/libuv/test/runner-unix.h +36 -0
  249. data/ext/asyncengine_ext/libuv/test/runner-win.c +343 -0
  250. data/ext/asyncengine_ext/libuv/test/runner-win.h +42 -0
  251. data/ext/asyncengine_ext/libuv/test/runner.c +317 -0
  252. data/ext/asyncengine_ext/libuv/test/runner.h +159 -0
  253. data/ext/asyncengine_ext/libuv/test/task.h +117 -0
  254. data/ext/asyncengine_ext/libuv/test/test-async.c +216 -0
  255. data/ext/asyncengine_ext/libuv/test/test-callback-stack.c +203 -0
  256. data/ext/asyncengine_ext/libuv/test/test-connection-fail.c +148 -0
  257. data/ext/asyncengine_ext/libuv/test/test-counters-init.c +216 -0
  258. data/ext/asyncengine_ext/libuv/test/test-cwd-and-chdir.c +64 -0
  259. data/ext/asyncengine_ext/libuv/test/test-delayed-accept.c +197 -0
  260. data/ext/asyncengine_ext/libuv/test/test-dlerror.c +49 -0
  261. data/ext/asyncengine_ext/libuv/test/test-eio-overflow.c +90 -0
  262. data/ext/asyncengine_ext/libuv/test/test-error.c +59 -0
  263. data/ext/asyncengine_ext/libuv/test/test-fail-always.c +29 -0
  264. data/ext/asyncengine_ext/libuv/test/test-fs-event.c +442 -0
  265. data/ext/asyncengine_ext/libuv/test/test-fs.c +1731 -0
  266. data/ext/asyncengine_ext/libuv/test/test-get-currentexe.c +63 -0
  267. data/ext/asyncengine_ext/libuv/test/test-get-loadavg.c +36 -0
  268. data/ext/asyncengine_ext/libuv/test/test-get-memory.c +38 -0
  269. data/ext/asyncengine_ext/libuv/test/test-getaddrinfo.c +122 -0
  270. data/ext/asyncengine_ext/libuv/test/test-gethostbyname.c +189 -0
  271. data/ext/asyncengine_ext/libuv/test/test-getsockname.c +342 -0
  272. data/ext/asyncengine_ext/libuv/test/test-hrtime.c +51 -0
  273. data/ext/asyncengine_ext/libuv/test/test-idle.c +81 -0
  274. data/ext/asyncengine_ext/libuv/test/test-ipc-send-recv.c +209 -0
  275. data/ext/asyncengine_ext/libuv/test/test-ipc.c +614 -0
  276. data/ext/asyncengine_ext/libuv/test/test-list.h +371 -0
  277. data/ext/asyncengine_ext/libuv/test/test-loop-handles.c +359 -0
  278. data/ext/asyncengine_ext/libuv/test/test-multiple-listen.c +102 -0
  279. data/ext/asyncengine_ext/libuv/test/test-mutexes.c +63 -0
  280. data/ext/asyncengine_ext/libuv/test/test-pass-always.c +28 -0
  281. data/ext/asyncengine_ext/libuv/test/test-ping-pong.c +253 -0
  282. data/ext/asyncengine_ext/libuv/test/test-pipe-bind-error.c +140 -0
  283. data/ext/asyncengine_ext/libuv/test/test-pipe-connect-error.c +96 -0
  284. data/ext/asyncengine_ext/libuv/test/test-platform-output.c +87 -0
  285. data/ext/asyncengine_ext/libuv/test/test-process-title.c +42 -0
  286. data/ext/asyncengine_ext/libuv/test/test-ref.c +322 -0
  287. data/ext/asyncengine_ext/libuv/test/test-run-once.c +44 -0
  288. data/ext/asyncengine_ext/libuv/test/test-shutdown-close.c +103 -0
  289. data/ext/asyncengine_ext/libuv/test/test-shutdown-eof.c +183 -0
  290. data/ext/asyncengine_ext/libuv/test/test-spawn.c +499 -0
  291. data/ext/asyncengine_ext/libuv/test/test-stdio-over-pipes.c +256 -0
  292. data/ext/asyncengine_ext/libuv/test/test-tcp-bind-error.c +191 -0
  293. data/ext/asyncengine_ext/libuv/test/test-tcp-bind6-error.c +154 -0
  294. data/ext/asyncengine_ext/libuv/test/test-tcp-close.c +129 -0
  295. data/ext/asyncengine_ext/libuv/test/test-tcp-connect-error.c +70 -0
  296. data/ext/asyncengine_ext/libuv/test/test-tcp-connect6-error.c +68 -0
  297. data/ext/asyncengine_ext/libuv/test/test-tcp-flags.c +51 -0
  298. data/ext/asyncengine_ext/libuv/test/test-tcp-write-error.c +168 -0
  299. data/ext/asyncengine_ext/libuv/test/test-tcp-write-to-half-open-connection.c +135 -0
  300. data/ext/asyncengine_ext/libuv/test/test-tcp-writealot.c +195 -0
  301. data/ext/asyncengine_ext/libuv/test/test-thread.c +183 -0
  302. data/ext/asyncengine_ext/libuv/test/test-threadpool.c +57 -0
  303. data/ext/asyncengine_ext/libuv/test/test-timer-again.c +141 -0
  304. data/ext/asyncengine_ext/libuv/test/test-timer.c +130 -0
  305. data/ext/asyncengine_ext/libuv/test/test-tty.c +110 -0
  306. data/ext/asyncengine_ext/libuv/test/test-udp-dgram-too-big.c +86 -0
  307. data/ext/asyncengine_ext/libuv/test/test-udp-ipv6.c +156 -0
  308. data/ext/asyncengine_ext/libuv/test/test-udp-multicast-join.c +139 -0
  309. data/ext/asyncengine_ext/libuv/test/test-udp-multicast-ttl.c +86 -0
  310. data/ext/asyncengine_ext/libuv/test/test-udp-options.c +86 -0
  311. data/ext/asyncengine_ext/libuv/test/test-udp-send-and-recv.c +208 -0
  312. data/ext/asyncengine_ext/libuv/test/test-util.c +97 -0
  313. data/ext/asyncengine_ext/libuv/uv.gyp +435 -0
  314. data/ext/asyncengine_ext/libuv/vcbuild.bat +105 -0
  315. data/lib/asyncengine/version.rb +3 -0
  316. data/lib/asyncengine.rb +41 -0
  317. metadata +384 -0
@@ -0,0 +1,474 @@
1
+ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
3
+ * of this software and associated documentation files (the "Software"), to
4
+ * deal in the Software without restriction, including without limitation the
5
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6
+ * sell copies of the Software, and to permit persons to whom the Software is
7
+ * furnished to do so, subject to the following conditions:
8
+ *
9
+ * The above copyright notice and this permission notice shall be included in
10
+ * all copies or substantial portions of the Software.
11
+ *
12
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
18
+ * IN THE SOFTWARE.
19
+ */
20
+
21
+ #include "uv.h"
22
+ #include "../internal.h"
23
+
24
+ #include <stdint.h>
25
+ #include <stdio.h>
26
+ #include <stdlib.h>
27
+ #include <string.h>
28
+ #include <assert.h>
29
+ #include <errno.h>
30
+
31
+ #include <net/if.h>
32
+ #include <sys/param.h>
33
+ #include <sys/sysinfo.h>
34
+ #include <unistd.h>
35
+ #include <fcntl.h>
36
+ #include <time.h>
37
+
38
+ #define HAVE_IFADDRS_H 1
39
+ #ifdef __UCLIBC__
40
+ # if __UCLIBC_MAJOR__ < 0 || __UCLIBC_MINOR__ < 9 || __UCLIBC_SUBLEVEL__ < 32
41
+ # undef HAVE_IFADDRS_H
42
+ # endif
43
+ #endif
44
+ #ifdef HAVE_IFADDRS_H
45
+ # include <ifaddrs.h>
46
+ #endif
47
+
48
+ #undef NANOSEC
49
+ #define NANOSEC 1000000000
50
+
51
+ /* This is rather annoying: CLOCK_BOOTTIME lives in <linux/time.h> but we can't
52
+ * include that file because it conflicts with <time.h>. We'll just have to
53
+ * define it ourselves.
54
+ */
55
+ #ifndef CLOCK_BOOTTIME
56
+ # define CLOCK_BOOTTIME 7
57
+ #endif
58
+
59
+ static char buf[MAXPATHLEN + 1];
60
+
61
+ static struct {
62
+ char *str;
63
+ size_t len;
64
+ } process_title;
65
+
66
+
67
+ /*
68
+ * There's probably some way to get time from Linux than gettimeofday(). What
69
+ * it is, I don't know.
70
+ */
71
+ uint64_t uv_hrtime() {
72
+ struct timespec ts;
73
+ clock_gettime(CLOCK_MONOTONIC, &ts);
74
+ return (ts.tv_sec * NANOSEC + ts.tv_nsec);
75
+ }
76
+
77
+
78
+ void uv_loadavg(double avg[3]) {
79
+ struct sysinfo info;
80
+
81
+ if (sysinfo(&info) < 0) return;
82
+
83
+ avg[0] = (double) info.loads[0] / 65536.0;
84
+ avg[1] = (double) info.loads[1] / 65536.0;
85
+ avg[2] = (double) info.loads[2] / 65536.0;
86
+ }
87
+
88
+
89
+ int uv_exepath(char* buffer, size_t* size) {
90
+ ssize_t n;
91
+
92
+ if (!buffer || !size) {
93
+ return -1;
94
+ }
95
+
96
+ n = readlink("/proc/self/exe", buffer, *size - 1);
97
+ if (n <= 0) return -1;
98
+ buffer[n] = '\0';
99
+ *size = n;
100
+
101
+ return 0;
102
+ }
103
+
104
+
105
+ uint64_t uv_get_free_memory(void) {
106
+ return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_AVPHYS_PAGES);
107
+ }
108
+
109
+
110
+ uint64_t uv_get_total_memory(void) {
111
+ return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_PHYS_PAGES);
112
+ }
113
+
114
+
115
+ char** uv_setup_args(int argc, char** argv) {
116
+ char **new_argv;
117
+ char **new_env;
118
+ size_t size;
119
+ int envc;
120
+ char *s;
121
+ int i;
122
+
123
+ for (envc = 0; environ[envc]; envc++);
124
+
125
+ s = envc ? environ[envc - 1] : argv[argc - 1];
126
+
127
+ process_title.str = argv[0];
128
+ process_title.len = s + strlen(s) + 1 - argv[0];
129
+
130
+ size = process_title.len;
131
+ size += (argc + 1) * sizeof(char **);
132
+ size += (envc + 1) * sizeof(char **);
133
+
134
+ if ((s = (char *) malloc(size)) == NULL) {
135
+ process_title.str = NULL;
136
+ process_title.len = 0;
137
+ return argv;
138
+ }
139
+
140
+ new_argv = (char **) s;
141
+ new_env = new_argv + argc + 1;
142
+ s = (char *) (new_env + envc + 1);
143
+ memcpy(s, process_title.str, process_title.len);
144
+
145
+ for (i = 0; i < argc; i++)
146
+ new_argv[i] = s + (argv[i] - argv[0]);
147
+ new_argv[argc] = NULL;
148
+
149
+ s += environ[0] - argv[0];
150
+
151
+ for (i = 0; i < envc; i++)
152
+ new_env[i] = s + (environ[i] - environ[0]);
153
+ new_env[envc] = NULL;
154
+
155
+ environ = new_env;
156
+ return new_argv;
157
+ }
158
+
159
+
160
+ uv_err_t uv_set_process_title(const char* title) {
161
+ /* No need to terminate, last char is always '\0'. */
162
+ if (process_title.len)
163
+ strncpy(process_title.str, title, process_title.len - 1);
164
+
165
+ return uv_ok_;
166
+ }
167
+
168
+
169
+ uv_err_t uv_get_process_title(char* buffer, size_t size) {
170
+ if (process_title.str) {
171
+ strncpy(buffer, process_title.str, size);
172
+ } else {
173
+ if (size > 0) {
174
+ buffer[0] = '\0';
175
+ }
176
+ }
177
+
178
+ return uv_ok_;
179
+ }
180
+
181
+
182
+ uv_err_t uv_resident_set_memory(size_t* rss) {
183
+ FILE* f;
184
+ int itmp;
185
+ char ctmp;
186
+ unsigned int utmp;
187
+ size_t page_size = getpagesize();
188
+ char *cbuf;
189
+ int foundExeEnd;
190
+
191
+ f = fopen("/proc/self/stat", "r");
192
+ if (!f) return uv__new_sys_error(errno);
193
+
194
+ /* PID */
195
+ if (fscanf(f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
196
+ /* Exec file */
197
+ cbuf = buf;
198
+ foundExeEnd = 0;
199
+ if (fscanf (f, "%c", cbuf++) == 0) goto error;
200
+ while (1) {
201
+ if (fscanf(f, "%c", cbuf) == 0) goto error;
202
+ if (*cbuf == ')') {
203
+ foundExeEnd = 1;
204
+ } else if (foundExeEnd && *cbuf == ' ') {
205
+ *cbuf = 0;
206
+ break;
207
+ }
208
+
209
+ cbuf++;
210
+ }
211
+ /* State */
212
+ if (fscanf (f, "%c ", &ctmp) == 0) goto error; /* coverity[secure_coding] */
213
+ /* Parent process */
214
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
215
+ /* Process group */
216
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
217
+ /* Session id */
218
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
219
+ /* TTY */
220
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
221
+ /* TTY owner process group */
222
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
223
+ /* Flags */
224
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
225
+ /* Minor faults (no memory page) */
226
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
227
+ /* Minor faults, children */
228
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
229
+ /* Major faults (memory page faults) */
230
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
231
+ /* Major faults, children */
232
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
233
+ /* utime */
234
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
235
+ /* stime */
236
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
237
+ /* utime, children */
238
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
239
+ /* stime, children */
240
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
241
+ /* jiffies remaining in current time slice */
242
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
243
+ /* 'nice' value */
244
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
245
+ /* jiffies until next timeout */
246
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
247
+ /* jiffies until next SIGALRM */
248
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
249
+ /* start time (jiffies since system boot) */
250
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
251
+
252
+ /* Virtual memory size */
253
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
254
+
255
+ /* Resident set size */
256
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
257
+ *rss = (size_t) utmp * page_size;
258
+
259
+ /* rlim */
260
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
261
+ /* Start of text */
262
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
263
+ /* End of text */
264
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
265
+ /* Start of stack */
266
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
267
+
268
+ fclose (f);
269
+ return uv_ok_;
270
+
271
+ error:
272
+ fclose (f);
273
+ return uv__new_sys_error(errno);
274
+ }
275
+
276
+
277
+ uv_err_t uv_uptime(double* uptime) {
278
+ static volatile int no_clock_boottime;
279
+ struct timespec now;
280
+ int r;
281
+
282
+ /* Try CLOCK_BOOTTIME first, fall back to CLOCK_MONOTONIC if not available
283
+ * (pre-2.6.39 kernels). CLOCK_MONOTONIC doesn't increase when the system
284
+ * is suspended.
285
+ */
286
+ if (no_clock_boottime) {
287
+ retry: r = clock_gettime(CLOCK_MONOTONIC, &now);
288
+ }
289
+ else if ((r = clock_gettime(CLOCK_BOOTTIME, &now)) && errno == EINVAL) {
290
+ no_clock_boottime = 1;
291
+ goto retry;
292
+ }
293
+
294
+ if (r)
295
+ return uv__new_sys_error(errno);
296
+
297
+ *uptime = now.tv_sec;
298
+ *uptime += (double)now.tv_nsec / 1000000000.0;
299
+ return uv_ok_;
300
+ }
301
+
302
+
303
+ uv_err_t uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
304
+ unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK),
305
+ multiplier = ((uint64_t)1000L / ticks), cpuspeed;
306
+ int numcpus = 0, i = 0;
307
+ unsigned long ticks_user, ticks_sys, ticks_idle, ticks_nice, ticks_intr;
308
+ char line[512], speedPath[256], model[512];
309
+ FILE *fpStat = fopen("/proc/stat", "r");
310
+ FILE *fpModel = fopen("/proc/cpuinfo", "r");
311
+ FILE *fpSpeed;
312
+ uv_cpu_info_t* cpu_info;
313
+
314
+ if (fpModel) {
315
+ while (fgets(line, 511, fpModel) != NULL) {
316
+ if (strncmp(line, "model name", 10) == 0) {
317
+ numcpus++;
318
+ if (numcpus == 1) {
319
+ char *p = strchr(line, ':') + 2;
320
+ strcpy(model, p);
321
+ model[strlen(model)-1] = 0;
322
+ }
323
+ } else if (strncmp(line, "cpu MHz", 7) == 0) {
324
+ if (numcpus == 1) {
325
+ sscanf(line, "%*s %*s : %u", &cpuspeed);
326
+ }
327
+ }
328
+ }
329
+ fclose(fpModel);
330
+ }
331
+
332
+ *cpu_infos = (uv_cpu_info_t*)malloc(numcpus * sizeof(uv_cpu_info_t));
333
+ if (!(*cpu_infos)) {
334
+ return uv__new_artificial_error(UV_ENOMEM);
335
+ }
336
+
337
+ *count = numcpus;
338
+
339
+ cpu_info = *cpu_infos;
340
+
341
+ if (fpStat) {
342
+ while (fgets(line, 511, fpStat) != NULL) {
343
+ if (strncmp(line, "cpu ", 4) == 0) {
344
+ continue;
345
+ } else if (strncmp(line, "cpu", 3) != 0) {
346
+ break;
347
+ }
348
+
349
+ sscanf(line, "%*s %lu %lu %lu %lu %*s %lu",
350
+ &ticks_user, &ticks_nice, &ticks_sys, &ticks_idle, &ticks_intr);
351
+ snprintf(speedPath, sizeof(speedPath),
352
+ "/sys/devices/system/cpu/cpu%u/cpufreq/cpuinfo_max_freq", i);
353
+
354
+ fpSpeed = fopen(speedPath, "r");
355
+
356
+ if (fpSpeed) {
357
+ if (fgets(line, 511, fpSpeed) != NULL) {
358
+ sscanf(line, "%u", &cpuspeed);
359
+ cpuspeed /= 1000;
360
+ }
361
+ fclose(fpSpeed);
362
+ }
363
+
364
+ cpu_info->cpu_times.user = ticks_user * multiplier;
365
+ cpu_info->cpu_times.nice = ticks_nice * multiplier;
366
+ cpu_info->cpu_times.sys = ticks_sys * multiplier;
367
+ cpu_info->cpu_times.idle = ticks_idle * multiplier;
368
+ cpu_info->cpu_times.irq = ticks_intr * multiplier;
369
+
370
+ cpu_info->model = strdup(model);
371
+ cpu_info->speed = cpuspeed;
372
+
373
+ cpu_info++;
374
+ }
375
+ fclose(fpStat);
376
+ }
377
+
378
+ return uv_ok_;
379
+ }
380
+
381
+
382
+ void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) {
383
+ int i;
384
+
385
+ for (i = 0; i < count; i++) {
386
+ free(cpu_infos[i].model);
387
+ }
388
+
389
+ free(cpu_infos);
390
+ }
391
+
392
+
393
+ uv_err_t uv_interface_addresses(uv_interface_address_t** addresses,
394
+ int* count) {
395
+ #ifndef HAVE_IFADDRS_H
396
+ return uv__new_artificial_error(UV_ENOSYS);
397
+ #else
398
+ struct ifaddrs *addrs, *ent;
399
+ char ip[INET6_ADDRSTRLEN];
400
+ uv_interface_address_t* address;
401
+
402
+ if (getifaddrs(&addrs) != 0) {
403
+ return uv__new_sys_error(errno);
404
+ }
405
+
406
+ *count = 0;
407
+
408
+ /* Count the number of interfaces */
409
+ for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
410
+ if (!(ent->ifa_flags & IFF_UP && ent->ifa_flags & IFF_RUNNING) ||
411
+ (ent->ifa_addr == NULL) ||
412
+ (ent->ifa_addr->sa_family == PF_PACKET)) {
413
+ continue;
414
+ }
415
+
416
+ (*count)++;
417
+ }
418
+
419
+ *addresses = (uv_interface_address_t*)
420
+ malloc(*count * sizeof(uv_interface_address_t));
421
+ if (!(*addresses)) {
422
+ return uv__new_artificial_error(UV_ENOMEM);
423
+ }
424
+
425
+ address = *addresses;
426
+
427
+ for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
428
+ bzero(&ip, sizeof (ip));
429
+ if (!(ent->ifa_flags & IFF_UP && ent->ifa_flags & IFF_RUNNING)) {
430
+ continue;
431
+ }
432
+
433
+ if (ent->ifa_addr == NULL) {
434
+ continue;
435
+ }
436
+
437
+ /*
438
+ * On Linux getifaddrs returns information related to the raw underlying
439
+ * devices. We're not interested in this information.
440
+ */
441
+ if (ent->ifa_addr->sa_family == PF_PACKET) {
442
+ continue;
443
+ }
444
+
445
+ address->name = strdup(ent->ifa_name);
446
+
447
+ if (ent->ifa_addr->sa_family == AF_INET6) {
448
+ address->address.address6 = *((struct sockaddr_in6 *)ent->ifa_addr);
449
+ } else {
450
+ address->address.address4 = *((struct sockaddr_in *)ent->ifa_addr);
451
+ }
452
+
453
+ address->is_internal = ent->ifa_flags & IFF_LOOPBACK ? 1 : 0;
454
+
455
+ address++;
456
+ }
457
+
458
+ freeifaddrs(addrs);
459
+
460
+ return uv_ok_;
461
+ #endif
462
+ }
463
+
464
+
465
+ void uv_free_interface_addresses(uv_interface_address_t* addresses,
466
+ int count) {
467
+ int i;
468
+
469
+ for (i = 0; i < count; i++) {
470
+ free(addresses[i].name);
471
+ }
472
+
473
+ free(addresses);
474
+ }
@@ -0,0 +1,211 @@
1
+ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
3
+ * of this software and associated documentation files (the "Software"), to
4
+ * deal in the Software without restriction, including without limitation the
5
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6
+ * sell copies of the Software, and to permit persons to whom the Software is
7
+ * furnished to do so, subject to the following conditions:
8
+ *
9
+ * The above copyright notice and this permission notice shall be included in
10
+ * all copies or substantial portions of the Software.
11
+ *
12
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
18
+ * IN THE SOFTWARE.
19
+ */
20
+
21
+ #include "uv.h"
22
+ #include "tree.h"
23
+ #include "../internal.h"
24
+ #include "syscalls.h"
25
+
26
+ #include <stdint.h>
27
+ #include <stdio.h>
28
+ #include <stdlib.h>
29
+ #include <string.h>
30
+ #include <assert.h>
31
+ #include <errno.h>
32
+
33
+ #include <sys/types.h>
34
+ #include <unistd.h>
35
+
36
+
37
+ /* Don't look aghast, this is exactly how glibc's basename() works. */
38
+ static char* basename_r(const char* path) {
39
+ char* s = strrchr(path, '/');
40
+ return s ? (s + 1) : (char*)path;
41
+ }
42
+
43
+
44
+ static int compare_watchers(const uv_fs_event_t* a, const uv_fs_event_t* b) {
45
+ if (a->fd < b->fd) return -1;
46
+ if (a->fd > b->fd) return 1;
47
+ return 0;
48
+ }
49
+
50
+
51
+ RB_GENERATE_STATIC(uv__inotify_watchers, uv_fs_event_s, node, compare_watchers)
52
+
53
+
54
+ static void uv__inotify_read(EV_P_ ev_io* w, int revents);
55
+
56
+
57
+ static int new_inotify_fd(void) {
58
+ int fd;
59
+
60
+ fd = uv__inotify_init1(UV__IN_NONBLOCK | UV__IN_CLOEXEC);
61
+ if (fd != -1)
62
+ return fd;
63
+ if (errno != ENOSYS)
64
+ return -1;
65
+
66
+ if ((fd = uv__inotify_init()) == -1)
67
+ return -1;
68
+
69
+ if (uv__cloexec(fd, 1) || uv__nonblock(fd, 1)) {
70
+ SAVE_ERRNO(close(fd));
71
+ return -1;
72
+ }
73
+
74
+ return fd;
75
+ }
76
+
77
+
78
+ static int init_inotify(uv_loop_t* loop) {
79
+ if (loop->inotify_fd != -1)
80
+ return 0;
81
+
82
+ loop->inotify_fd = new_inotify_fd();
83
+ if (loop->inotify_fd == -1) {
84
+ uv__set_sys_error(loop, errno);
85
+ return -1;
86
+ }
87
+
88
+ ev_io_init(&loop->inotify_read_watcher,
89
+ uv__inotify_read,
90
+ loop->inotify_fd,
91
+ EV_READ);
92
+ ev_io_start(loop->ev, &loop->inotify_read_watcher);
93
+ ev_unref(loop->ev);
94
+
95
+ return 0;
96
+ }
97
+
98
+
99
+ static void add_watcher(uv_fs_event_t* handle) {
100
+ RB_INSERT(uv__inotify_watchers, &handle->loop->inotify_watchers, handle);
101
+ }
102
+
103
+
104
+ static uv_fs_event_t* find_watcher(uv_loop_t* loop, int wd) {
105
+ uv_fs_event_t handle;
106
+ handle.fd = wd;
107
+ return RB_FIND(uv__inotify_watchers, &loop->inotify_watchers, &handle);
108
+ }
109
+
110
+
111
+ static void remove_watcher(uv_fs_event_t* handle) {
112
+ RB_REMOVE(uv__inotify_watchers, &handle->loop->inotify_watchers, handle);
113
+ }
114
+
115
+
116
+ static void uv__inotify_read(EV_P_ ev_io* w, int revents) {
117
+ const struct uv__inotify_event* e;
118
+ uv_fs_event_t* handle;
119
+ uv_loop_t* uv_loop;
120
+ const char* filename;
121
+ ssize_t size;
122
+ int events;
123
+ const char *p;
124
+ /* needs to be large enough for sizeof(inotify_event) + strlen(filename) */
125
+ char buf[4096];
126
+
127
+ uv_loop = container_of(w, uv_loop_t, inotify_read_watcher);
128
+
129
+ while (1) {
130
+ do {
131
+ size = read(uv_loop->inotify_fd, buf, sizeof buf);
132
+ }
133
+ while (size == -1 && errno == EINTR);
134
+
135
+ if (size == -1) {
136
+ assert(errno == EAGAIN || errno == EWOULDBLOCK);
137
+ break;
138
+ }
139
+
140
+ assert(size > 0); /* pre-2.6.21 thing, size=0 == read buffer too small */
141
+
142
+ /* Now we have one or more inotify_event structs. */
143
+ for (p = buf; p < buf + size; p += sizeof(*e) + e->len) {
144
+ e = (const struct uv__inotify_event*)p;
145
+
146
+ events = 0;
147
+ if (e->mask & (UV__IN_ATTRIB|UV__IN_MODIFY))
148
+ events |= UV_CHANGE;
149
+ if (e->mask & ~(UV__IN_ATTRIB|UV__IN_MODIFY))
150
+ events |= UV_RENAME;
151
+
152
+ handle = find_watcher(uv_loop, e->wd);
153
+ if (handle == NULL)
154
+ continue; /* Handle has already been closed. */
155
+
156
+ /* inotify does not return the filename when monitoring a single file
157
+ * for modifications. Repurpose the filename for API compatibility.
158
+ * I'm not convinced this is a good thing, maybe it should go.
159
+ */
160
+ filename = e->len ? (const char*) (e + 1) : basename_r(handle->filename);
161
+
162
+ handle->cb(handle, filename, events, 0);
163
+ }
164
+ }
165
+ }
166
+
167
+
168
+ int uv_fs_event_init(uv_loop_t* loop,
169
+ uv_fs_event_t* handle,
170
+ const char* filename,
171
+ uv_fs_event_cb cb,
172
+ int flags) {
173
+ int events;
174
+ int wd;
175
+
176
+ loop->counters.fs_event_init++;
177
+
178
+ /* We don't support any flags yet. */
179
+ assert(!flags);
180
+
181
+ if (init_inotify(loop)) return -1;
182
+
183
+ events = UV__IN_ATTRIB
184
+ | UV__IN_CREATE
185
+ | UV__IN_MODIFY
186
+ | UV__IN_DELETE
187
+ | UV__IN_DELETE_SELF
188
+ | UV__IN_MOVED_FROM
189
+ | UV__IN_MOVED_TO;
190
+
191
+ wd = uv__inotify_add_watch(loop->inotify_fd, filename, events);
192
+ if (wd == -1) return uv__set_sys_error(loop, errno);
193
+
194
+ uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT);
195
+ handle->filename = strdup(filename);
196
+ handle->cb = cb;
197
+ handle->fd = wd;
198
+ add_watcher(handle);
199
+
200
+ return 0;
201
+ }
202
+
203
+
204
+ void uv__fs_event_close(uv_fs_event_t* handle) {
205
+ uv__inotify_rm_watch(handle->loop->inotify_fd, handle->fd);
206
+ remove_watcher(handle);
207
+ handle->fd = -1;
208
+
209
+ free(handle->filename);
210
+ handle->filename = NULL;
211
+ }