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,523 @@
1
+
2
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
3
+ *
4
+ * Permission to use, copy, modify, and distribute this
5
+ * software and its documentation for any purpose and without
6
+ * fee is hereby granted, provided that the above copyright
7
+ * notice appear in all copies and that both that copyright
8
+ * notice and this permission notice appear in supporting
9
+ * documentation, and that the name of M.I.T. not be used in
10
+ * advertising or publicity pertaining to distribution of the
11
+ * software without specific, written prior permission.
12
+ * M.I.T. makes no representations about the suitability of
13
+ * this software for any purpose. It is provided "as is"
14
+ * without express or implied warranty.
15
+ */
16
+
17
+ #include "ares_setup.h"
18
+
19
+ #ifdef HAVE_SYS_SOCKET_H
20
+ # include <sys/socket.h>
21
+ #endif
22
+ #ifdef HAVE_NETINET_IN_H
23
+ # include <netinet/in.h>
24
+ #endif
25
+ #ifdef HAVE_NETDB_H
26
+ # include <netdb.h>
27
+ #endif
28
+ #ifdef HAVE_ARPA_INET_H
29
+ # include <arpa/inet.h>
30
+ #endif
31
+ #ifdef HAVE_ARPA_NAMESER_H
32
+ # include <arpa/nameser.h>
33
+ #else
34
+ # include "nameser.h"
35
+ #endif
36
+ #ifdef HAVE_ARPA_NAMESER_COMPAT_H
37
+ # include <arpa/nameser_compat.h>
38
+ #endif
39
+
40
+ #include <stdio.h>
41
+ #include <stdlib.h>
42
+ #include <string.h>
43
+ #include <ctype.h>
44
+ #ifdef HAVE_STRINGS_H
45
+ #include <strings.h>
46
+ #endif
47
+
48
+ #include "ares.h"
49
+ #include "inet_net_pton.h"
50
+ #include "bitncmp.h"
51
+ #include "ares_platform.h"
52
+ #include "ares_private.h"
53
+
54
+ #ifdef WATT32
55
+ #undef WIN32
56
+ #endif
57
+
58
+ struct host_query {
59
+ /* Arguments passed to ares_gethostbyname() */
60
+ ares_channel channel;
61
+ char *name;
62
+ ares_host_callback callback;
63
+ void *arg;
64
+ int sent_family; /* this family is what was is being used */
65
+ int want_family; /* this family is what is asked for in the API */
66
+ const char *remaining_lookups;
67
+ int timeouts;
68
+ };
69
+
70
+ static void next_lookup(struct host_query *hquery, int status_code);
71
+ static void host_callback(void *arg, int status, int timeouts,
72
+ unsigned char *abuf, int alen);
73
+ static void end_hquery(struct host_query *hquery, int status,
74
+ struct hostent *host);
75
+ static int fake_hostent(const char *name, int family,
76
+ ares_host_callback callback, void *arg);
77
+ static int file_lookup(const char *name, int family, struct hostent **host);
78
+ static void sort_addresses(struct hostent *host,
79
+ const struct apattern *sortlist, int nsort);
80
+ static void sort6_addresses(struct hostent *host,
81
+ const struct apattern *sortlist, int nsort);
82
+ static int get_address_index(const struct in_addr *addr,
83
+ const struct apattern *sortlist, int nsort);
84
+ static int get6_address_index(const struct ares_in6_addr *addr,
85
+ const struct apattern *sortlist, int nsort);
86
+
87
+ void ares_gethostbyname(ares_channel channel, const char *name, int family,
88
+ ares_host_callback callback, void *arg)
89
+ {
90
+ struct host_query *hquery;
91
+
92
+ /* Right now we only know how to look up Internet addresses - and unspec
93
+ means try both basically. */
94
+ switch (family) {
95
+ case AF_INET:
96
+ case AF_INET6:
97
+ case AF_UNSPEC:
98
+ break;
99
+ default:
100
+ callback(arg, ARES_ENOTIMP, 0, NULL);
101
+ return;
102
+ }
103
+
104
+ if (fake_hostent(name, family, callback, arg))
105
+ return;
106
+
107
+ /* Allocate and fill in the host query structure. */
108
+ hquery = malloc(sizeof(struct host_query));
109
+ if (!hquery)
110
+ {
111
+ callback(arg, ARES_ENOMEM, 0, NULL);
112
+ return;
113
+ }
114
+ hquery->channel = channel;
115
+ hquery->name = strdup(name);
116
+ hquery->want_family = family;
117
+ hquery->sent_family = -1; /* nothing is sent yet */
118
+ if (!hquery->name) {
119
+ free(hquery);
120
+ callback(arg, ARES_ENOMEM, 0, NULL);
121
+ return;
122
+ }
123
+ hquery->callback = callback;
124
+ hquery->arg = arg;
125
+ hquery->remaining_lookups = channel->lookups;
126
+ hquery->timeouts = 0;
127
+
128
+ /* Start performing lookups according to channel->lookups. */
129
+ next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */);
130
+ }
131
+
132
+ static void next_lookup(struct host_query *hquery, int status_code)
133
+ {
134
+ const char *p;
135
+ struct hostent *host;
136
+ int status = status_code;
137
+
138
+ for (p = hquery->remaining_lookups; *p; p++)
139
+ {
140
+ switch (*p)
141
+ {
142
+ case 'b':
143
+ /* DNS lookup */
144
+ hquery->remaining_lookups = p + 1;
145
+ if ((hquery->want_family == AF_INET6) ||
146
+ (hquery->want_family == AF_UNSPEC)) {
147
+ /* if inet6 or unspec, start out with AAAA */
148
+ hquery->sent_family = AF_INET6;
149
+ ares_search(hquery->channel, hquery->name, C_IN, T_AAAA,
150
+ host_callback, hquery);
151
+ }
152
+ else {
153
+ hquery->sent_family = AF_INET;
154
+ ares_search(hquery->channel, hquery->name, C_IN, T_A,
155
+ host_callback, hquery);
156
+ }
157
+ return;
158
+
159
+ case 'f':
160
+ /* Host file lookup */
161
+ status = file_lookup(hquery->name, hquery->want_family, &host);
162
+
163
+ /* this status check below previously checked for !ARES_ENOTFOUND,
164
+ but we should not assume that this single error code is the one
165
+ that can occur, as that is in fact no longer the case */
166
+ if (status == ARES_SUCCESS)
167
+ {
168
+ end_hquery(hquery, status, host);
169
+ return;
170
+ }
171
+ status = status_code; /* Use original status code */
172
+ break;
173
+ }
174
+ }
175
+ end_hquery(hquery, status, NULL);
176
+ }
177
+
178
+ static void host_callback(void *arg, int status, int timeouts,
179
+ unsigned char *abuf, int alen)
180
+ {
181
+ struct host_query *hquery = (struct host_query *) arg;
182
+ ares_channel channel = hquery->channel;
183
+ struct hostent *host = NULL;
184
+
185
+ hquery->timeouts += timeouts;
186
+ if (status == ARES_SUCCESS)
187
+ {
188
+ if (hquery->sent_family == AF_INET)
189
+ {
190
+ status = ares_parse_a_reply(abuf, alen, &host, NULL, NULL);
191
+ if (host && channel->nsort)
192
+ sort_addresses(host, channel->sortlist, channel->nsort);
193
+ }
194
+ else if (hquery->sent_family == AF_INET6)
195
+ {
196
+ status = ares_parse_aaaa_reply(abuf, alen, &host, NULL, NULL);
197
+ if ((status == ARES_ENODATA || status == ARES_EBADRESP) &&
198
+ hquery->want_family == AF_UNSPEC) {
199
+ /* The query returned something but either there were no AAAA
200
+ records (e.g. just CNAME) or the response was malformed. Try
201
+ looking up A instead. */
202
+ hquery->sent_family = AF_INET;
203
+ ares_search(hquery->channel, hquery->name, C_IN, T_A,
204
+ host_callback, hquery);
205
+ return;
206
+ }
207
+ if (host && channel->nsort)
208
+ sort6_addresses(host, channel->sortlist, channel->nsort);
209
+ }
210
+ end_hquery(hquery, status, host);
211
+ }
212
+ else if ((status == ARES_ENODATA || status == ARES_EBADRESP ||
213
+ status == ARES_ETIMEOUT) && (hquery->sent_family == AF_INET6 &&
214
+ hquery->want_family == AF_UNSPEC))
215
+ {
216
+ /* The AAAA query yielded no useful result. Now look up an A instead. */
217
+ hquery->sent_family = AF_INET;
218
+ ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
219
+ hquery);
220
+ }
221
+ else if (status == ARES_EDESTRUCTION)
222
+ end_hquery(hquery, status, NULL);
223
+ else
224
+ next_lookup(hquery, status);
225
+ }
226
+
227
+ static void end_hquery(struct host_query *hquery, int status,
228
+ struct hostent *host)
229
+ {
230
+ hquery->callback(hquery->arg, status, hquery->timeouts, host);
231
+ if (host)
232
+ ares_free_hostent(host);
233
+ free(hquery->name);
234
+ free(hquery);
235
+ }
236
+
237
+ /* If the name looks like an IP address, fake up a host entry, end the
238
+ * query immediately, and return true. Otherwise return false.
239
+ */
240
+ static int fake_hostent(const char *name, int family,
241
+ ares_host_callback callback, void *arg)
242
+ {
243
+ struct hostent hostent;
244
+ char *aliases[1] = { NULL };
245
+ char *addrs[2];
246
+ int result = 0;
247
+ struct in_addr in;
248
+ struct ares_in6_addr in6;
249
+
250
+ if (family == AF_INET || family == AF_INET6)
251
+ {
252
+ /* It only looks like an IP address if it's all numbers and dots. */
253
+ int numdots = 0, valid = 1;
254
+ const char *p;
255
+ for (p = name; *p; p++)
256
+ {
257
+ if (!ISDIGIT(*p) && *p != '.') {
258
+ valid = 0;
259
+ break;
260
+ } else if (*p == '.') {
261
+ numdots++;
262
+ }
263
+ }
264
+
265
+ /* if we don't have 3 dots, it is illegal
266
+ * (although inet_addr doesn't think so).
267
+ */
268
+ if (numdots != 3 || !valid)
269
+ result = 0;
270
+ else
271
+ result = ((in.s_addr = inet_addr(name)) == INADDR_NONE ? 0 : 1);
272
+
273
+ if (result)
274
+ family = AF_INET;
275
+ }
276
+ if (family == AF_INET6)
277
+ result = (ares_inet_pton(AF_INET6, name, &in6) < 1 ? 0 : 1);
278
+
279
+ if (!result)
280
+ return 0;
281
+
282
+ if (family == AF_INET)
283
+ {
284
+ hostent.h_length = (int)sizeof(struct in_addr);
285
+ addrs[0] = (char *)&in;
286
+ }
287
+ else if (family == AF_INET6)
288
+ {
289
+ hostent.h_length = (int)sizeof(struct ares_in6_addr);
290
+ addrs[0] = (char *)&in6;
291
+ }
292
+ /* Duplicate the name, to avoid a constness violation. */
293
+ hostent.h_name = strdup(name);
294
+ if (!hostent.h_name)
295
+ {
296
+ callback(arg, ARES_ENOMEM, 0, NULL);
297
+ return 1;
298
+ }
299
+
300
+ /* Fill in the rest of the host structure and terminate the query. */
301
+ addrs[1] = NULL;
302
+ hostent.h_aliases = aliases;
303
+ hostent.h_addrtype = family;
304
+ hostent.h_addr_list = addrs;
305
+ callback(arg, ARES_SUCCESS, 0, &hostent);
306
+
307
+ free((char *)(hostent.h_name));
308
+ return 1;
309
+ }
310
+
311
+ /* This is an API method */
312
+ int ares_gethostbyname_file(ares_channel channel, const char *name,
313
+ int family, struct hostent **host)
314
+ {
315
+ int result;
316
+
317
+ /* We only take the channel to ensure that ares_init() been called. */
318
+ if(channel == NULL)
319
+ {
320
+ /* Anything will do, really. This seems fine, and is consistent with
321
+ other error cases. */
322
+ *host = NULL;
323
+ return ARES_ENOTFOUND;
324
+ }
325
+
326
+ /* Just chain to the internal implementation we use here; it's exactly
327
+ * what we want.
328
+ */
329
+ result = file_lookup(name, family, host);
330
+ if(result != ARES_SUCCESS)
331
+ {
332
+ /* We guarantee a NULL hostent on failure. */
333
+ *host = NULL;
334
+ }
335
+ return result;
336
+ }
337
+
338
+ static int file_lookup(const char *name, int family, struct hostent **host)
339
+ {
340
+ FILE *fp;
341
+ char **alias;
342
+ int status;
343
+ int error;
344
+
345
+ #ifdef WIN32
346
+ char PATH_HOSTS[MAX_PATH];
347
+ win_platform platform;
348
+
349
+ PATH_HOSTS[0] = '\0';
350
+
351
+ platform = ares__getplatform();
352
+
353
+ if (platform == WIN_NT) {
354
+ char tmp[MAX_PATH];
355
+ HKEY hkeyHosts;
356
+
357
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ,
358
+ &hkeyHosts) == ERROR_SUCCESS)
359
+ {
360
+ DWORD dwLength = MAX_PATH;
361
+ RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp,
362
+ &dwLength);
363
+ ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH);
364
+ RegCloseKey(hkeyHosts);
365
+ }
366
+ }
367
+ else if (platform == WIN_9X)
368
+ GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
369
+ else
370
+ return ARES_ENOTFOUND;
371
+
372
+ strcat(PATH_HOSTS, WIN_PATH_HOSTS);
373
+
374
+ #elif defined(WATT32)
375
+ extern const char *_w32_GetHostsFile (void);
376
+ const char *PATH_HOSTS = _w32_GetHostsFile();
377
+
378
+ if (!PATH_HOSTS)
379
+ return ARES_ENOTFOUND;
380
+ #endif
381
+
382
+ fp = fopen(PATH_HOSTS, "r");
383
+ if (!fp)
384
+ {
385
+ error = ERRNO;
386
+ switch(error)
387
+ {
388
+ case ENOENT:
389
+ case ESRCH:
390
+ return ARES_ENOTFOUND;
391
+ default:
392
+ DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
393
+ error, strerror(error)));
394
+ DEBUGF(fprintf(stderr, "Error opening file: %s\n",
395
+ PATH_HOSTS));
396
+ *host = NULL;
397
+ return ARES_EFILE;
398
+ }
399
+ }
400
+ while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS)
401
+ {
402
+ if (strcasecmp((*host)->h_name, name) == 0)
403
+ break;
404
+ for (alias = (*host)->h_aliases; *alias; alias++)
405
+ {
406
+ if (strcasecmp(*alias, name) == 0)
407
+ break;
408
+ }
409
+ if (*alias)
410
+ break;
411
+ ares_free_hostent(*host);
412
+ }
413
+ fclose(fp);
414
+ if (status == ARES_EOF)
415
+ status = ARES_ENOTFOUND;
416
+ if (status != ARES_SUCCESS)
417
+ *host = NULL;
418
+ return status;
419
+ }
420
+
421
+ static void sort_addresses(struct hostent *host,
422
+ const struct apattern *sortlist, int nsort)
423
+ {
424
+ struct in_addr a1, a2;
425
+ int i1, i2, ind1, ind2;
426
+
427
+ /* This is a simple insertion sort, not optimized at all. i1 walks
428
+ * through the address list, with the loop invariant that everything
429
+ * to the left of i1 is sorted. In the loop body, the value at i1 is moved
430
+ * back through the list (via i2) until it is in sorted order.
431
+ */
432
+ for (i1 = 0; host->h_addr_list[i1]; i1++)
433
+ {
434
+ memcpy(&a1, host->h_addr_list[i1], sizeof(struct in_addr));
435
+ ind1 = get_address_index(&a1, sortlist, nsort);
436
+ for (i2 = i1 - 1; i2 >= 0; i2--)
437
+ {
438
+ memcpy(&a2, host->h_addr_list[i2], sizeof(struct in_addr));
439
+ ind2 = get_address_index(&a2, sortlist, nsort);
440
+ if (ind2 <= ind1)
441
+ break;
442
+ memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in_addr));
443
+ }
444
+ memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in_addr));
445
+ }
446
+ }
447
+
448
+ /* Find the first entry in sortlist which matches addr. Return nsort
449
+ * if none of them match.
450
+ */
451
+ static int get_address_index(const struct in_addr *addr,
452
+ const struct apattern *sortlist,
453
+ int nsort)
454
+ {
455
+ int i;
456
+
457
+ for (i = 0; i < nsort; i++)
458
+ {
459
+ if (sortlist[i].family != AF_INET)
460
+ continue;
461
+ if (sortlist[i].type == PATTERN_MASK)
462
+ {
463
+ if ((addr->s_addr & sortlist[i].mask.addr4.s_addr)
464
+ == sortlist[i].addrV4.s_addr)
465
+ break;
466
+ }
467
+ else
468
+ {
469
+ if (!ares_bitncmp(&addr->s_addr, &sortlist[i].addrV4.s_addr,
470
+ sortlist[i].mask.bits))
471
+ break;
472
+ }
473
+ }
474
+ return i;
475
+ }
476
+
477
+ static void sort6_addresses(struct hostent *host,
478
+ const struct apattern *sortlist, int nsort)
479
+ {
480
+ struct ares_in6_addr a1, a2;
481
+ int i1, i2, ind1, ind2;
482
+
483
+ /* This is a simple insertion sort, not optimized at all. i1 walks
484
+ * through the address list, with the loop invariant that everything
485
+ * to the left of i1 is sorted. In the loop body, the value at i1 is moved
486
+ * back through the list (via i2) until it is in sorted order.
487
+ */
488
+ for (i1 = 0; host->h_addr_list[i1]; i1++)
489
+ {
490
+ memcpy(&a1, host->h_addr_list[i1], sizeof(struct ares_in6_addr));
491
+ ind1 = get6_address_index(&a1, sortlist, nsort);
492
+ for (i2 = i1 - 1; i2 >= 0; i2--)
493
+ {
494
+ memcpy(&a2, host->h_addr_list[i2], sizeof(struct ares_in6_addr));
495
+ ind2 = get6_address_index(&a2, sortlist, nsort);
496
+ if (ind2 <= ind1)
497
+ break;
498
+ memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct ares_in6_addr));
499
+ }
500
+ memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct ares_in6_addr));
501
+ }
502
+ }
503
+
504
+ /* Find the first entry in sortlist which matches addr. Return nsort
505
+ * if none of them match.
506
+ */
507
+ static int get6_address_index(const struct ares_in6_addr *addr,
508
+ const struct apattern *sortlist,
509
+ int nsort)
510
+ {
511
+ int i;
512
+
513
+ for (i = 0; i < nsort; i++)
514
+ {
515
+ if (sortlist[i].family != AF_INET6)
516
+ continue;
517
+ if (!ares_bitncmp(addr,
518
+ &sortlist[i].addrV6,
519
+ sortlist[i].mask.bits))
520
+ break;
521
+ }
522
+ return i;
523
+ }