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,159 @@
|
|
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
|
+
#ifndef RUNNER_H_
|
23
|
+
#define RUNNER_H_
|
24
|
+
|
25
|
+
#include <stdio.h> /* FILE */
|
26
|
+
|
27
|
+
|
28
|
+
/*
|
29
|
+
* The maximum number of processes (main + helpers) that a test / benchmark
|
30
|
+
* can have.
|
31
|
+
*/
|
32
|
+
#define MAX_PROCESSES 8
|
33
|
+
|
34
|
+
|
35
|
+
/*
|
36
|
+
* Struct to store both tests and to define helper processes for tasks.
|
37
|
+
*/
|
38
|
+
typedef struct {
|
39
|
+
char *task_name;
|
40
|
+
char *process_name;
|
41
|
+
int (*main)();
|
42
|
+
int is_helper;
|
43
|
+
int show_output;
|
44
|
+
} task_entry_t, bench_entry_t;
|
45
|
+
|
46
|
+
|
47
|
+
/*
|
48
|
+
* Macros used by test-list.h and benchmark-list.h.
|
49
|
+
*/
|
50
|
+
#define TASK_LIST_START \
|
51
|
+
task_entry_t TASKS[] = {
|
52
|
+
|
53
|
+
#define TASK_LIST_END \
|
54
|
+
{ 0, 0, 0, 0 } \
|
55
|
+
};
|
56
|
+
|
57
|
+
#define TEST_DECLARE(name) \
|
58
|
+
int run_test_##name();
|
59
|
+
|
60
|
+
#define TEST_ENTRY(name) \
|
61
|
+
{ #name, #name, &run_test_##name, 0, 0 },
|
62
|
+
|
63
|
+
#define TEST_OUTPUT_ENTRY(name) \
|
64
|
+
{ #name, #name, &run_test_##name, 0, 1 },
|
65
|
+
|
66
|
+
#define BENCHMARK_DECLARE(name) \
|
67
|
+
int run_benchmark_##name();
|
68
|
+
|
69
|
+
#define BENCHMARK_ENTRY(name) \
|
70
|
+
{ #name, #name, &run_benchmark_##name, 0, 0 },
|
71
|
+
|
72
|
+
#define HELPER_DECLARE(name) \
|
73
|
+
int run_helper_##name();
|
74
|
+
|
75
|
+
#define HELPER_ENTRY(task_name, name) \
|
76
|
+
{ #task_name, #name, &run_helper_##name, 1, 0 },
|
77
|
+
|
78
|
+
#define TEST_HELPER HELPER_ENTRY
|
79
|
+
#define BENCHMARK_HELPER HELPER_ENTRY
|
80
|
+
|
81
|
+
#define PATHMAX 1024
|
82
|
+
extern char executable_path[PATHMAX];
|
83
|
+
|
84
|
+
/*
|
85
|
+
* Include platform-dependent definitions
|
86
|
+
*/
|
87
|
+
#ifdef _WIN32
|
88
|
+
# include "runner-win.h"
|
89
|
+
#else
|
90
|
+
# include "runner-unix.h"
|
91
|
+
#endif
|
92
|
+
|
93
|
+
|
94
|
+
/* The array that is filled by test-list.h or benchmark-list.h */
|
95
|
+
extern task_entry_t TASKS[];
|
96
|
+
|
97
|
+
/*
|
98
|
+
* Run all tests.
|
99
|
+
*/
|
100
|
+
int run_tests(int timeout, int benchmark_output);
|
101
|
+
|
102
|
+
/*
|
103
|
+
* Run a single test. Starts up any helpers.
|
104
|
+
*/
|
105
|
+
int run_test(const char* test, int timeout, int benchmark_output);
|
106
|
+
|
107
|
+
/*
|
108
|
+
* Run a test part, i.e. the test or one of its helpers.
|
109
|
+
*/
|
110
|
+
int run_test_part(const char* test, const char* part);
|
111
|
+
|
112
|
+
|
113
|
+
/*
|
114
|
+
* Print tests in sorted order to `stream`. Used by `./run-tests --list`.
|
115
|
+
*/
|
116
|
+
void print_tests(FILE* stream);
|
117
|
+
|
118
|
+
|
119
|
+
/*
|
120
|
+
* Stuff that should be implemented by test-runner-<platform>.h
|
121
|
+
* All functions return 0 on success, -1 on failure, unless specified
|
122
|
+
* otherwise.
|
123
|
+
*/
|
124
|
+
|
125
|
+
/* Do platform-specific initialization. */
|
126
|
+
void platform_init();
|
127
|
+
|
128
|
+
/* Invoke "argv[0] test-name [test-part]". Store process info in *p. */
|
129
|
+
/* Make sure that all stdio output of the processes is buffered up. */
|
130
|
+
int process_start(char *name, char* part, process_info_t *p);
|
131
|
+
|
132
|
+
/* Wait for all `n` processes in `vec` to terminate. */
|
133
|
+
/* Time out after `timeout` msec, or never if timeout == -1 */
|
134
|
+
/* Return 0 if all processes are terminated, -1 on error, -2 on timeout. */
|
135
|
+
int process_wait(process_info_t *vec, int n, int timeout);
|
136
|
+
|
137
|
+
/* Returns the number of bytes in the stdio output buffer for process `p`. */
|
138
|
+
long int process_output_size(process_info_t *p);
|
139
|
+
|
140
|
+
/* Copy the contents of the stdio output buffer to `fd`. */
|
141
|
+
int process_copy_output(process_info_t *p, int fd);
|
142
|
+
|
143
|
+
/* Return the name that was specified when `p` was started by process_start */
|
144
|
+
char* process_get_name(process_info_t *p);
|
145
|
+
|
146
|
+
/* Terminate process `p`. */
|
147
|
+
int process_terminate(process_info_t *p);
|
148
|
+
|
149
|
+
/* Return the exit code of process p. */
|
150
|
+
/* On error, return -1. */
|
151
|
+
int process_reap(process_info_t *p);
|
152
|
+
|
153
|
+
/* Clean up after terminating process `p` (e.g. free the output buffer etc.). */
|
154
|
+
void process_cleanup(process_info_t *p);
|
155
|
+
|
156
|
+
/* Move the console cursor one line up and back to the first column. */
|
157
|
+
void rewind_cursor();
|
158
|
+
|
159
|
+
#endif /* RUNNER_H_ */
|
@@ -0,0 +1,117 @@
|
|
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
|
+
#ifndef TASK_H_
|
23
|
+
#define TASK_H_
|
24
|
+
|
25
|
+
#include <stdio.h>
|
26
|
+
#include <stddef.h>
|
27
|
+
#include <stdint.h>
|
28
|
+
#include <stdlib.h>
|
29
|
+
|
30
|
+
#define TEST_PORT 9123
|
31
|
+
#define TEST_PORT_2 9124
|
32
|
+
|
33
|
+
#ifdef _WIN32
|
34
|
+
# define TEST_PIPENAME "\\\\.\\pipe\\uv-test"
|
35
|
+
# define TEST_PIPENAME_2 "\\\\.\\pipe\\uv-test2"
|
36
|
+
#else
|
37
|
+
# define TEST_PIPENAME "/tmp/uv-test-sock"
|
38
|
+
# define TEST_PIPENAME_2 "/tmp/uv-test-sock2"
|
39
|
+
#endif
|
40
|
+
|
41
|
+
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
42
|
+
|
43
|
+
#define container_of(ptr, type, member) \
|
44
|
+
((type *) ((char *) (ptr) - offsetof(type, member)))
|
45
|
+
|
46
|
+
typedef enum {
|
47
|
+
TCP = 0,
|
48
|
+
UDP,
|
49
|
+
PIPE
|
50
|
+
} stream_type;
|
51
|
+
|
52
|
+
/* Log to stderr. */
|
53
|
+
#define LOG(...) \
|
54
|
+
do { \
|
55
|
+
fprintf(stderr, "%s", __VA_ARGS__); \
|
56
|
+
fflush(stderr); \
|
57
|
+
} while (0)
|
58
|
+
|
59
|
+
#define LOGF(...) \
|
60
|
+
do { \
|
61
|
+
fprintf(stderr, __VA_ARGS__); \
|
62
|
+
fflush(stderr); \
|
63
|
+
} while (0)
|
64
|
+
|
65
|
+
/* Die with fatal error. */
|
66
|
+
#define FATAL(msg) \
|
67
|
+
do { \
|
68
|
+
fprintf(stderr, \
|
69
|
+
"Fatal error in %s on line %d: %s\n", \
|
70
|
+
__FILE__, \
|
71
|
+
__LINE__, \
|
72
|
+
msg); \
|
73
|
+
fflush(stderr); \
|
74
|
+
abort(); \
|
75
|
+
} while (0)
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
/* Have our own assert, so we are sure it does not get optimized away in
|
80
|
+
* a release build.
|
81
|
+
*/
|
82
|
+
#define ASSERT(expr) \
|
83
|
+
do { \
|
84
|
+
if (!(expr)) { \
|
85
|
+
fprintf(stderr, \
|
86
|
+
"Assertion failed in %s on line %d: %s\n", \
|
87
|
+
__FILE__, \
|
88
|
+
__LINE__, \
|
89
|
+
#expr); \
|
90
|
+
abort(); \
|
91
|
+
} \
|
92
|
+
} while (0)
|
93
|
+
|
94
|
+
|
95
|
+
/* Just sugar for wrapping the main() for a task or helper. */
|
96
|
+
#define TEST_IMPL(name) \
|
97
|
+
int run_test_##name()
|
98
|
+
|
99
|
+
#define BENCHMARK_IMPL(name) \
|
100
|
+
int run_benchmark_##name()
|
101
|
+
|
102
|
+
#define HELPER_IMPL(name) \
|
103
|
+
int run_helper_##name()
|
104
|
+
|
105
|
+
|
106
|
+
/* Create a thread. Returns the thread identifier, or 0 on failure. */
|
107
|
+
uintptr_t uv_create_thread(void (*entry)(void* arg), void* arg);
|
108
|
+
|
109
|
+
/* Wait for a thread to terminate. Should return 0 if the thread ended, -1 on
|
110
|
+
* error.
|
111
|
+
*/
|
112
|
+
int uv_wait_thread(uintptr_t thread_id);
|
113
|
+
|
114
|
+
/* Pause the calling thread for a number of milliseconds. */
|
115
|
+
void uv_sleep(int msec);
|
116
|
+
|
117
|
+
#endif /* TASK_H_ */
|
@@ -0,0 +1,216 @@
|
|
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 "task.h"
|
24
|
+
#include <stdio.h>
|
25
|
+
#include <stdlib.h>
|
26
|
+
|
27
|
+
|
28
|
+
static uv_prepare_t prepare_handle;
|
29
|
+
|
30
|
+
static uv_async_t async1_handle;
|
31
|
+
/* static uv_handle_t async2_handle; */
|
32
|
+
|
33
|
+
static int prepare_cb_called = 0;
|
34
|
+
|
35
|
+
static volatile int async1_cb_called = 0;
|
36
|
+
static int async1_closed = 0;
|
37
|
+
/* static volatile int async2_cb_called = 0; */
|
38
|
+
|
39
|
+
static int close_cb_called = 0;
|
40
|
+
|
41
|
+
static uintptr_t thread1_id = 0;
|
42
|
+
#if 0
|
43
|
+
static uintptr_t thread2_id = 0;
|
44
|
+
static uintptr_t thread3_id = 0;
|
45
|
+
#endif
|
46
|
+
|
47
|
+
|
48
|
+
/* Thread 1 makes sure that async1_cb_called reaches 3 before exiting. */
|
49
|
+
void thread1_entry(void *arg) {
|
50
|
+
uv_sleep(50);
|
51
|
+
|
52
|
+
while (1) {
|
53
|
+
switch (async1_cb_called) {
|
54
|
+
case 0:
|
55
|
+
uv_async_send(&async1_handle);
|
56
|
+
break;
|
57
|
+
|
58
|
+
case 1:
|
59
|
+
uv_async_send(&async1_handle);
|
60
|
+
break;
|
61
|
+
|
62
|
+
case 2:
|
63
|
+
uv_async_send(&async1_handle);
|
64
|
+
break;
|
65
|
+
|
66
|
+
default:
|
67
|
+
return;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
#if 0
|
73
|
+
/* Thread 2 calls uv_async_send on async_handle_2 8 times. */
|
74
|
+
void thread2_entry(void *arg) {
|
75
|
+
int i;
|
76
|
+
|
77
|
+
while (1) {
|
78
|
+
switch (async1_cb_called) {
|
79
|
+
case 0:
|
80
|
+
uv_async_send(&async2_handle);
|
81
|
+
break;
|
82
|
+
|
83
|
+
case 1:
|
84
|
+
uv_async_send(&async2_handle);
|
85
|
+
break;
|
86
|
+
|
87
|
+
case 2:
|
88
|
+
uv_async_send(&async2_handle);
|
89
|
+
break;
|
90
|
+
}
|
91
|
+
uv_sleep(5);
|
92
|
+
}
|
93
|
+
|
94
|
+
if (async1_cb_called == 20) {
|
95
|
+
uv_close(handle);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
|
100
|
+
/* Thread 3 calls uv_async_send on async_handle_2 8 times
|
101
|
+
* after waiting half a second first.
|
102
|
+
*/
|
103
|
+
void thread3_entry(void *arg) {
|
104
|
+
int i;
|
105
|
+
|
106
|
+
for (i = 0; i < 8; i++) {
|
107
|
+
uv_async_send(&async2_handle);
|
108
|
+
}
|
109
|
+
}
|
110
|
+
#endif
|
111
|
+
|
112
|
+
|
113
|
+
static void close_cb(uv_handle_t* handle) {
|
114
|
+
ASSERT(handle != NULL);
|
115
|
+
close_cb_called++;
|
116
|
+
}
|
117
|
+
|
118
|
+
|
119
|
+
static void async1_cb(uv_async_t* handle, int status) {
|
120
|
+
ASSERT(handle == &async1_handle);
|
121
|
+
ASSERT(status == 0);
|
122
|
+
|
123
|
+
async1_cb_called++;
|
124
|
+
printf("async1_cb #%d\n", async1_cb_called);
|
125
|
+
|
126
|
+
if (async1_cb_called > 2 && !async1_closed) {
|
127
|
+
async1_closed = 1;
|
128
|
+
uv_close((uv_handle_t*)handle, close_cb);
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
|
133
|
+
#if 0
|
134
|
+
static void async2_cb(uv_handle_t* handle, int status) {
|
135
|
+
ASSERT(handle == &async2_handle);
|
136
|
+
ASSERT(status == 0);
|
137
|
+
|
138
|
+
async2_cb_called++;
|
139
|
+
printf("async2_cb #%d\n", async2_cb_called);
|
140
|
+
|
141
|
+
if (async2_cb_called == 16) {
|
142
|
+
uv_close(handle);
|
143
|
+
}
|
144
|
+
}
|
145
|
+
#endif
|
146
|
+
|
147
|
+
|
148
|
+
static void prepare_cb(uv_prepare_t* handle, int status) {
|
149
|
+
ASSERT(handle == &prepare_handle);
|
150
|
+
ASSERT(status == 0);
|
151
|
+
|
152
|
+
switch (prepare_cb_called) {
|
153
|
+
case 0:
|
154
|
+
thread1_id = uv_create_thread(thread1_entry, NULL);
|
155
|
+
ASSERT(thread1_id != 0);
|
156
|
+
break;
|
157
|
+
|
158
|
+
#if 0
|
159
|
+
case 1:
|
160
|
+
thread2_id = uv_create_thread(thread2_entry, NULL);
|
161
|
+
ASSERT(thread2_id != 0);
|
162
|
+
break;
|
163
|
+
|
164
|
+
case 2:
|
165
|
+
thread3_id = uv_create_thread(thread3_entry, NULL);
|
166
|
+
ASSERT(thread3_id != 0);
|
167
|
+
break;
|
168
|
+
#endif
|
169
|
+
|
170
|
+
case 1:
|
171
|
+
uv_close((uv_handle_t*)handle, close_cb);
|
172
|
+
break;
|
173
|
+
|
174
|
+
default:
|
175
|
+
FATAL("Should never get here");
|
176
|
+
}
|
177
|
+
|
178
|
+
prepare_cb_called++;
|
179
|
+
}
|
180
|
+
|
181
|
+
|
182
|
+
TEST_IMPL(async) {
|
183
|
+
int r;
|
184
|
+
|
185
|
+
r = uv_prepare_init(uv_default_loop(), &prepare_handle);
|
186
|
+
ASSERT(r == 0);
|
187
|
+
r = uv_prepare_start(&prepare_handle, prepare_cb);
|
188
|
+
ASSERT(r == 0);
|
189
|
+
|
190
|
+
r = uv_async_init(uv_default_loop(), &async1_handle, async1_cb);
|
191
|
+
ASSERT(r == 0);
|
192
|
+
|
193
|
+
#if 0
|
194
|
+
r = uv_async_init(&async2_handle, async2_cb, close_cb, NULL);
|
195
|
+
ASSERT(r == 0);
|
196
|
+
#endif
|
197
|
+
|
198
|
+
r = uv_run(uv_default_loop());
|
199
|
+
ASSERT(r == 0);
|
200
|
+
|
201
|
+
r = uv_wait_thread(thread1_id);
|
202
|
+
ASSERT(r == 0);
|
203
|
+
#if 0
|
204
|
+
r = uv_wait_thread(thread2_id);
|
205
|
+
ASSERT(r == 0);
|
206
|
+
r = uv_wait_thread(thread3_id);
|
207
|
+
ASSERT(r == 0);
|
208
|
+
#endif
|
209
|
+
|
210
|
+
ASSERT(prepare_cb_called == 2);
|
211
|
+
ASSERT(async1_cb_called > 2);
|
212
|
+
/* ASSERT(async2_cb_called = 16); */
|
213
|
+
ASSERT(close_cb_called == 2);
|
214
|
+
|
215
|
+
return 0;
|
216
|
+
}
|
@@ -0,0 +1,203 @@
|
|
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
|
+
/*
|
23
|
+
* TODO: Add explanation of why we want on_close to be called from fresh
|
24
|
+
* stack.
|
25
|
+
*/
|
26
|
+
|
27
|
+
#include "uv.h"
|
28
|
+
#include "task.h"
|
29
|
+
|
30
|
+
|
31
|
+
static const char MESSAGE[] = "Failure is for the weak. Everyone dies alone.";
|
32
|
+
|
33
|
+
static uv_tcp_t client;
|
34
|
+
static uv_timer_t timer;
|
35
|
+
static uv_connect_t connect_req;
|
36
|
+
static uv_write_t write_req;
|
37
|
+
static uv_shutdown_t shutdown_req;
|
38
|
+
|
39
|
+
static int nested = 0;
|
40
|
+
static int close_cb_called = 0;
|
41
|
+
static int connect_cb_called = 0;
|
42
|
+
static int write_cb_called = 0;
|
43
|
+
static int timer_cb_called = 0;
|
44
|
+
static int bytes_received = 0;
|
45
|
+
static int shutdown_cb_called = 0;
|
46
|
+
|
47
|
+
|
48
|
+
static uv_buf_t alloc_cb(uv_handle_t* handle, size_t size) {
|
49
|
+
uv_buf_t buf;
|
50
|
+
buf.len = size;
|
51
|
+
buf.base = (char*) malloc(size);
|
52
|
+
ASSERT(buf.base);
|
53
|
+
return buf;
|
54
|
+
}
|
55
|
+
|
56
|
+
|
57
|
+
static void close_cb(uv_handle_t* handle) {
|
58
|
+
ASSERT(nested == 0 && "close_cb must be called from a fresh stack");
|
59
|
+
|
60
|
+
close_cb_called++;
|
61
|
+
}
|
62
|
+
|
63
|
+
|
64
|
+
static void shutdown_cb(uv_shutdown_t* req, int status) {
|
65
|
+
ASSERT(status == 0);
|
66
|
+
ASSERT(nested == 0 && "shutdown_cb must be called from a fresh stack");
|
67
|
+
|
68
|
+
shutdown_cb_called++;
|
69
|
+
}
|
70
|
+
|
71
|
+
|
72
|
+
static void read_cb(uv_stream_t* tcp, ssize_t nread, uv_buf_t buf) {
|
73
|
+
ASSERT(nested == 0 && "read_cb must be called from a fresh stack");
|
74
|
+
|
75
|
+
printf("Read. nread == %d\n", (int)nread);
|
76
|
+
free(buf.base);
|
77
|
+
|
78
|
+
if (nread == 0) {
|
79
|
+
ASSERT(uv_last_error(uv_default_loop()).code == UV_EAGAIN);
|
80
|
+
return;
|
81
|
+
|
82
|
+
} else if (nread == -1) {
|
83
|
+
ASSERT(uv_last_error(uv_default_loop()).code == UV_EOF);
|
84
|
+
|
85
|
+
nested++;
|
86
|
+
uv_close((uv_handle_t*)tcp, close_cb);
|
87
|
+
nested--;
|
88
|
+
|
89
|
+
return;
|
90
|
+
}
|
91
|
+
|
92
|
+
bytes_received += nread;
|
93
|
+
|
94
|
+
/* We call shutdown here because when bytes_received == sizeof MESSAGE */
|
95
|
+
/* there will be no more data sent nor received, so here it would be */
|
96
|
+
/* possible for a backend to to call shutdown_cb immediately and *not* */
|
97
|
+
/* from a fresh stack. */
|
98
|
+
if (bytes_received == sizeof MESSAGE) {
|
99
|
+
nested++;
|
100
|
+
|
101
|
+
puts("Shutdown");
|
102
|
+
|
103
|
+
if (uv_shutdown(&shutdown_req, (uv_stream_t*)tcp, shutdown_cb)) {
|
104
|
+
FATAL("uv_shutdown failed");
|
105
|
+
}
|
106
|
+
nested--;
|
107
|
+
}
|
108
|
+
}
|
109
|
+
|
110
|
+
|
111
|
+
static void timer_cb(uv_timer_t* handle, int status) {
|
112
|
+
ASSERT(handle == &timer);
|
113
|
+
ASSERT(status == 0);
|
114
|
+
ASSERT(nested == 0 && "timer_cb must be called from a fresh stack");
|
115
|
+
|
116
|
+
puts("Timeout complete. Now read data...");
|
117
|
+
|
118
|
+
nested++;
|
119
|
+
if (uv_read_start((uv_stream_t*)&client, alloc_cb, read_cb)) {
|
120
|
+
FATAL("uv_read_start failed");
|
121
|
+
}
|
122
|
+
nested--;
|
123
|
+
|
124
|
+
timer_cb_called++;
|
125
|
+
|
126
|
+
uv_close((uv_handle_t*)handle, close_cb);
|
127
|
+
}
|
128
|
+
|
129
|
+
|
130
|
+
static void write_cb(uv_write_t* req, int status) {
|
131
|
+
int r;
|
132
|
+
|
133
|
+
ASSERT(status == 0);
|
134
|
+
ASSERT(nested == 0 && "write_cb must be called from a fresh stack");
|
135
|
+
|
136
|
+
puts("Data written. 500ms timeout...");
|
137
|
+
|
138
|
+
/* After the data has been sent, we're going to wait for a while, then */
|
139
|
+
/* start reading. This makes us certain that the message has been echoed */
|
140
|
+
/* back to our receive buffer when we start reading. This maximizes the */
|
141
|
+
/* temptation for the backend to use dirty stack for calling read_cb. */
|
142
|
+
nested++;
|
143
|
+
r = uv_timer_init(uv_default_loop(), &timer);
|
144
|
+
ASSERT(r == 0);
|
145
|
+
r = uv_timer_start(&timer, timer_cb, 500, 0);
|
146
|
+
ASSERT(r == 0);
|
147
|
+
nested--;
|
148
|
+
|
149
|
+
write_cb_called++;
|
150
|
+
}
|
151
|
+
|
152
|
+
|
153
|
+
static void connect_cb(uv_connect_t* req, int status) {
|
154
|
+
uv_buf_t buf;
|
155
|
+
|
156
|
+
puts("Connected. Write some data to echo server...");
|
157
|
+
|
158
|
+
ASSERT(status == 0);
|
159
|
+
ASSERT(nested == 0 && "connect_cb must be called from a fresh stack");
|
160
|
+
|
161
|
+
nested++;
|
162
|
+
|
163
|
+
buf.base = (char*) &MESSAGE;
|
164
|
+
buf.len = sizeof MESSAGE;
|
165
|
+
|
166
|
+
if (uv_write(&write_req, (uv_stream_t*)req->handle, &buf, 1, write_cb)) {
|
167
|
+
FATAL("uv_write failed");
|
168
|
+
}
|
169
|
+
|
170
|
+
nested--;
|
171
|
+
|
172
|
+
connect_cb_called++;
|
173
|
+
}
|
174
|
+
|
175
|
+
|
176
|
+
TEST_IMPL(callback_stack) {
|
177
|
+
struct sockaddr_in addr = uv_ip4_addr("127.0.0.1", TEST_PORT);
|
178
|
+
|
179
|
+
if (uv_tcp_init(uv_default_loop(), &client)) {
|
180
|
+
FATAL("uv_tcp_init failed");
|
181
|
+
}
|
182
|
+
|
183
|
+
puts("Connecting...");
|
184
|
+
|
185
|
+
nested++;
|
186
|
+
|
187
|
+
if (uv_tcp_connect(&connect_req, &client, addr, connect_cb)) {
|
188
|
+
FATAL("uv_tcp_connect failed");
|
189
|
+
}
|
190
|
+
nested--;
|
191
|
+
|
192
|
+
uv_run(uv_default_loop());
|
193
|
+
|
194
|
+
ASSERT(nested == 0);
|
195
|
+
ASSERT(connect_cb_called == 1 && "connect_cb must be called exactly once");
|
196
|
+
ASSERT(write_cb_called == 1 && "write_cb must be called exactly once");
|
197
|
+
ASSERT(timer_cb_called == 1 && "timer_cb must be called exactly once");
|
198
|
+
ASSERT(bytes_received == sizeof MESSAGE);
|
199
|
+
ASSERT(shutdown_cb_called == 1 && "shutdown_cb must be called exactly once");
|
200
|
+
ASSERT(close_cb_called == 2 && "close_cb must be called exactly twice");
|
201
|
+
|
202
|
+
return 0;
|
203
|
+
}
|