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.
- data/README.markdown +0 -0
- data/asyncengine.gemspec +26 -0
- data/ext/asyncengine_ext/asyncengine_ruby.c +82 -0
- data/ext/asyncengine_ext/extconf.rb +47 -0
- data/ext/asyncengine_ext/libuv/AUTHORS +45 -0
- data/ext/asyncengine_ext/libuv/LICENSE +42 -0
- data/ext/asyncengine_ext/libuv/Makefile +119 -0
- data/ext/asyncengine_ext/libuv/README.md +88 -0
- data/ext/asyncengine_ext/libuv/build/gcc_version.py +20 -0
- data/ext/asyncengine_ext/libuv/common.gypi +176 -0
- data/ext/asyncengine_ext/libuv/config-mingw.mk +61 -0
- data/ext/asyncengine_ext/libuv/config-unix.mk +173 -0
- data/ext/asyncengine_ext/libuv/gyp_uv +60 -0
- data/ext/asyncengine_ext/libuv/include/ares.h +591 -0
- data/ext/asyncengine_ext/libuv/include/ares_version.h +24 -0
- data/ext/asyncengine_ext/libuv/include/uv-private/eio.h +403 -0
- data/ext/asyncengine_ext/libuv/include/uv-private/ev.h +838 -0
- data/ext/asyncengine_ext/libuv/include/uv-private/ngx-queue.h +106 -0
- data/ext/asyncengine_ext/libuv/include/uv-private/tree.h +768 -0
- data/ext/asyncengine_ext/libuv/include/uv-private/uv-unix.h +256 -0
- data/ext/asyncengine_ext/libuv/include/uv-private/uv-win.h +458 -0
- data/ext/asyncengine_ext/libuv/include/uv.h +1556 -0
- data/ext/asyncengine_ext/libuv/src/ares/AUTHORS +37 -0
- data/ext/asyncengine_ext/libuv/src/ares/CHANGES +1218 -0
- data/ext/asyncengine_ext/libuv/src/ares/CMakeLists.txt +22 -0
- data/ext/asyncengine_ext/libuv/src/ares/NEWS +21 -0
- data/ext/asyncengine_ext/libuv/src/ares/README +60 -0
- data/ext/asyncengine_ext/libuv/src/ares/README.cares +13 -0
- data/ext/asyncengine_ext/libuv/src/ares/README.msvc +142 -0
- data/ext/asyncengine_ext/libuv/src/ares/README.node +21 -0
- data/ext/asyncengine_ext/libuv/src/ares/RELEASE-NOTES +26 -0
- data/ext/asyncengine_ext/libuv/src/ares/TODO +23 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares__close_sockets.c +66 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares__get_hostent.c +263 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares__read_line.c +71 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares__timeval.c +111 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_cancel.c +63 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_data.c +190 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_data.h +65 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_destroy.c +105 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_dns.h +90 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_expand_name.c +200 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_expand_string.c +75 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_fds.c +63 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_free_hostent.c +42 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_free_string.c +25 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_getenv.c +30 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_getenv.h +26 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_gethostbyaddr.c +301 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_gethostbyname.c +523 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_getnameinfo.c +427 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_getopt.c +122 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_getopt.h +53 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_getsock.c +72 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_init.c +1809 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_iphlpapi.h +221 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_ipv6.h +78 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_library_init.c +142 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_library_init.h +42 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_llist.c +86 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_llist.h +42 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_mkquery.c +195 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_nowarn.c +181 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_nowarn.h +55 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_options.c +248 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_parse_a_reply.c +263 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_parse_aaaa_reply.c +259 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_parse_mx_reply.c +170 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_parse_ns_reply.c +182 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_parse_ptr_reply.c +217 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_parse_srv_reply.c +179 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_parse_txt_reply.c +201 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_platform.c +11035 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_platform.h +43 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_private.h +355 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_process.c +1295 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_query.c +183 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_rules.h +144 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_search.c +321 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_send.c +134 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_setup.h +199 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_strcasecmp.c +66 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_strcasecmp.h +30 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_strdup.c +42 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_strdup.h +26 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_strerror.c +56 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_timeout.c +80 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_version.c +11 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_writev.c +79 -0
- data/ext/asyncengine_ext/libuv/src/ares/ares_writev.h +36 -0
- data/ext/asyncengine_ext/libuv/src/ares/bitncmp.c +59 -0
- data/ext/asyncengine_ext/libuv/src/ares/bitncmp.h +26 -0
- data/ext/asyncengine_ext/libuv/src/ares/config_cygwin/ares_config.h +512 -0
- data/ext/asyncengine_ext/libuv/src/ares/config_darwin/ares_config.h +512 -0
- data/ext/asyncengine_ext/libuv/src/ares/config_freebsd/ares_config.h +512 -0
- data/ext/asyncengine_ext/libuv/src/ares/config_linux/ares_config.h +512 -0
- data/ext/asyncengine_ext/libuv/src/ares/config_netbsd/ares_config.h +512 -0
- data/ext/asyncengine_ext/libuv/src/ares/config_openbsd/ares_config.h +512 -0
- data/ext/asyncengine_ext/libuv/src/ares/config_sunos/ares_config.h +512 -0
- data/ext/asyncengine_ext/libuv/src/ares/config_win32/ares_config.h +369 -0
- data/ext/asyncengine_ext/libuv/src/ares/get_ver.awk +35 -0
- data/ext/asyncengine_ext/libuv/src/ares/inet_net_pton.c +451 -0
- data/ext/asyncengine_ext/libuv/src/ares/inet_net_pton.h +31 -0
- data/ext/asyncengine_ext/libuv/src/ares/inet_ntop.c +208 -0
- data/ext/asyncengine_ext/libuv/src/ares/inet_ntop.h +26 -0
- data/ext/asyncengine_ext/libuv/src/ares/nameser.h +203 -0
- data/ext/asyncengine_ext/libuv/src/ares/setup_once.h +504 -0
- data/ext/asyncengine_ext/libuv/src/ares/windows_port.c +22 -0
- data/ext/asyncengine_ext/libuv/src/unix/async.c +58 -0
- data/ext/asyncengine_ext/libuv/src/unix/cares.c +194 -0
- data/ext/asyncengine_ext/libuv/src/unix/check.c +80 -0
- data/ext/asyncengine_ext/libuv/src/unix/core.c +588 -0
- data/ext/asyncengine_ext/libuv/src/unix/cygwin.c +84 -0
- data/ext/asyncengine_ext/libuv/src/unix/darwin.c +341 -0
- data/ext/asyncengine_ext/libuv/src/unix/dl.c +91 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/Changes +63 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/LICENSE +36 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/Makefile.am +15 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/aclocal.m4 +8957 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/autogen.sh +3 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/config.h.in +86 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/config_cygwin.h +80 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/config_darwin.h +141 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/config_freebsd.h +81 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/config_linux.h +94 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/config_netbsd.h +81 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/config_openbsd.h +137 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/config_sunos.h +84 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/configure.ac +22 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/demo.c +194 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/ecb.h +370 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/eio.3 +3428 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/eio.c +2593 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/eio.pod +969 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/libeio.m4 +195 -0
- data/ext/asyncengine_ext/libuv/src/unix/eio/xthread.h +164 -0
- data/ext/asyncengine_ext/libuv/src/unix/error.c +98 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/Changes +388 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/LICENSE +36 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/Makefile.am +18 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/Makefile.in +771 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/README +58 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/aclocal.m4 +8957 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/autogen.sh +6 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/config.guess +1526 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/config.h.in +125 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/config.sub +1658 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/config_cygwin.h +123 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/config_darwin.h +122 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/config_freebsd.h +120 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/config_linux.h +141 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/config_netbsd.h +120 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/config_openbsd.h +126 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/config_sunos.h +122 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/configure +13037 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/configure.ac +18 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/depcomp +630 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ev++.h +816 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ev.3 +5311 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ev.c +3921 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ev.pod +5243 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ev_epoll.c +266 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ev_kqueue.c +235 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ev_poll.c +148 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ev_port.c +179 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ev_select.c +310 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ev_vars.h +203 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ev_win32.c +153 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ev_wrap.h +196 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/event.c +402 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/event.h +170 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/install-sh +294 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/libev.m4 +39 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/ltmain.sh +8413 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/missing +336 -0
- data/ext/asyncengine_ext/libuv/src/unix/ev/mkinstalldirs +111 -0
- data/ext/asyncengine_ext/libuv/src/unix/freebsd.c +312 -0
- data/ext/asyncengine_ext/libuv/src/unix/fs.c +707 -0
- data/ext/asyncengine_ext/libuv/src/unix/idle.c +79 -0
- data/ext/asyncengine_ext/libuv/src/unix/internal.h +161 -0
- data/ext/asyncengine_ext/libuv/src/unix/kqueue.c +127 -0
- data/ext/asyncengine_ext/libuv/src/unix/linux/core.c +474 -0
- data/ext/asyncengine_ext/libuv/src/unix/linux/inotify.c +211 -0
- data/ext/asyncengine_ext/libuv/src/unix/linux/syscalls.c +230 -0
- data/ext/asyncengine_ext/libuv/src/unix/linux/syscalls.h +87 -0
- data/ext/asyncengine_ext/libuv/src/unix/loop.c +58 -0
- data/ext/asyncengine_ext/libuv/src/unix/netbsd.c +108 -0
- data/ext/asyncengine_ext/libuv/src/unix/openbsd.c +295 -0
- data/ext/asyncengine_ext/libuv/src/unix/pipe.c +266 -0
- data/ext/asyncengine_ext/libuv/src/unix/prepare.c +79 -0
- data/ext/asyncengine_ext/libuv/src/unix/process.c +369 -0
- data/ext/asyncengine_ext/libuv/src/unix/stream.c +1033 -0
- data/ext/asyncengine_ext/libuv/src/unix/sunos.c +466 -0
- data/ext/asyncengine_ext/libuv/src/unix/tcp.c +327 -0
- data/ext/asyncengine_ext/libuv/src/unix/thread.c +154 -0
- data/ext/asyncengine_ext/libuv/src/unix/timer.c +127 -0
- data/ext/asyncengine_ext/libuv/src/unix/tty.c +146 -0
- data/ext/asyncengine_ext/libuv/src/unix/udp.c +670 -0
- data/ext/asyncengine_ext/libuv/src/unix/uv-eio.c +124 -0
- data/ext/asyncengine_ext/libuv/src/unix/uv-eio.h +13 -0
- data/ext/asyncengine_ext/libuv/src/uv-common.c +354 -0
- data/ext/asyncengine_ext/libuv/src/uv-common.h +87 -0
- data/ext/asyncengine_ext/libuv/src/win/async.c +127 -0
- data/ext/asyncengine_ext/libuv/src/win/cares.c +290 -0
- data/ext/asyncengine_ext/libuv/src/win/core.c +270 -0
- data/ext/asyncengine_ext/libuv/src/win/dl.c +82 -0
- data/ext/asyncengine_ext/libuv/src/win/error.c +132 -0
- data/ext/asyncengine_ext/libuv/src/win/fs-event.c +514 -0
- data/ext/asyncengine_ext/libuv/src/win/fs.c +1576 -0
- data/ext/asyncengine_ext/libuv/src/win/getaddrinfo.c +372 -0
- data/ext/asyncengine_ext/libuv/src/win/handle.c +225 -0
- data/ext/asyncengine_ext/libuv/src/win/internal.h +352 -0
- data/ext/asyncengine_ext/libuv/src/win/loop-watcher.c +131 -0
- data/ext/asyncengine_ext/libuv/src/win/pipe.c +1661 -0
- data/ext/asyncengine_ext/libuv/src/win/process.c +1140 -0
- data/ext/asyncengine_ext/libuv/src/win/req.c +174 -0
- data/ext/asyncengine_ext/libuv/src/win/stream.c +201 -0
- data/ext/asyncengine_ext/libuv/src/win/tcp.c +1282 -0
- data/ext/asyncengine_ext/libuv/src/win/thread.c +332 -0
- data/ext/asyncengine_ext/libuv/src/win/threadpool.c +73 -0
- data/ext/asyncengine_ext/libuv/src/win/timer.c +276 -0
- data/ext/asyncengine_ext/libuv/src/win/tty.c +1795 -0
- data/ext/asyncengine_ext/libuv/src/win/udp.c +709 -0
- data/ext/asyncengine_ext/libuv/src/win/util.c +719 -0
- data/ext/asyncengine_ext/libuv/src/win/winapi.c +117 -0
- data/ext/asyncengine_ext/libuv/src/win/winapi.h +4419 -0
- data/ext/asyncengine_ext/libuv/src/win/winsock.c +470 -0
- data/ext/asyncengine_ext/libuv/src/win/winsock.h +138 -0
- data/ext/asyncengine_ext/libuv/test/benchmark-ares.c +118 -0
- data/ext/asyncengine_ext/libuv/test/benchmark-getaddrinfo.c +94 -0
- data/ext/asyncengine_ext/libuv/test/benchmark-list.h +105 -0
- data/ext/asyncengine_ext/libuv/test/benchmark-ping-pongs.c +213 -0
- data/ext/asyncengine_ext/libuv/test/benchmark-pound.c +324 -0
- data/ext/asyncengine_ext/libuv/test/benchmark-pump.c +462 -0
- data/ext/asyncengine_ext/libuv/test/benchmark-sizes.c +40 -0
- data/ext/asyncengine_ext/libuv/test/benchmark-spawn.c +156 -0
- data/ext/asyncengine_ext/libuv/test/benchmark-tcp-write-batch.c +140 -0
- data/ext/asyncengine_ext/libuv/test/benchmark-thread.c +64 -0
- data/ext/asyncengine_ext/libuv/test/benchmark-udp-packet-storm.c +247 -0
- data/ext/asyncengine_ext/libuv/test/blackhole-server.c +118 -0
- data/ext/asyncengine_ext/libuv/test/dns-server.c +321 -0
- data/ext/asyncengine_ext/libuv/test/echo-server.c +370 -0
- data/ext/asyncengine_ext/libuv/test/fixtures/empty_file +0 -0
- data/ext/asyncengine_ext/libuv/test/fixtures/load_error.node +1 -0
- data/ext/asyncengine_ext/libuv/test/run-benchmarks.c +64 -0
- data/ext/asyncengine_ext/libuv/test/run-tests.c +108 -0
- data/ext/asyncengine_ext/libuv/test/runner-unix.c +315 -0
- data/ext/asyncengine_ext/libuv/test/runner-unix.h +36 -0
- data/ext/asyncengine_ext/libuv/test/runner-win.c +343 -0
- data/ext/asyncengine_ext/libuv/test/runner-win.h +42 -0
- data/ext/asyncengine_ext/libuv/test/runner.c +317 -0
- data/ext/asyncengine_ext/libuv/test/runner.h +159 -0
- data/ext/asyncengine_ext/libuv/test/task.h +117 -0
- data/ext/asyncengine_ext/libuv/test/test-async.c +216 -0
- data/ext/asyncengine_ext/libuv/test/test-callback-stack.c +203 -0
- data/ext/asyncengine_ext/libuv/test/test-connection-fail.c +148 -0
- data/ext/asyncengine_ext/libuv/test/test-counters-init.c +216 -0
- data/ext/asyncengine_ext/libuv/test/test-cwd-and-chdir.c +64 -0
- data/ext/asyncengine_ext/libuv/test/test-delayed-accept.c +197 -0
- data/ext/asyncengine_ext/libuv/test/test-dlerror.c +49 -0
- data/ext/asyncengine_ext/libuv/test/test-eio-overflow.c +90 -0
- data/ext/asyncengine_ext/libuv/test/test-error.c +59 -0
- data/ext/asyncengine_ext/libuv/test/test-fail-always.c +29 -0
- data/ext/asyncengine_ext/libuv/test/test-fs-event.c +442 -0
- data/ext/asyncengine_ext/libuv/test/test-fs.c +1731 -0
- data/ext/asyncengine_ext/libuv/test/test-get-currentexe.c +63 -0
- data/ext/asyncengine_ext/libuv/test/test-get-loadavg.c +36 -0
- data/ext/asyncengine_ext/libuv/test/test-get-memory.c +38 -0
- data/ext/asyncengine_ext/libuv/test/test-getaddrinfo.c +122 -0
- data/ext/asyncengine_ext/libuv/test/test-gethostbyname.c +189 -0
- data/ext/asyncengine_ext/libuv/test/test-getsockname.c +342 -0
- data/ext/asyncengine_ext/libuv/test/test-hrtime.c +51 -0
- data/ext/asyncengine_ext/libuv/test/test-idle.c +81 -0
- data/ext/asyncengine_ext/libuv/test/test-ipc-send-recv.c +209 -0
- data/ext/asyncengine_ext/libuv/test/test-ipc.c +614 -0
- data/ext/asyncengine_ext/libuv/test/test-list.h +371 -0
- data/ext/asyncengine_ext/libuv/test/test-loop-handles.c +359 -0
- data/ext/asyncengine_ext/libuv/test/test-multiple-listen.c +102 -0
- data/ext/asyncengine_ext/libuv/test/test-mutexes.c +63 -0
- data/ext/asyncengine_ext/libuv/test/test-pass-always.c +28 -0
- data/ext/asyncengine_ext/libuv/test/test-ping-pong.c +253 -0
- data/ext/asyncengine_ext/libuv/test/test-pipe-bind-error.c +140 -0
- data/ext/asyncengine_ext/libuv/test/test-pipe-connect-error.c +96 -0
- data/ext/asyncengine_ext/libuv/test/test-platform-output.c +87 -0
- data/ext/asyncengine_ext/libuv/test/test-process-title.c +42 -0
- data/ext/asyncengine_ext/libuv/test/test-ref.c +322 -0
- data/ext/asyncengine_ext/libuv/test/test-run-once.c +44 -0
- data/ext/asyncengine_ext/libuv/test/test-shutdown-close.c +103 -0
- data/ext/asyncengine_ext/libuv/test/test-shutdown-eof.c +183 -0
- data/ext/asyncengine_ext/libuv/test/test-spawn.c +499 -0
- data/ext/asyncengine_ext/libuv/test/test-stdio-over-pipes.c +256 -0
- data/ext/asyncengine_ext/libuv/test/test-tcp-bind-error.c +191 -0
- data/ext/asyncengine_ext/libuv/test/test-tcp-bind6-error.c +154 -0
- data/ext/asyncengine_ext/libuv/test/test-tcp-close.c +129 -0
- data/ext/asyncengine_ext/libuv/test/test-tcp-connect-error.c +70 -0
- data/ext/asyncengine_ext/libuv/test/test-tcp-connect6-error.c +68 -0
- data/ext/asyncengine_ext/libuv/test/test-tcp-flags.c +51 -0
- data/ext/asyncengine_ext/libuv/test/test-tcp-write-error.c +168 -0
- data/ext/asyncengine_ext/libuv/test/test-tcp-write-to-half-open-connection.c +135 -0
- data/ext/asyncengine_ext/libuv/test/test-tcp-writealot.c +195 -0
- data/ext/asyncengine_ext/libuv/test/test-thread.c +183 -0
- data/ext/asyncengine_ext/libuv/test/test-threadpool.c +57 -0
- data/ext/asyncengine_ext/libuv/test/test-timer-again.c +141 -0
- data/ext/asyncengine_ext/libuv/test/test-timer.c +130 -0
- data/ext/asyncengine_ext/libuv/test/test-tty.c +110 -0
- data/ext/asyncengine_ext/libuv/test/test-udp-dgram-too-big.c +86 -0
- data/ext/asyncengine_ext/libuv/test/test-udp-ipv6.c +156 -0
- data/ext/asyncengine_ext/libuv/test/test-udp-multicast-join.c +139 -0
- data/ext/asyncengine_ext/libuv/test/test-udp-multicast-ttl.c +86 -0
- data/ext/asyncengine_ext/libuv/test/test-udp-options.c +86 -0
- data/ext/asyncengine_ext/libuv/test/test-udp-send-and-recv.c +208 -0
- data/ext/asyncengine_ext/libuv/test/test-util.c +97 -0
- data/ext/asyncengine_ext/libuv/uv.gyp +435 -0
- data/ext/asyncengine_ext/libuv/vcbuild.bat +105 -0
- data/lib/asyncengine/version.rb +3 -0
- data/lib/asyncengine.rb +41 -0
- metadata +384 -0
@@ -0,0 +1,132 @@
|
|
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 <malloc.h>
|
25
|
+
#include <stdio.h>
|
26
|
+
#include <string.h>
|
27
|
+
|
28
|
+
#include "uv.h"
|
29
|
+
#include "../uv-common.h"
|
30
|
+
#include "internal.h"
|
31
|
+
|
32
|
+
|
33
|
+
/*
|
34
|
+
* Display an error message and abort the event loop.
|
35
|
+
*/
|
36
|
+
void uv_fatal_error(const int errorno, const char* syscall) {
|
37
|
+
char* buf = NULL;
|
38
|
+
const char* errmsg;
|
39
|
+
|
40
|
+
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
|
41
|
+
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno,
|
42
|
+
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buf, 0, NULL);
|
43
|
+
|
44
|
+
if (buf) {
|
45
|
+
errmsg = buf;
|
46
|
+
} else {
|
47
|
+
errmsg = "Unknown error";
|
48
|
+
}
|
49
|
+
|
50
|
+
/* FormatMessage messages include a newline character already, */
|
51
|
+
/* so don't add another. */
|
52
|
+
if (syscall) {
|
53
|
+
fprintf(stderr, "%s: (%d) %s", syscall, errorno, errmsg);
|
54
|
+
} else {
|
55
|
+
fprintf(stderr, "(%d) %s", errorno, errmsg);
|
56
|
+
}
|
57
|
+
|
58
|
+
if (buf) {
|
59
|
+
LocalFree(buf);
|
60
|
+
}
|
61
|
+
|
62
|
+
*((char*)NULL) = 0xff; /* Force debug break */
|
63
|
+
abort();
|
64
|
+
}
|
65
|
+
|
66
|
+
|
67
|
+
uv_err_code uv_translate_sys_error(int sys_errno) {
|
68
|
+
switch (sys_errno) {
|
69
|
+
case ERROR_SUCCESS: return UV_OK;
|
70
|
+
case ERROR_FILE_NOT_FOUND: return UV_ENOENT;
|
71
|
+
case ERROR_PATH_NOT_FOUND: return UV_ENOENT;
|
72
|
+
case ERROR_ACCESS_DENIED: return UV_EPERM;
|
73
|
+
case ERROR_NOACCESS: return UV_EACCES;
|
74
|
+
case WSAEACCES: return UV_EACCES;
|
75
|
+
case ERROR_ADDRESS_ALREADY_ASSOCIATED: return UV_EADDRINUSE;
|
76
|
+
case WSAEADDRINUSE: return UV_EADDRINUSE;
|
77
|
+
case WSAEADDRNOTAVAIL: return UV_EADDRNOTAVAIL;
|
78
|
+
case WSAEAFNOSUPPORT: return UV_EAFNOSUPPORT;
|
79
|
+
case WSAEWOULDBLOCK: return UV_EAGAIN;
|
80
|
+
case WSAEALREADY: return UV_EALREADY;
|
81
|
+
case ERROR_LOCK_VIOLATION: return UV_EBUSY;
|
82
|
+
case ERROR_SHARING_VIOLATION: return UV_EBUSY;
|
83
|
+
case ERROR_CONNECTION_ABORTED: return UV_ECONNABORTED;
|
84
|
+
case WSAECONNABORTED: return UV_ECONNABORTED;
|
85
|
+
case ERROR_CONNECTION_REFUSED: return UV_ECONNREFUSED;
|
86
|
+
case WSAECONNREFUSED: return UV_ECONNREFUSED;
|
87
|
+
case ERROR_NETNAME_DELETED: return UV_ECONNRESET;
|
88
|
+
case WSAECONNRESET: return UV_ECONNRESET;
|
89
|
+
case ERROR_ALREADY_EXISTS: return UV_EEXIST;
|
90
|
+
case ERROR_FILE_EXISTS: return UV_EEXIST;
|
91
|
+
case WSAEFAULT: return UV_EFAULT;
|
92
|
+
case ERROR_HOST_UNREACHABLE: return UV_EHOSTUNREACH;
|
93
|
+
case WSAEHOSTUNREACH: return UV_EHOSTUNREACH;
|
94
|
+
case ERROR_OPERATION_ABORTED: return UV_EINTR;
|
95
|
+
case WSAEINTR: return UV_EINTR;
|
96
|
+
case ERROR_INVALID_DATA: return UV_EINVAL;
|
97
|
+
case WSAEINVAL: return UV_EINVAL;
|
98
|
+
case ERROR_CANT_RESOLVE_FILENAME: return UV_ELOOP;
|
99
|
+
case ERROR_TOO_MANY_OPEN_FILES: return UV_EMFILE;
|
100
|
+
case WSAEMFILE: return UV_EMFILE;
|
101
|
+
case WSAEMSGSIZE: return UV_EMSGSIZE;
|
102
|
+
case ERROR_FILENAME_EXCED_RANGE: return UV_ENAMETOOLONG;
|
103
|
+
case ERROR_NETWORK_UNREACHABLE: return UV_ENETUNREACH;
|
104
|
+
case WSAENETUNREACH: return UV_ENETUNREACH;
|
105
|
+
case WSAENOBUFS: return UV_ENOBUFS;
|
106
|
+
case ERROR_OUTOFMEMORY: return UV_ENOMEM;
|
107
|
+
case ERROR_CANNOT_MAKE: return UV_ENOSPC;
|
108
|
+
case ERROR_DISK_FULL: return UV_ENOSPC;
|
109
|
+
case ERROR_EA_TABLE_FULL: return UV_ENOSPC;
|
110
|
+
case ERROR_END_OF_MEDIA: return UV_ENOSPC;
|
111
|
+
case ERROR_HANDLE_DISK_FULL: return UV_ENOSPC;
|
112
|
+
case ERROR_NOT_CONNECTED: return UV_ENOTCONN;
|
113
|
+
case WSAENOTCONN: return UV_ENOTCONN;
|
114
|
+
case ERROR_DIR_NOT_EMPTY: return UV_ENOTEMPTY;
|
115
|
+
case ERROR_NOT_SUPPORTED: return UV_ENOTSUP;
|
116
|
+
case ERROR_INSUFFICIENT_BUFFER: return UV_EINVAL;
|
117
|
+
case ERROR_INVALID_FLAGS: return UV_EBADF;
|
118
|
+
case ERROR_INVALID_PARAMETER: return UV_EINVAL;
|
119
|
+
case ERROR_NO_UNICODE_TRANSLATION: return UV_ECHARSET;
|
120
|
+
case ERROR_BROKEN_PIPE: return UV_EOF;
|
121
|
+
case ERROR_BAD_PIPE: return UV_EPIPE;
|
122
|
+
case ERROR_NO_DATA: return UV_EPIPE;
|
123
|
+
case ERROR_PIPE_NOT_CONNECTED: return UV_EPIPE;
|
124
|
+
case ERROR_PIPE_BUSY: return UV_EBUSY;
|
125
|
+
case ERROR_SEM_TIMEOUT: return UV_ETIMEDOUT;
|
126
|
+
case WSAETIMEDOUT: return UV_ETIMEDOUT;
|
127
|
+
case WSAHOST_NOT_FOUND: return UV_ENOENT;
|
128
|
+
case WSAENOTSOCK: return UV_ENOTSOCK;
|
129
|
+
default: return UV_UNKNOWN;
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
@@ -0,0 +1,514 @@
|
|
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 <malloc.h>
|
24
|
+
#include <errno.h>
|
25
|
+
#include <stdio.h>
|
26
|
+
#include <string.h>
|
27
|
+
#include "uv.h"
|
28
|
+
#include "internal.h"
|
29
|
+
|
30
|
+
|
31
|
+
const unsigned int uv_directory_watcher_buffer_size = 4096;
|
32
|
+
|
33
|
+
|
34
|
+
static void uv_fs_event_init_handle(uv_loop_t* loop, uv_fs_event_t* handle,
|
35
|
+
const char* filename, uv_fs_event_cb cb) {
|
36
|
+
handle->type = UV_FS_EVENT;
|
37
|
+
handle->loop = loop;
|
38
|
+
handle->flags = 0;
|
39
|
+
handle->cb = cb;
|
40
|
+
handle->dir_handle = INVALID_HANDLE_VALUE;
|
41
|
+
handle->buffer = NULL;
|
42
|
+
handle->req_pending = 0;
|
43
|
+
handle->filew = NULL;
|
44
|
+
handle->short_filew = NULL;
|
45
|
+
handle->dirw = NULL;
|
46
|
+
|
47
|
+
uv_req_init(loop, (uv_req_t*)&handle->req);
|
48
|
+
handle->req.type = UV_FS_EVENT_REQ;
|
49
|
+
handle->req.data = (void*)handle;
|
50
|
+
|
51
|
+
handle->filename = strdup(filename);
|
52
|
+
if (!handle->filename) {
|
53
|
+
uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
|
54
|
+
}
|
55
|
+
|
56
|
+
loop->counters.handle_init++;
|
57
|
+
loop->counters.fs_event_init++;
|
58
|
+
|
59
|
+
uv_ref(loop);
|
60
|
+
}
|
61
|
+
|
62
|
+
|
63
|
+
static void uv_fs_event_queue_readdirchanges(uv_loop_t* loop,
|
64
|
+
uv_fs_event_t* handle) {
|
65
|
+
assert(handle->dir_handle != INVALID_HANDLE_VALUE);
|
66
|
+
assert(!handle->req_pending);
|
67
|
+
|
68
|
+
memset(&(handle->req.overlapped), 0, sizeof(handle->req.overlapped));
|
69
|
+
if (!ReadDirectoryChangesW(handle->dir_handle,
|
70
|
+
handle->buffer,
|
71
|
+
uv_directory_watcher_buffer_size,
|
72
|
+
FALSE,
|
73
|
+
FILE_NOTIFY_CHANGE_FILE_NAME |
|
74
|
+
FILE_NOTIFY_CHANGE_DIR_NAME |
|
75
|
+
FILE_NOTIFY_CHANGE_ATTRIBUTES |
|
76
|
+
FILE_NOTIFY_CHANGE_SIZE |
|
77
|
+
FILE_NOTIFY_CHANGE_LAST_WRITE |
|
78
|
+
FILE_NOTIFY_CHANGE_LAST_ACCESS |
|
79
|
+
FILE_NOTIFY_CHANGE_CREATION |
|
80
|
+
FILE_NOTIFY_CHANGE_SECURITY,
|
81
|
+
NULL,
|
82
|
+
&handle->req.overlapped,
|
83
|
+
NULL)) {
|
84
|
+
/* Make this req pending reporting an error. */
|
85
|
+
SET_REQ_ERROR(&handle->req, GetLastError());
|
86
|
+
uv_insert_pending_req(loop, (uv_req_t*)&handle->req);
|
87
|
+
}
|
88
|
+
|
89
|
+
handle->req_pending = 1;
|
90
|
+
}
|
91
|
+
|
92
|
+
|
93
|
+
static int uv_split_path(const wchar_t* filename, wchar_t** dir,
|
94
|
+
wchar_t** file) {
|
95
|
+
int len = wcslen(filename);
|
96
|
+
int i = len;
|
97
|
+
while (i > 0 && filename[--i] != '\\' && filename[i] != '/');
|
98
|
+
|
99
|
+
if (i == 0) {
|
100
|
+
if (dir) {
|
101
|
+
*dir = (wchar_t*)malloc((MAX_PATH + 1) * sizeof(wchar_t));
|
102
|
+
if (!*dir) {
|
103
|
+
uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
|
104
|
+
}
|
105
|
+
|
106
|
+
if (!GetCurrentDirectoryW(MAX_PATH, *dir)) {
|
107
|
+
free(*dir);
|
108
|
+
*dir = NULL;
|
109
|
+
return -1;
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
*file = wcsdup(filename);
|
114
|
+
} else {
|
115
|
+
if (dir) {
|
116
|
+
*dir = (wchar_t*)malloc((i + 1) * sizeof(wchar_t));
|
117
|
+
if (!*dir) {
|
118
|
+
uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
|
119
|
+
}
|
120
|
+
wcsncpy(*dir, filename, i);
|
121
|
+
(*dir)[i] = L'\0';
|
122
|
+
}
|
123
|
+
|
124
|
+
*file = (wchar_t*)malloc((len - i) * sizeof(wchar_t));
|
125
|
+
if (!*file) {
|
126
|
+
uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
|
127
|
+
}
|
128
|
+
wcsncpy(*file, filename + i + 1, len - i - 1);
|
129
|
+
(*file)[len - i - 1] = L'\0';
|
130
|
+
}
|
131
|
+
|
132
|
+
return 0;
|
133
|
+
}
|
134
|
+
|
135
|
+
|
136
|
+
int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle,
|
137
|
+
const char* filename, uv_fs_event_cb cb, int flags) {
|
138
|
+
int name_size, is_path_dir;
|
139
|
+
DWORD attr, last_error;
|
140
|
+
wchar_t* dir = NULL, *dir_to_watch, *filenamew = NULL;
|
141
|
+
wchar_t short_path[MAX_PATH];
|
142
|
+
|
143
|
+
/* We don't support any flags yet. */
|
144
|
+
assert(!flags);
|
145
|
+
|
146
|
+
uv_fs_event_init_handle(loop, handle, filename, cb);
|
147
|
+
|
148
|
+
/* Convert name to UTF16. */
|
149
|
+
name_size = uv_utf8_to_utf16(filename, NULL, 0) * sizeof(wchar_t);
|
150
|
+
filenamew = (wchar_t*)malloc(name_size);
|
151
|
+
if (!filenamew) {
|
152
|
+
uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
|
153
|
+
}
|
154
|
+
|
155
|
+
if (!uv_utf8_to_utf16(filename, filenamew,
|
156
|
+
name_size / sizeof(wchar_t))) {
|
157
|
+
uv__set_sys_error(loop, GetLastError());
|
158
|
+
return -1;
|
159
|
+
}
|
160
|
+
|
161
|
+
/* Determine whether filename is a file or a directory. */
|
162
|
+
attr = GetFileAttributesW(filenamew);
|
163
|
+
if (attr == INVALID_FILE_ATTRIBUTES) {
|
164
|
+
last_error = GetLastError();
|
165
|
+
goto error;
|
166
|
+
}
|
167
|
+
|
168
|
+
is_path_dir = (attr & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0;
|
169
|
+
|
170
|
+
if (is_path_dir) {
|
171
|
+
/* filename is a directory, so that's the directory that we will watch. */
|
172
|
+
handle->dirw = filenamew;
|
173
|
+
dir_to_watch = filenamew;
|
174
|
+
} else {
|
175
|
+
/*
|
176
|
+
* filename is a file. So we split filename into dir & file parts, and
|
177
|
+
* watch the dir directory.
|
178
|
+
*/
|
179
|
+
|
180
|
+
/* Convert to short path. */
|
181
|
+
if (!GetShortPathNameW(filenamew, short_path, ARRAY_SIZE(short_path))) {
|
182
|
+
last_error = GetLastError();
|
183
|
+
goto error;
|
184
|
+
}
|
185
|
+
|
186
|
+
if (uv_split_path(filenamew, &dir, &handle->filew) != 0) {
|
187
|
+
last_error = GetLastError();
|
188
|
+
goto error;
|
189
|
+
}
|
190
|
+
|
191
|
+
if (uv_split_path(short_path, NULL, &handle->short_filew) != 0) {
|
192
|
+
last_error = GetLastError();
|
193
|
+
goto error;
|
194
|
+
}
|
195
|
+
|
196
|
+
dir_to_watch = dir;
|
197
|
+
free(filenamew);
|
198
|
+
filenamew = NULL;
|
199
|
+
}
|
200
|
+
|
201
|
+
handle->dir_handle = CreateFileW(dir_to_watch,
|
202
|
+
FILE_LIST_DIRECTORY,
|
203
|
+
FILE_SHARE_READ | FILE_SHARE_DELETE |
|
204
|
+
FILE_SHARE_WRITE,
|
205
|
+
NULL,
|
206
|
+
OPEN_EXISTING,
|
207
|
+
FILE_FLAG_BACKUP_SEMANTICS |
|
208
|
+
FILE_FLAG_OVERLAPPED,
|
209
|
+
NULL);
|
210
|
+
|
211
|
+
if (dir) {
|
212
|
+
free(dir);
|
213
|
+
dir = NULL;
|
214
|
+
}
|
215
|
+
|
216
|
+
if (handle->dir_handle == INVALID_HANDLE_VALUE) {
|
217
|
+
last_error = GetLastError();
|
218
|
+
goto error;
|
219
|
+
}
|
220
|
+
|
221
|
+
if (CreateIoCompletionPort(handle->dir_handle,
|
222
|
+
loop->iocp,
|
223
|
+
(ULONG_PTR)handle,
|
224
|
+
0) == NULL) {
|
225
|
+
last_error = GetLastError();
|
226
|
+
goto error;
|
227
|
+
}
|
228
|
+
|
229
|
+
handle->buffer = (char*)_aligned_malloc(uv_directory_watcher_buffer_size,
|
230
|
+
sizeof(DWORD));
|
231
|
+
if (!handle->buffer) {
|
232
|
+
uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
|
233
|
+
}
|
234
|
+
|
235
|
+
memset(&(handle->req.overlapped), 0, sizeof(handle->req.overlapped));
|
236
|
+
|
237
|
+
if (!ReadDirectoryChangesW(handle->dir_handle,
|
238
|
+
handle->buffer,
|
239
|
+
uv_directory_watcher_buffer_size,
|
240
|
+
FALSE,
|
241
|
+
FILE_NOTIFY_CHANGE_FILE_NAME |
|
242
|
+
FILE_NOTIFY_CHANGE_DIR_NAME |
|
243
|
+
FILE_NOTIFY_CHANGE_ATTRIBUTES |
|
244
|
+
FILE_NOTIFY_CHANGE_SIZE |
|
245
|
+
FILE_NOTIFY_CHANGE_LAST_WRITE |
|
246
|
+
FILE_NOTIFY_CHANGE_LAST_ACCESS |
|
247
|
+
FILE_NOTIFY_CHANGE_CREATION |
|
248
|
+
FILE_NOTIFY_CHANGE_SECURITY,
|
249
|
+
NULL,
|
250
|
+
&handle->req.overlapped,
|
251
|
+
NULL)) {
|
252
|
+
last_error = GetLastError();
|
253
|
+
goto error;
|
254
|
+
}
|
255
|
+
|
256
|
+
handle->req_pending = 1;
|
257
|
+
return 0;
|
258
|
+
|
259
|
+
error:
|
260
|
+
if (handle->filename) {
|
261
|
+
free(handle->filename);
|
262
|
+
handle->filename = NULL;
|
263
|
+
}
|
264
|
+
|
265
|
+
if (handle->filew) {
|
266
|
+
free(handle->filew);
|
267
|
+
handle->filew = NULL;
|
268
|
+
}
|
269
|
+
|
270
|
+
if (handle->short_filew) {
|
271
|
+
free(handle->short_filew);
|
272
|
+
handle->short_filew = NULL;
|
273
|
+
}
|
274
|
+
|
275
|
+
free(filenamew);
|
276
|
+
|
277
|
+
if (handle->dir_handle != INVALID_HANDLE_VALUE) {
|
278
|
+
CloseHandle(handle->dir_handle);
|
279
|
+
handle->dir_handle = INVALID_HANDLE_VALUE;
|
280
|
+
}
|
281
|
+
|
282
|
+
if (handle->buffer) {
|
283
|
+
_aligned_free(handle->buffer);
|
284
|
+
handle->buffer = NULL;
|
285
|
+
}
|
286
|
+
|
287
|
+
uv__set_sys_error(loop, last_error);
|
288
|
+
return -1;
|
289
|
+
}
|
290
|
+
|
291
|
+
|
292
|
+
void uv_process_fs_event_req(uv_loop_t* loop, uv_req_t* req,
|
293
|
+
uv_fs_event_t* handle) {
|
294
|
+
FILE_NOTIFY_INFORMATION* file_info;
|
295
|
+
int sizew, size, result;
|
296
|
+
char* filename = NULL;
|
297
|
+
wchar_t* filenamew, *long_filenamew = NULL;
|
298
|
+
DWORD offset = 0;
|
299
|
+
|
300
|
+
assert(req->type == UV_FS_EVENT_REQ);
|
301
|
+
assert(handle->req_pending);
|
302
|
+
handle->req_pending = 0;
|
303
|
+
|
304
|
+
/* If we're closing, don't report any callbacks, and just push the handle */
|
305
|
+
/* onto the endgame queue. */
|
306
|
+
if (handle->flags & UV_HANDLE_CLOSING) {
|
307
|
+
uv_want_endgame(loop, (uv_handle_t*) handle);
|
308
|
+
return;
|
309
|
+
};
|
310
|
+
|
311
|
+
file_info = (FILE_NOTIFY_INFORMATION*)(handle->buffer + offset);
|
312
|
+
|
313
|
+
if (REQ_SUCCESS(req)) {
|
314
|
+
if (req->overlapped.InternalHigh > 0) {
|
315
|
+
do {
|
316
|
+
file_info = (FILE_NOTIFY_INFORMATION*)((char*)file_info + offset);
|
317
|
+
assert(!filename);
|
318
|
+
assert(!long_filenamew);
|
319
|
+
|
320
|
+
/*
|
321
|
+
* Fire the event only if we were asked to watch a directory,
|
322
|
+
* or if the filename filter matches.
|
323
|
+
*/
|
324
|
+
if (handle->dirw ||
|
325
|
+
_wcsnicmp(handle->filew, file_info->FileName,
|
326
|
+
file_info->FileNameLength / sizeof(wchar_t)) == 0 ||
|
327
|
+
_wcsnicmp(handle->short_filew, file_info->FileName,
|
328
|
+
file_info->FileNameLength / sizeof(wchar_t)) == 0) {
|
329
|
+
|
330
|
+
if (handle->dirw) {
|
331
|
+
/*
|
332
|
+
* We attempt to convert the file name to its long form for
|
333
|
+
* events that still point to valid files on disk.
|
334
|
+
* For removed and renamed events, we do not provide the file name.
|
335
|
+
*/
|
336
|
+
if (file_info->Action != FILE_ACTION_REMOVED &&
|
337
|
+
file_info->Action != FILE_ACTION_RENAMED_OLD_NAME) {
|
338
|
+
/* Construct a full path to the file. */
|
339
|
+
size = wcslen(handle->dirw) +
|
340
|
+
file_info->FileNameLength / sizeof(wchar_t) + 2;
|
341
|
+
|
342
|
+
filenamew = (wchar_t*)malloc(size * sizeof(wchar_t));
|
343
|
+
if (!filenamew) {
|
344
|
+
uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
|
345
|
+
}
|
346
|
+
|
347
|
+
_snwprintf(filenamew, size, L"%s\\%s", handle->dirw,
|
348
|
+
file_info->FileName);
|
349
|
+
|
350
|
+
filenamew[size - 1] = L'\0';
|
351
|
+
|
352
|
+
/* Convert to long name. */
|
353
|
+
size = GetLongPathNameW(filenamew, NULL, 0);
|
354
|
+
|
355
|
+
if (size) {
|
356
|
+
long_filenamew = (wchar_t*)malloc(size * sizeof(wchar_t));
|
357
|
+
if (!long_filenamew) {
|
358
|
+
uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
|
359
|
+
}
|
360
|
+
|
361
|
+
size = GetLongPathNameW(filenamew, long_filenamew, size);
|
362
|
+
if (size) {
|
363
|
+
long_filenamew[size] = '\0';
|
364
|
+
} else {
|
365
|
+
free(long_filenamew);
|
366
|
+
long_filenamew = NULL;
|
367
|
+
}
|
368
|
+
}
|
369
|
+
|
370
|
+
free(filenamew);
|
371
|
+
|
372
|
+
if (long_filenamew) {
|
373
|
+
/* Get the file name out of the long path. */
|
374
|
+
result = uv_split_path(long_filenamew, NULL, &filenamew);
|
375
|
+
free(long_filenamew);
|
376
|
+
|
377
|
+
if (result == 0) {
|
378
|
+
long_filenamew = filenamew;
|
379
|
+
sizew = -1;
|
380
|
+
} else {
|
381
|
+
long_filenamew = NULL;
|
382
|
+
}
|
383
|
+
}
|
384
|
+
|
385
|
+
/*
|
386
|
+
* If we couldn't get the long name - just use the name
|
387
|
+
* provided by ReadDirectoryChangesW.
|
388
|
+
*/
|
389
|
+
if (!long_filenamew) {
|
390
|
+
filenamew = file_info->FileName;
|
391
|
+
sizew = file_info->FileNameLength / sizeof(wchar_t);
|
392
|
+
}
|
393
|
+
} else {
|
394
|
+
/* Removed or renamed callbacks don't provide filename. */
|
395
|
+
filenamew = NULL;
|
396
|
+
}
|
397
|
+
} else {
|
398
|
+
/* We already have the long name of the file, so just use it. */
|
399
|
+
filenamew = handle->filew;
|
400
|
+
sizew = -1;
|
401
|
+
}
|
402
|
+
|
403
|
+
if (filenamew) {
|
404
|
+
/* Convert the filename to utf8. */
|
405
|
+
size = uv_utf16_to_utf8(filenamew,
|
406
|
+
sizew,
|
407
|
+
NULL,
|
408
|
+
0);
|
409
|
+
if (size) {
|
410
|
+
filename = (char*)malloc(size + 1);
|
411
|
+
if (!filename) {
|
412
|
+
uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
|
413
|
+
}
|
414
|
+
|
415
|
+
size = uv_utf16_to_utf8(filenamew,
|
416
|
+
sizew,
|
417
|
+
filename,
|
418
|
+
size);
|
419
|
+
if (size) {
|
420
|
+
filename[size] = '\0';
|
421
|
+
} else {
|
422
|
+
free(filename);
|
423
|
+
filename = NULL;
|
424
|
+
}
|
425
|
+
}
|
426
|
+
}
|
427
|
+
|
428
|
+
switch (file_info->Action) {
|
429
|
+
case FILE_ACTION_ADDED:
|
430
|
+
case FILE_ACTION_REMOVED:
|
431
|
+
case FILE_ACTION_RENAMED_OLD_NAME:
|
432
|
+
case FILE_ACTION_RENAMED_NEW_NAME:
|
433
|
+
handle->cb(handle, filename, UV_RENAME, 0);
|
434
|
+
break;
|
435
|
+
|
436
|
+
case FILE_ACTION_MODIFIED:
|
437
|
+
handle->cb(handle, filename, UV_CHANGE, 0);
|
438
|
+
break;
|
439
|
+
}
|
440
|
+
|
441
|
+
free(filename);
|
442
|
+
filename = NULL;
|
443
|
+
free(long_filenamew);
|
444
|
+
long_filenamew = NULL;
|
445
|
+
}
|
446
|
+
|
447
|
+
offset = file_info->NextEntryOffset;
|
448
|
+
} while (offset && !(handle->flags & UV_HANDLE_CLOSING));
|
449
|
+
} else {
|
450
|
+
handle->cb(handle, NULL, UV_CHANGE, 0);
|
451
|
+
}
|
452
|
+
} else {
|
453
|
+
uv__set_sys_error(loop, GET_REQ_ERROR(req));
|
454
|
+
handle->cb(handle, NULL, 0, -1);
|
455
|
+
}
|
456
|
+
|
457
|
+
if (!(handle->flags & UV_HANDLE_CLOSING)) {
|
458
|
+
uv_fs_event_queue_readdirchanges(loop, handle);
|
459
|
+
} else {
|
460
|
+
uv_want_endgame(loop, (uv_handle_t*)handle);
|
461
|
+
}
|
462
|
+
}
|
463
|
+
|
464
|
+
|
465
|
+
void uv_fs_event_close(uv_loop_t* loop, uv_fs_event_t* handle) {
|
466
|
+
if (handle->dir_handle != INVALID_HANDLE_VALUE) {
|
467
|
+
CloseHandle(handle->dir_handle);
|
468
|
+
handle->dir_handle = INVALID_HANDLE_VALUE;
|
469
|
+
}
|
470
|
+
|
471
|
+
if (!handle->req_pending) {
|
472
|
+
uv_want_endgame(loop, (uv_handle_t*)handle);
|
473
|
+
}
|
474
|
+
}
|
475
|
+
|
476
|
+
|
477
|
+
void uv_fs_event_endgame(uv_loop_t* loop, uv_fs_event_t* handle) {
|
478
|
+
if (handle->flags & UV_HANDLE_CLOSING &&
|
479
|
+
!handle->req_pending) {
|
480
|
+
assert(!(handle->flags & UV_HANDLE_CLOSED));
|
481
|
+
handle->flags |= UV_HANDLE_CLOSED;
|
482
|
+
|
483
|
+
if (handle->buffer) {
|
484
|
+
_aligned_free(handle->buffer);
|
485
|
+
handle->buffer = NULL;
|
486
|
+
}
|
487
|
+
|
488
|
+
if (handle->filew) {
|
489
|
+
free(handle->filew);
|
490
|
+
handle->filew = NULL;
|
491
|
+
}
|
492
|
+
|
493
|
+
if (handle->short_filew) {
|
494
|
+
free(handle->short_filew);
|
495
|
+
handle->short_filew = NULL;
|
496
|
+
}
|
497
|
+
|
498
|
+
if (handle->filename) {
|
499
|
+
free(handle->filename);
|
500
|
+
handle->filename = NULL;
|
501
|
+
}
|
502
|
+
|
503
|
+
if (handle->dirw) {
|
504
|
+
free(handle->dirw);
|
505
|
+
handle->dirw = NULL;
|
506
|
+
}
|
507
|
+
|
508
|
+
if (handle->close_cb) {
|
509
|
+
handle->close_cb((uv_handle_t*)handle);
|
510
|
+
}
|
511
|
+
|
512
|
+
uv_unref(loop);
|
513
|
+
}
|
514
|
+
}
|