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,290 @@
1
+ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2
+ *
3
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ * of this software and associated documentation files (the "Software"), to
5
+ * deal in the Software without restriction, including without limitation the
6
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ * sell copies of the Software, and to permit persons to whom the Software is
8
+ * furnished to do so, subject to the following conditions:
9
+ *
10
+ * The above copyright notice and this permission notice shall be included in
11
+ * all copies or substantial portions of the Software.
12
+ *
13
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19
+ * IN THE SOFTWARE.
20
+ */
21
+
22
+ #include <assert.h>
23
+
24
+ #include "uv.h"
25
+ #include "../uv-common.h"
26
+ #include "internal.h"
27
+
28
+
29
+ /*
30
+ * Subclass of uv_handle_t. Used for integration of c-ares.
31
+ */
32
+ struct uv_ares_action_s {
33
+ UV_HANDLE_FIELDS
34
+ struct uv_req_s ares_req;
35
+ SOCKET sock;
36
+ int read;
37
+ int write;
38
+ };
39
+
40
+
41
+ /* default timeout per socket request if ares does not specify value */
42
+ /* use 20 sec */
43
+ #define ARES_TIMEOUT_MS 20000
44
+
45
+
46
+ /* thread pool callback when socket is signalled */
47
+ static void CALLBACK uv_ares_socksignal_tp(void* parameter,
48
+ BOOLEAN timerfired) {
49
+ WSANETWORKEVENTS network_events;
50
+ uv_ares_task_t* sockhandle;
51
+ uv_ares_action_t* selhandle;
52
+ uv_req_t* uv_ares_req;
53
+ uv_loop_t* loop;
54
+
55
+ assert(parameter != NULL);
56
+
57
+ if (parameter != NULL) {
58
+ sockhandle = (uv_ares_task_t*) parameter;
59
+ loop = sockhandle->loop;
60
+
61
+ /* clear socket status for this event */
62
+ /* do not fail if error, thread may run after socket close */
63
+ /* The code assumes that c-ares will write all pending data in the */
64
+ /* callback, unless the socket would block. We can clear the state here */
65
+ /* to avoid unnecessary signals. */
66
+ WSAEnumNetworkEvents(sockhandle->sock,
67
+ sockhandle->h_event,
68
+ &network_events);
69
+
70
+ /* setup new handle */
71
+ selhandle = (uv_ares_action_t*)malloc(sizeof(uv_ares_action_t));
72
+ if (selhandle == NULL) {
73
+ uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
74
+ }
75
+ selhandle->type = UV_ARES_EVENT;
76
+ selhandle->close_cb = NULL;
77
+ selhandle->data = sockhandle->data;
78
+ selhandle->sock = sockhandle->sock;
79
+ selhandle->read =
80
+ (network_events.lNetworkEvents & (FD_READ | FD_CONNECT)) ? 1 : 0;
81
+ selhandle->write =
82
+ (network_events.lNetworkEvents & (FD_WRITE | FD_CONNECT)) ? 1 : 0;
83
+
84
+ uv_ares_req = &selhandle->ares_req;
85
+ uv_req_init(loop, uv_ares_req);
86
+ uv_ares_req->type = UV_ARES_EVENT_REQ;
87
+ uv_ares_req->data = selhandle;
88
+
89
+ /* post ares needs to called */
90
+ POST_COMPLETION_FOR_REQ(loop, uv_ares_req);
91
+ }
92
+ }
93
+
94
+
95
+ /* periodically call ares to check for timeouts */
96
+ static void uv_ares_poll(uv_timer_t* handle, int status) {
97
+ uv_loop_t* loop = handle->loop;
98
+ if (loop->ares_chan != NULL && loop->ares_active_sockets > 0) {
99
+ ares_process_fd(loop->ares_chan, ARES_SOCKET_BAD, ARES_SOCKET_BAD);
100
+ }
101
+ }
102
+
103
+
104
+ /* callback from ares when socket operation is started */
105
+ static void uv_ares_sockstate_cb(void *data, ares_socket_t sock, int read,
106
+ int write) {
107
+ /* look to see if we have a handle for this socket in our list */
108
+ uv_loop_t* loop = (uv_loop_t*) data;
109
+ uv_ares_task_t* uv_handle_ares = uv_find_ares_handle(loop, sock);
110
+
111
+ int timeoutms = 0;
112
+
113
+ if (read == 0 && write == 0) {
114
+ /* if read and write are 0, cleanup existing data */
115
+ /* The code assumes that c-ares does a callback with read = 0 and */
116
+ /* write = 0 when the socket is closed. After we receive this we stop */
117
+ /* monitoring the socket. */
118
+ if (uv_handle_ares != NULL) {
119
+ uv_req_t* uv_ares_req;
120
+
121
+ uv_handle_ares->h_close_event = CreateEvent(NULL, FALSE, FALSE, NULL);
122
+ /* remove Wait */
123
+ if (uv_handle_ares->h_wait) {
124
+ UnregisterWaitEx(uv_handle_ares->h_wait,
125
+ uv_handle_ares->h_close_event);
126
+ uv_handle_ares->h_wait = NULL;
127
+ }
128
+
129
+ /* detach socket from the event */
130
+ WSAEventSelect(sock, NULL, 0);
131
+ if (uv_handle_ares->h_event != WSA_INVALID_EVENT) {
132
+ WSACloseEvent(uv_handle_ares->h_event);
133
+ uv_handle_ares->h_event = WSA_INVALID_EVENT;
134
+ }
135
+ /* remove handle from list */
136
+ uv_remove_ares_handle(uv_handle_ares);
137
+
138
+ /* Post request to cleanup the Task */
139
+ uv_ares_req = &uv_handle_ares->ares_req;
140
+ uv_req_init(loop, uv_ares_req);
141
+ uv_ares_req->type = UV_ARES_CLEANUP_REQ;
142
+ uv_ares_req->data = uv_handle_ares;
143
+
144
+ /* post ares done with socket - finish cleanup when all threads done. */
145
+ POST_COMPLETION_FOR_REQ(loop, uv_ares_req);
146
+ } else {
147
+ assert(0);
148
+ uv_fatal_error(ERROR_INVALID_DATA, "ares_SockStateCB");
149
+ }
150
+ } else {
151
+ if (uv_handle_ares == NULL) {
152
+ /* setup new handle */
153
+ /* The code assumes that c-ares will call us when it has an open socket.
154
+ We need to call into c-ares when there is something to read,
155
+ or when it becomes writable. */
156
+ uv_handle_ares = (uv_ares_task_t*)malloc(sizeof(uv_ares_task_t));
157
+ if (uv_handle_ares == NULL) {
158
+ uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
159
+ }
160
+ uv_handle_ares->type = UV_ARES_TASK;
161
+ uv_handle_ares->close_cb = NULL;
162
+ uv_handle_ares->loop = loop;
163
+ uv_handle_ares->data = loop;
164
+ uv_handle_ares->sock = sock;
165
+ uv_handle_ares->h_wait = NULL;
166
+ uv_handle_ares->flags = 0;
167
+
168
+ /* create an event to wait on socket signal */
169
+ uv_handle_ares->h_event = WSACreateEvent();
170
+ if (uv_handle_ares->h_event == WSA_INVALID_EVENT) {
171
+ uv_fatal_error(WSAGetLastError(), "WSACreateEvent");
172
+ }
173
+
174
+ /* tie event to socket */
175
+ if (SOCKET_ERROR == WSAEventSelect(sock,
176
+ uv_handle_ares->h_event,
177
+ FD_READ | FD_WRITE | FD_CONNECT)) {
178
+ uv_fatal_error(WSAGetLastError(), "WSAEventSelect");
179
+ }
180
+
181
+ /* add handle to list */
182
+ uv_add_ares_handle(loop, uv_handle_ares);
183
+ uv_ref(loop);
184
+
185
+ /*
186
+ * we have a single polling timer for all ares sockets.
187
+ * This is preferred to using ares_timeout. See ares_timeout.c warning.
188
+ * if timer is not running start it, and keep socket count
189
+ */
190
+ if (loop->ares_active_sockets == 0) {
191
+ uv_timer_init(loop, &loop->ares_polling_timer);
192
+ uv_timer_start(&loop->ares_polling_timer, uv_ares_poll, 1000L, 1000L);
193
+ }
194
+ loop->ares_active_sockets++;
195
+
196
+ /* specify thread pool function to call when event is signaled */
197
+ if (RegisterWaitForSingleObject(&uv_handle_ares->h_wait,
198
+ uv_handle_ares->h_event,
199
+ uv_ares_socksignal_tp,
200
+ (void*)uv_handle_ares,
201
+ INFINITE,
202
+ WT_EXECUTEINWAITTHREAD) == 0) {
203
+ uv_fatal_error(GetLastError(), "RegisterWaitForSingleObject");
204
+ }
205
+ } else {
206
+ /* found existing handle. */
207
+ assert(uv_handle_ares->type == UV_ARES_TASK);
208
+ assert(uv_handle_ares->data != NULL);
209
+ assert(uv_handle_ares->h_event != WSA_INVALID_EVENT);
210
+ }
211
+ }
212
+ }
213
+
214
+
215
+ /* called via uv_poll when ares completion port signaled */
216
+ void uv_process_ares_event_req(uv_loop_t* loop, uv_ares_action_t* handle,
217
+ uv_req_t* req) {
218
+ ares_process_fd(loop->ares_chan,
219
+ handle->read ? handle->sock : INVALID_SOCKET,
220
+ handle->write ? handle->sock : INVALID_SOCKET);
221
+
222
+ /* release handle for select here */
223
+ free(handle);
224
+ }
225
+
226
+
227
+ /* called via uv_poll when ares is finished with socket */
228
+ void uv_process_ares_cleanup_req(uv_loop_t* loop, uv_ares_task_t* handle,
229
+ uv_req_t* req) {
230
+ /* check for event complete without waiting */
231
+ unsigned int signaled = WaitForSingleObject(handle->h_close_event, 0);
232
+
233
+ if (signaled != WAIT_TIMEOUT) {
234
+ uv_unref(loop);
235
+
236
+ /* close event handle and free uv handle memory */
237
+ CloseHandle(handle->h_close_event);
238
+ free(handle);
239
+
240
+ /* decrement active count. if it becomes 0 stop polling */
241
+ if (loop->ares_active_sockets > 0) {
242
+ loop->ares_active_sockets--;
243
+ if (loop->ares_active_sockets == 0) {
244
+ uv_close((uv_handle_t*) &loop->ares_polling_timer, NULL);
245
+ }
246
+ }
247
+ } else {
248
+ /* still busy - repost and try again */
249
+ POST_COMPLETION_FOR_REQ(loop, req);
250
+ }
251
+ }
252
+
253
+
254
+ /* set ares SOCK_STATE callback to our handler */
255
+ int uv_ares_init_options(uv_loop_t* loop,
256
+ ares_channel *channelptr,
257
+ struct ares_options *options,
258
+ int optmask) {
259
+ int rc;
260
+
261
+ /* only allow single init at a time */
262
+ if (loop->ares_chan != NULL) {
263
+ return UV_EALREADY;
264
+ }
265
+
266
+ /* set our callback as an option */
267
+ options->sock_state_cb = uv_ares_sockstate_cb;
268
+ options->sock_state_cb_data = loop;
269
+ optmask |= ARES_OPT_SOCK_STATE_CB;
270
+
271
+ /* We do the call to ares_init_option for caller. */
272
+ rc = ares_init_options(channelptr, options, optmask);
273
+
274
+ /* if success, save channel */
275
+ if (rc == ARES_SUCCESS) {
276
+ loop->ares_chan = *channelptr;
277
+ }
278
+
279
+ return rc;
280
+ }
281
+
282
+
283
+ /* release memory */
284
+ void uv_ares_destroy(uv_loop_t* loop, ares_channel channel) {
285
+ /* only allow destroy if did init */
286
+ if (loop->ares_chan != NULL) {
287
+ ares_destroy(channel);
288
+ loop->ares_chan = NULL;
289
+ }
290
+ }
@@ -0,0 +1,270 @@
1
+ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2
+ *
3
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ * of this software and associated documentation files (the "Software"), to
5
+ * deal in the Software without restriction, including without limitation the
6
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ * sell copies of the Software, and to permit persons to whom the Software is
8
+ * furnished to do so, subject to the following conditions:
9
+ *
10
+ * The above copyright notice and this permission notice shall be included in
11
+ * all copies or substantial portions of the Software.
12
+ *
13
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19
+ * IN THE SOFTWARE.
20
+ */
21
+
22
+ #include <assert.h>
23
+ #include <errno.h>
24
+ #include <limits.h>
25
+ #include <malloc.h>
26
+ #include <stdio.h>
27
+ #include <string.h>
28
+
29
+ #include "uv.h"
30
+ #include "../uv-common.h"
31
+ #include "internal.h"
32
+
33
+
34
+ /* The only event loop we support right now */
35
+ static uv_loop_t uv_default_loop_;
36
+
37
+ /* uv_once intialization guards */
38
+ static uv_once_t uv_init_guard_ = UV_ONCE_INIT;
39
+ static uv_once_t uv_default_loop_init_guard_ = UV_ONCE_INIT;
40
+
41
+
42
+ static void uv_init(void) {
43
+ /* Tell Windows that we will handle critical errors. */
44
+ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX |
45
+ SEM_NOOPENFILEERRORBOX);
46
+
47
+ /* Initialize winsock */
48
+ uv_winsock_init();
49
+
50
+ /* Fetch winapi function pointers */
51
+ uv_winapi_init();
52
+
53
+ /* Initialize FS */
54
+ uv_fs_init();
55
+
56
+ /* Initialize console */
57
+ uv_console_init();
58
+ }
59
+
60
+
61
+ static void uv_loop_init(uv_loop_t* loop) {
62
+ /* Create an I/O completion port */
63
+ loop->iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1);
64
+ if (loop->iocp == NULL) {
65
+ uv_fatal_error(GetLastError(), "CreateIoCompletionPort");
66
+ }
67
+
68
+ loop->refs = 0;
69
+
70
+ uv_update_time(loop);
71
+
72
+ loop->pending_reqs_tail = NULL;
73
+
74
+ loop->endgame_handles = NULL;
75
+
76
+ RB_INIT(&loop->timers);
77
+ RB_INIT(&loop->uv_ares_handles_);
78
+
79
+ loop->check_handles = NULL;
80
+ loop->prepare_handles = NULL;
81
+ loop->idle_handles = NULL;
82
+
83
+ loop->next_prepare_handle = NULL;
84
+ loop->next_check_handle = NULL;
85
+ loop->next_idle_handle = NULL;
86
+
87
+ loop->ares_active_sockets = 0;
88
+ loop->ares_chan = NULL;
89
+
90
+ loop->active_tcp_streams = 0;
91
+ loop->active_udp_streams = 0;
92
+
93
+ loop->last_err = uv_ok_;
94
+ }
95
+
96
+
97
+ static void uv_default_loop_init(void) {
98
+ /* Initialize libuv itself first */
99
+ uv_once(&uv_init_guard_, uv_init);
100
+
101
+ /* Initialize the main loop */
102
+ uv_loop_init(&uv_default_loop_);
103
+ }
104
+
105
+
106
+ uv_loop_t* uv_default_loop(void) {
107
+ uv_once(&uv_default_loop_init_guard_, uv_default_loop_init);
108
+ return &uv_default_loop_;
109
+ }
110
+
111
+
112
+ uv_loop_t* uv_loop_new(void) {
113
+ uv_loop_t* loop;
114
+
115
+ /* Initialize libuv itself first */
116
+ uv_once(&uv_init_guard_, uv_init);
117
+
118
+ loop = (uv_loop_t*)malloc(sizeof(uv_loop_t));
119
+
120
+ if (!loop) {
121
+ uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
122
+ }
123
+
124
+ uv_loop_init(loop);
125
+ return loop;
126
+ }
127
+
128
+
129
+ void uv_loop_delete(uv_loop_t* loop) {
130
+ if (loop != &uv_default_loop_) {
131
+ free(loop);
132
+ }
133
+ }
134
+
135
+
136
+ int uv_loop_refcount(const uv_loop_t* loop) {
137
+ return loop->refs;
138
+ }
139
+
140
+
141
+ void uv_ref(uv_loop_t* loop) {
142
+ loop->refs++;
143
+ }
144
+
145
+
146
+ void uv_unref(uv_loop_t* loop) {
147
+ loop->refs--;
148
+ }
149
+
150
+
151
+ static void uv_poll(uv_loop_t* loop, int block) {
152
+ BOOL success;
153
+ DWORD bytes, timeout;
154
+ ULONG_PTR key;
155
+ OVERLAPPED* overlapped;
156
+ uv_req_t* req;
157
+
158
+ if (block) {
159
+ timeout = uv_get_poll_timeout(loop);
160
+ } else {
161
+ timeout = 0;
162
+ }
163
+
164
+ success = GetQueuedCompletionStatus(loop->iocp,
165
+ &bytes,
166
+ &key,
167
+ &overlapped,
168
+ timeout);
169
+
170
+ if (overlapped) {
171
+ /* Package was dequeued */
172
+ req = uv_overlapped_to_req(overlapped);
173
+
174
+ uv_insert_pending_req(loop, req);
175
+
176
+ } else if (GetLastError() != WAIT_TIMEOUT) {
177
+ /* Serious error */
178
+ uv_fatal_error(GetLastError(), "GetQueuedCompletionStatus");
179
+ }
180
+ }
181
+
182
+
183
+ static void uv_poll_ex(uv_loop_t* loop, int block) {
184
+ BOOL success;
185
+ DWORD timeout;
186
+ uv_req_t* req;
187
+ OVERLAPPED_ENTRY overlappeds[128];
188
+ ULONG count;
189
+ ULONG i;
190
+
191
+ if (block) {
192
+ timeout = uv_get_poll_timeout(loop);
193
+ } else {
194
+ timeout = 0;
195
+ }
196
+
197
+ assert(pGetQueuedCompletionStatusEx);
198
+
199
+ success = pGetQueuedCompletionStatusEx(loop->iocp,
200
+ overlappeds,
201
+ ARRAY_SIZE(overlappeds),
202
+ &count,
203
+ timeout,
204
+ FALSE);
205
+ if (success) {
206
+ for (i = 0; i < count; i++) {
207
+ /* Package was dequeued */
208
+ req = uv_overlapped_to_req(overlappeds[i].lpOverlapped);
209
+ uv_insert_pending_req(loop, req);
210
+ }
211
+ } else if (GetLastError() != WAIT_TIMEOUT) {
212
+ /* Serious error */
213
+ uv_fatal_error(GetLastError(), "GetQueuedCompletionStatusEx");
214
+ }
215
+ }
216
+
217
+ #define UV_LOOP_ONCE(loop, poll) \
218
+ do { \
219
+ uv_update_time((loop)); \
220
+ uv_process_timers((loop)); \
221
+ \
222
+ /* Call idle callbacks if nothing to do. */ \
223
+ if ((loop)->pending_reqs_tail == NULL && \
224
+ (loop)->endgame_handles == NULL) { \
225
+ uv_idle_invoke((loop)); \
226
+ } \
227
+ \
228
+ uv_process_reqs((loop)); \
229
+ uv_process_endgames((loop)); \
230
+ \
231
+ if ((loop)->refs <= 0) { \
232
+ break; \
233
+ } \
234
+ \
235
+ uv_prepare_invoke((loop)); \
236
+ \
237
+ poll((loop), (loop)->idle_handles == NULL && \
238
+ (loop)->pending_reqs_tail == NULL && \
239
+ (loop)->endgame_handles == NULL && \
240
+ (loop)->refs > 0); \
241
+ \
242
+ uv_check_invoke((loop)); \
243
+ } while (0);
244
+
245
+ #define UV_LOOP(loop, poll) \
246
+ while ((loop)->refs > 0) { \
247
+ UV_LOOP_ONCE(loop, poll) \
248
+ }
249
+
250
+
251
+ int uv_run_once(uv_loop_t* loop) {
252
+ if (pGetQueuedCompletionStatusEx) {
253
+ UV_LOOP_ONCE(loop, uv_poll_ex);
254
+ } else {
255
+ UV_LOOP_ONCE(loop, uv_poll);
256
+ }
257
+ return 0;
258
+ }
259
+
260
+
261
+ int uv_run(uv_loop_t* loop) {
262
+ if (pGetQueuedCompletionStatusEx) {
263
+ UV_LOOP(loop, uv_poll_ex);
264
+ } else {
265
+ UV_LOOP(loop, uv_poll);
266
+ }
267
+
268
+ assert(loop->refs == 0);
269
+ return 0;
270
+ }
@@ -0,0 +1,82 @@
1
+ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2
+ *
3
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ * of this software and associated documentation files (the "Software"), to
5
+ * deal in the Software without restriction, including without limitation the
6
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ * sell copies of the Software, and to permit persons to whom the Software is
8
+ * furnished to do so, subject to the following conditions:
9
+ *
10
+ * The above copyright notice and this permission notice shall be included in
11
+ * all copies or substantial portions of the Software.
12
+ *
13
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19
+ * IN THE SOFTWARE.
20
+ */
21
+
22
+ #include "uv.h"
23
+ #include "internal.h"
24
+
25
+ __declspec( thread ) DWORD saved_errno = 0;
26
+
27
+ uv_err_t uv_dlopen(const char* filename, uv_lib_t* library) {
28
+ wchar_t filename_w[32768];
29
+ HMODULE handle;
30
+
31
+ if (!uv_utf8_to_utf16(filename,
32
+ filename_w,
33
+ sizeof(filename_w) / sizeof(wchar_t))) {
34
+ saved_errno = GetLastError();
35
+ return uv__new_sys_error(saved_errno);
36
+ }
37
+
38
+ handle = LoadLibraryW(filename_w);
39
+ if (handle == NULL) {
40
+ saved_errno = GetLastError();
41
+ return uv__new_sys_error(saved_errno);
42
+ }
43
+
44
+ *library = handle;
45
+ return uv_ok_;
46
+ }
47
+
48
+
49
+ uv_err_t uv_dlclose(uv_lib_t library) {
50
+ if (!FreeLibrary(library)) {
51
+ saved_errno = GetLastError();
52
+ return uv__new_sys_error(saved_errno);
53
+ }
54
+
55
+ return uv_ok_;
56
+ }
57
+
58
+
59
+ uv_err_t uv_dlsym(uv_lib_t library, const char* name, void** ptr) {
60
+ FARPROC proc = GetProcAddress(library, name);
61
+ if (proc == NULL) {
62
+ saved_errno = GetLastError();
63
+ return uv__new_sys_error(saved_errno);
64
+ }
65
+
66
+ *ptr = (void*) proc;
67
+ return uv_ok_;
68
+ }
69
+
70
+
71
+ const char *uv_dlerror(uv_lib_t library) {
72
+ char* buf = NULL;
73
+ FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
74
+ FORMAT_MESSAGE_IGNORE_INSERTS, NULL, saved_errno,
75
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPSTR)&buf, 0, NULL);
76
+ return buf;
77
+ }
78
+
79
+
80
+ void uv_dlerror_free(uv_lib_t library, const char *msg) {
81
+ LocalFree((LPVOID)msg);
82
+ }