diff --git a/deps/uv/README b/deps/uv/README.md similarity index 57% rename from deps/uv/README rename to deps/uv/README.md index c808c976b0..9bf05992b2 100644 --- a/deps/uv/README +++ b/deps/uv/README.md @@ -1,10 +1,49 @@ -This is the new networking layer for Node. Its purpose is to abstract -IOCP on windows and libev on Unix systems. We intend to eventually contain -all platform differences in this library. +# libuv + +libuv is a new platform layer for Node. Its purpose is to abstract IOCP on +windows and libev on Unix systems. We intend to eventually contain all +platform differences in this library. http://nodejs.org/ -= Build Instructions +## Features + +Implemented Features: + + * Non-blocking sockets and pipes + + * Timers + + * UDP + + * Child process spawning + + * Asynchronous DNS via c-ares or getaddrinfo. + + * Asynchronous file system APIs (uv_fs_*) + + * High resolution time (uv_hrtime) + + * Current executable path look up (uv_exepath) + + * Thread pool scheduling (uv_queue_work) + +Work in progress: + + * File system events (Currently supports inotify, ReadDirectoryChangesW and + will support kqueue and event ports in the near future.) + + * TTY support (with VT100 emulation on Windows - work in progress) + + * Socket sharing between processes + + +## Documentation + +See `include/uv.h`. + + +## Build Instructions For GCC (including MinGW) there are two methods building: via normal makefiles or via GYP. GYP is a meta-build system which can generate MSVS, @@ -38,7 +77,7 @@ Macintosh users run xcodebuild -project uv.xcodeproj -configuration Release -target All -= Supported Platforms +## Supported Platforms Microsoft Windows operating systems since Windows XP SP2. It can be built with either Visual Studio or MinGW. diff --git a/deps/uv/include/uv.h b/deps/uv/include/uv.h index c9c5c9ab3e..b8bdc09302 100644 --- a/deps/uv/include/uv.h +++ b/deps/uv/include/uv.h @@ -612,11 +612,6 @@ struct uv_tty_s { UV_TTY_PRIVATE_FIELDS }; -/* - * Returns 1 if file is associated with a Console/TTY 0 otherwise. - */ -int uv_is_tty(uv_file file); - int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd); /* @@ -633,6 +628,7 @@ int uv_tty_get_winsize(uv_tty_t*, int* width, int* height); * Used to detect what type of stream should be used with a given file * descriptor. Usually this will be used during initialization to guess the * type of the stdio streams. + * For isatty() functionality use this function and test for UV_TTY. */ uv_handle_type uv_guess_handle(uv_file file); @@ -807,8 +803,10 @@ struct uv_getaddrinfo_s { * * Return code 0 means that request is accepted and callback will be called * with result. Other return codes mean that there will not be a callback. - * Input arguments may be released after return from this call. Callback - * must not call freeaddrinfo. + * Input arguments may be released after return from this call. + * + * uv_freeaddrinfo() must be called after completion to free the addrinfo + * structure. */ int uv_getaddrinfo(uv_loop_t*, uv_getaddrinfo_t* handle, @@ -817,6 +815,8 @@ struct uv_getaddrinfo_s { const char* service, const struct addrinfo* hints); +void uv_freeaddrinfo(struct addrinfo* ai); + /* uv_spawn() options */ typedef struct uv_process_options_s { uv_exit_cb exit_cb; /* Called after the process exits. */ diff --git a/deps/uv/src/unix/core.c b/deps/uv/src/unix/core.c index 39d5641fc0..80b3bf6ed9 100644 --- a/deps/uv/src/unix/core.c +++ b/deps/uv/src/unix/core.c @@ -600,8 +600,6 @@ static int uv_getaddrinfo_done(eio_req* req) { handle->cb(handle, handle->retcode, res); - freeaddrinfo(res); - return 0; } @@ -668,6 +666,11 @@ int uv_getaddrinfo(uv_loop_t* loop, } +void uv_freeaddrinfo(struct addrinfo* ai) { + freeaddrinfo(ai); +} + + /* Open a socket in non-blocking close-on-exec mode, atomically if possible. */ int uv__socket(int domain, int type, int protocol) { #if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC) diff --git a/deps/uv/src/unix/darwin.c b/deps/uv/src/unix/darwin.c index 6bc122cc61..af72b4b0ec 100644 --- a/deps/uv/src/unix/darwin.c +++ b/deps/uv/src/unix/darwin.c @@ -19,6 +19,7 @@ */ #include "uv.h" +#include "internal.h" #include #include diff --git a/deps/uv/src/unix/tty.c b/deps/uv/src/unix/tty.c index 88ce52a24b..989c09d1bf 100644 --- a/deps/uv/src/unix/tty.c +++ b/deps/uv/src/unix/tty.c @@ -26,6 +26,7 @@ #include #include #include +#include int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd) { @@ -69,11 +70,6 @@ fatal: } -int uv_is_tty(uv_file file) { - return isatty(file); -} - - int uv_tty_get_winsize(uv_tty_t* tty, int* width, int* height) { struct winsize ws; diff --git a/deps/uv/src/win/getaddrinfo.c b/deps/uv/src/win/getaddrinfo.c index 3d313420ae..1416f04d62 100644 --- a/deps/uv/src/win/getaddrinfo.c +++ b/deps/uv/src/win/getaddrinfo.c @@ -216,12 +216,17 @@ complete: /* finally do callback with converted result */ handle->getaddrinfo_cb(handle, uv_ret, (struct addrinfo*)alloc_ptr); + uv_unref(loop); +} + + +void uv_freeaddrinfo(struct addrinfo* ai) { + char* alloc_ptr = (char*)ai; + /* release copied result memory */ if (alloc_ptr != NULL) { free(alloc_ptr); } - - uv_unref(loop); } diff --git a/deps/uv/src/win/tty.c b/deps/uv/src/win/tty.c index dc477c76c4..a4a4682964 100644 --- a/deps/uv/src/win/tty.c +++ b/deps/uv/src/win/tty.c @@ -38,9 +38,6 @@ int uv_tty_set_mode(uv_tty_t* tty, int mode) { int uv_is_tty(uv_file file) { - DWORD result; - int r = GetConsoleMode((HANDLE)_get_osfhandle(file), &result); - return r ? 1 : 0; } @@ -51,6 +48,14 @@ int uv_tty_get_winsize(uv_tty_t* tty, int* width, int* height) { uv_handle_type uv_guess_handle(uv_file file) { + DWORD result; + int r = GetConsoleMode((HANDLE)_get_osfhandle(file), &result); + + if (r) { + return UV_TTY; + } + assert(0 && "implement me"); + return UV_UNKNOWN_HANDLE; } diff --git a/deps/uv/test/benchmark-getaddrinfo.c b/deps/uv/test/benchmark-getaddrinfo.c index c2a887973c..892c14d1e9 100644 --- a/deps/uv/test/benchmark-getaddrinfo.c +++ b/deps/uv/test/benchmark-getaddrinfo.c @@ -52,6 +52,8 @@ static void getaddrinfo_cb(uv_getaddrinfo_t* handle, int status, if (calls_initiated < TOTAL_CALLS) { getaddrinfo_initiate(handle); } + + uv_freeaddrinfo(res); } diff --git a/deps/uv/test/test-getaddrinfo.c b/deps/uv/test/test-getaddrinfo.c index 4f0514f572..2a8c94e755 100644 --- a/deps/uv/test/test-getaddrinfo.c +++ b/deps/uv/test/test-getaddrinfo.c @@ -45,6 +45,7 @@ static void getaddrinfo_basic_cb(uv_getaddrinfo_t* handle, ASSERT(handle == getaddrinfo_handle); getaddrinfo_cbs++; free(handle); + uv_freeaddrinfo(res); } @@ -65,6 +66,7 @@ static void getaddrinfo_cuncurrent_cb(uv_getaddrinfo_t* handle, ASSERT (i < CONCURRENT_COUNT); free(data); + uv_freeaddrinfo(res); getaddrinfo_cbs++; } diff --git a/deps/uv/test/test-tty.c b/deps/uv/test/test-tty.c index f41c5e5434..11816156ff 100644 --- a/deps/uv/test/test-tty.c +++ b/deps/uv/test/test-tty.c @@ -31,13 +31,11 @@ TEST_IMPL(tty) { * Not necessarally a problem if this assert goes off. E.G you are piping * this test to a file. 0 == stdin. */ - ASSERT(uv_is_tty(0) == 1); + ASSERT(UV_TTY == uv_guess_handle(0)); r = uv_tty_init(uv_default_loop(), &tty, 0); ASSERT(r == 0); - ASSERT(UV_TTY == uv_guess_handle(0)); - r = uv_tty_get_winsize(&tty, &width, &height); ASSERT(r == 0); diff --git a/src/tty_wrap.cc b/src/tty_wrap.cc index d195b27d3e..f78739808d 100644 --- a/src/tty_wrap.cc +++ b/src/tty_wrap.cc @@ -50,7 +50,7 @@ class TTYWrap : StreamWrap { HandleScope scope; int fd = args[0]->Int32Value(); assert(fd >= 0); - return uv_is_tty(fd) ? v8::True() : v8::False(); + return uv_guess_handle(fd) == UV_TTY ? v8::True() : v8::False(); } static Handle New(const Arguments& args) {