diff options
author | Saúl Ibarra Corretgé <saghul@gmail.com> | 2015-01-28 22:14:19 +0100 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2015-01-28 22:47:38 +0100 |
commit | 097fde7129a3acc660beb372cecd9daf1164a7f2 (patch) | |
tree | 2bb1b2fb58b314f739df4ac91b0d60bee9c21277 /deps/uv/src | |
parent | 6ad236c9b6a344a88ec2f1f173d5f920984b77b7 (diff) | |
download | android-node-v8-097fde7129a3acc660beb372cecd9daf1164a7f2.tar.gz android-node-v8-097fde7129a3acc660beb372cecd9daf1164a7f2.tar.bz2 android-node-v8-097fde7129a3acc660beb372cecd9daf1164a7f2.zip |
deps: update libuv to 1.3.0
PR-URL: https://github.com/iojs/io.js/pull/644
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Diffstat (limited to 'deps/uv/src')
-rw-r--r-- | deps/uv/src/fs-poll.c | 14 | ||||
-rw-r--r-- | deps/uv/src/unix/aix.c | 2 | ||||
-rw-r--r-- | deps/uv/src/unix/darwin-proctitle.c | 5 | ||||
-rw-r--r-- | deps/uv/src/unix/darwin.c | 2 | ||||
-rw-r--r-- | deps/uv/src/unix/freebsd.c | 2 | ||||
-rw-r--r-- | deps/uv/src/unix/getaddrinfo.c | 30 | ||||
-rw-r--r-- | deps/uv/src/unix/getnameinfo.c | 22 | ||||
-rw-r--r-- | deps/uv/src/unix/internal.h | 2 | ||||
-rw-r--r-- | deps/uv/src/unix/linux-core.c | 33 | ||||
-rw-r--r-- | deps/uv/src/unix/loop.c | 75 | ||||
-rw-r--r-- | deps/uv/src/unix/netbsd.c | 2 | ||||
-rw-r--r-- | deps/uv/src/unix/openbsd.c | 2 | ||||
-rw-r--r-- | deps/uv/src/unix/pipe.c | 34 | ||||
-rw-r--r-- | deps/uv/src/unix/poll.c | 6 | ||||
-rw-r--r-- | deps/uv/src/unix/sunos.c | 2 | ||||
-rw-r--r-- | deps/uv/src/uv-common.c | 84 | ||||
-rw-r--r-- | deps/uv/src/uv-common.h | 2 | ||||
-rw-r--r-- | deps/uv/src/win/core.c | 65 | ||||
-rw-r--r-- | deps/uv/src/win/getaddrinfo.c | 65 | ||||
-rw-r--r-- | deps/uv/src/win/getnameinfo.c | 22 | ||||
-rw-r--r-- | deps/uv/src/win/pipe.c | 57 | ||||
-rw-r--r-- | deps/uv/src/win/poll.c | 5 |
22 files changed, 283 insertions, 250 deletions
diff --git a/deps/uv/src/fs-poll.c b/deps/uv/src/fs-poll.c index 0de15b1739..1145e5fc34 100644 --- a/deps/uv/src/fs-poll.c +++ b/deps/uv/src/fs-poll.c @@ -125,26 +125,26 @@ int uv_fs_poll_stop(uv_fs_poll_t* handle) { } -int uv_fs_poll_getpath(uv_fs_poll_t* handle, char* buf, size_t* len) { +int uv_fs_poll_getpath(uv_fs_poll_t* handle, char* buffer, size_t* size) { struct poll_ctx* ctx; size_t required_len; if (!uv__is_active(handle)) { - *len = 0; + *size = 0; return UV_EINVAL; } ctx = handle->poll_ctx; assert(ctx != NULL); - required_len = strlen(ctx->path) + 1; - if (required_len > *len) { - *len = required_len; + required_len = strlen(ctx->path); + if (required_len > *size) { + *size = required_len; return UV_ENOBUFS; } - memcpy(buf, ctx->path, required_len); - *len = required_len; + memcpy(buffer, ctx->path, required_len); + *size = required_len; return 0; } diff --git a/deps/uv/src/unix/aix.c b/deps/uv/src/unix/aix.c index 0c5d1f4b50..ec800c7a32 100644 --- a/deps/uv/src/unix/aix.c +++ b/deps/uv/src/unix/aix.c @@ -61,7 +61,7 @@ #define RDWR_BUF_SIZE 4096 #define EQ(a,b) (strcmp(a,b) == 0) -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { loop->fs_fd = -1; /* Passing maxfd of -1 should mean the limit is determined diff --git a/deps/uv/src/unix/darwin-proctitle.c b/deps/uv/src/unix/darwin-proctitle.c index b7267caa99..1142311609 100644 --- a/deps/uv/src/unix/darwin-proctitle.c +++ b/deps/uv/src/unix/darwin-proctitle.c @@ -21,6 +21,7 @@ #include <dlfcn.h> #include <errno.h> #include <stdlib.h> +#include <string.h> #include <TargetConditionals.h> @@ -36,7 +37,9 @@ static int uv__pthread_setname_np(const char* name) { int err; /* pthread_setname_np() first appeared in OS X 10.6 and iOS 3.2. */ - *(void **)(&dynamic_pthread_setname_np) = dlsym(RTLD_DEFAULT, "pthread_setname_np"); + *(void **)(&dynamic_pthread_setname_np) = + dlsym(RTLD_DEFAULT, "pthread_setname_np"); + if (dynamic_pthread_setname_np == NULL) return -ENOSYS; diff --git a/deps/uv/src/unix/darwin.c b/deps/uv/src/unix/darwin.c index 651545f85e..d276adac2e 100644 --- a/deps/uv/src/unix/darwin.c +++ b/deps/uv/src/unix/darwin.c @@ -37,7 +37,7 @@ #include <unistd.h> /* sysconf */ -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { loop->cf_state = NULL; if (uv__kqueue_init(loop)) diff --git a/deps/uv/src/unix/freebsd.c b/deps/uv/src/unix/freebsd.c index d87b74b9bc..2dbb1ec169 100644 --- a/deps/uv/src/unix/freebsd.c +++ b/deps/uv/src/unix/freebsd.c @@ -58,7 +58,7 @@ static char *process_title; -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { return uv__kqueue_init(loop); } diff --git a/deps/uv/src/unix/getaddrinfo.c b/deps/uv/src/unix/getaddrinfo.c index faf9add928..0d684e24e1 100644 --- a/deps/uv/src/unix/getaddrinfo.c +++ b/deps/uv/src/unix/getaddrinfo.c @@ -99,21 +99,17 @@ static void uv__getaddrinfo_work(struct uv__work* w) { int err; req = container_of(w, uv_getaddrinfo_t, work_req); - err = getaddrinfo(req->hostname, req->service, req->hints, &req->res); + err = getaddrinfo(req->hostname, req->service, req->hints, &req->addrinfo); req->retcode = uv__getaddrinfo_translate_error(err); } static void uv__getaddrinfo_done(struct uv__work* w, int status) { uv_getaddrinfo_t* req; - struct addrinfo *res; req = container_of(w, uv_getaddrinfo_t, work_req); uv__req_unregister(req->loop, req); - res = req->res; - req->res = NULL; - /* See initialization in uv_getaddrinfo(). */ if (req->hints) free(req->hints); @@ -133,7 +129,8 @@ static void uv__getaddrinfo_done(struct uv__work* w, int status) { req->retcode = UV_EAI_CANCELED; } - req->cb(req, req->retcode, res); + if (req->cb) + req->cb(req, req->retcode, req->addrinfo); } @@ -149,7 +146,7 @@ int uv_getaddrinfo(uv_loop_t* loop, size_t len; char* buf; - if (req == NULL || cb == NULL || (hostname == NULL && service == NULL)) + if (req == NULL || (hostname == NULL && service == NULL)) return -EINVAL; hostname_len = hostname ? strlen(hostname) + 1 : 0; @@ -163,7 +160,7 @@ int uv_getaddrinfo(uv_loop_t* loop, uv__req_init(loop, req, UV_GETADDRINFO); req->loop = loop; req->cb = cb; - req->res = NULL; + req->addrinfo = NULL; req->hints = NULL; req->service = NULL; req->hostname = NULL; @@ -185,12 +182,17 @@ int uv_getaddrinfo(uv_loop_t* loop, if (hostname) req->hostname = memcpy(buf + len, hostname, hostname_len); - uv__work_submit(loop, - &req->work_req, - uv__getaddrinfo_work, - uv__getaddrinfo_done); - - return 0; + if (cb) { + uv__work_submit(loop, + &req->work_req, + uv__getaddrinfo_work, + uv__getaddrinfo_done); + return 0; + } else { + uv__getaddrinfo_work(&req->work_req); + uv__getaddrinfo_done(&req->work_req, 0); + return req->retcode; + } } diff --git a/deps/uv/src/unix/getnameinfo.c b/deps/uv/src/unix/getnameinfo.c index c3fb9831c6..daa798a450 100644 --- a/deps/uv/src/unix/getnameinfo.c +++ b/deps/uv/src/unix/getnameinfo.c @@ -69,7 +69,8 @@ static void uv__getnameinfo_done(struct uv__work* w, int status) { service = req->service; } - req->getnameinfo_cb(req, req->retcode, host, service); + if (req->getnameinfo_cb) + req->getnameinfo_cb(req, req->retcode, host, service); } /* @@ -82,7 +83,7 @@ int uv_getnameinfo(uv_loop_t* loop, uv_getnameinfo_cb getnameinfo_cb, const struct sockaddr* addr, int flags) { - if (req == NULL || getnameinfo_cb == NULL || addr == NULL) + if (req == NULL || addr == NULL) return UV_EINVAL; if (addr->sa_family == AF_INET) { @@ -105,10 +106,15 @@ int uv_getnameinfo(uv_loop_t* loop, req->loop = loop; req->retcode = 0; - uv__work_submit(loop, - &req->work_req, - uv__getnameinfo_work, - uv__getnameinfo_done); - - return 0; + if (getnameinfo_cb) { + uv__work_submit(loop, + &req->work_req, + uv__getnameinfo_work, + uv__getnameinfo_done); + return 0; + } else { + uv__getnameinfo_work(&req->work_req); + uv__getnameinfo_done(&req->work_req, 0); + return req->retcode; + } } diff --git a/deps/uv/src/unix/internal.h b/deps/uv/src/unix/internal.h index 03a9226101..101dc74549 100644 --- a/deps/uv/src/unix/internal.h +++ b/deps/uv/src/unix/internal.h @@ -221,7 +221,7 @@ void uv__signal_loop_cleanup(uv_loop_t* loop); /* platform specific */ uint64_t uv__hrtime(uv_clocktype_t type); int uv__kqueue_init(uv_loop_t* loop); -int uv__platform_loop_init(uv_loop_t* loop, int default_loop); +int uv__platform_loop_init(uv_loop_t* loop); void uv__platform_loop_delete(uv_loop_t* loop); void uv__platform_invalidate_fd(uv_loop_t* loop, int fd); diff --git a/deps/uv/src/unix/linux-core.c b/deps/uv/src/unix/linux-core.c index d77b13fd6f..c1be21a8b4 100644 --- a/deps/uv/src/unix/linux-core.c +++ b/deps/uv/src/unix/linux-core.c @@ -74,7 +74,7 @@ static void read_speeds(unsigned int numcpus, uv_cpu_info_t* ci); static unsigned long read_cpufreq(unsigned int cpunum); -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { int fd; fd = uv__epoll_create1(UV__EPOLL_CLOEXEC); @@ -136,11 +136,14 @@ void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { void uv__io_poll(uv_loop_t* loop, int timeout) { + static int no_epoll_pwait; + static int no_epoll_wait; struct uv__epoll_event events[1024]; struct uv__epoll_event* pe; struct uv__epoll_event e; QUEUE* q; uv__io_t* w; + sigset_t sigset; uint64_t sigmask; uint64_t base; uint64_t diff; @@ -150,7 +153,6 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { int fd; int op; int i; - static int no_epoll_wait; if (loop->nfds == 0) { assert(QUEUE_EMPTY(&loop->watcher_queue)); @@ -193,31 +195,42 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { } sigmask = 0; - if (loop->flags & UV_LOOP_BLOCK_SIGPROF) + if (loop->flags & UV_LOOP_BLOCK_SIGPROF) { + sigemptyset(&sigset); + sigaddset(&sigset, SIGPROF); sigmask |= 1 << (SIGPROF - 1); + } assert(timeout >= -1); base = loop->time; count = 48; /* Benchmarks suggest this gives the best throughput. */ for (;;) { - if (no_epoll_wait || sigmask) { + if (sigmask != 0 && no_epoll_pwait != 0) + if (pthread_sigmask(SIG_BLOCK, &sigset, NULL)) + abort(); + + if (sigmask != 0 && no_epoll_pwait == 0) { nfds = uv__epoll_pwait(loop->backend_fd, events, ARRAY_SIZE(events), timeout, sigmask); + if (nfds == -1 && errno == ENOSYS) + no_epoll_pwait = 1; } else { nfds = uv__epoll_wait(loop->backend_fd, events, ARRAY_SIZE(events), timeout); - if (nfds == -1 && errno == ENOSYS) { + if (nfds == -1 && errno == ENOSYS) no_epoll_wait = 1; - continue; - } } + if (sigmask != 0 && no_epoll_pwait != 0) + if (pthread_sigmask(SIG_UNBLOCK, &sigset, NULL)) + abort(); + /* Update loop->time unconditionally. It's tempting to skip the update when * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the * operating system didn't reschedule our process while in the syscall. @@ -230,6 +243,12 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { } if (nfds == -1) { + if (errno == ENOSYS) { + /* epoll_wait() or epoll_pwait() failed, try the other system call. */ + assert(no_epoll_wait == 0 || no_epoll_pwait == 0); + continue; + } + if (errno != EINTR) abort(); diff --git a/deps/uv/src/unix/loop.c b/deps/uv/src/unix/loop.c index 616cf5bc43..7e167d049e 100644 --- a/deps/uv/src/unix/loop.c +++ b/deps/uv/src/unix/loop.c @@ -27,78 +27,7 @@ #include <string.h> #include <unistd.h> -static int uv__loop_init(uv_loop_t* loop, int default_loop); -static void uv__loop_close(uv_loop_t* loop); - -static uv_loop_t default_loop_struct; -static uv_loop_t* default_loop_ptr; - - -uv_loop_t* uv_default_loop(void) { - if (default_loop_ptr != NULL) - return default_loop_ptr; - - if (uv__loop_init(&default_loop_struct, /* default_loop? */ 1)) - return NULL; - - default_loop_ptr = &default_loop_struct; - return default_loop_ptr; -} - - int uv_loop_init(uv_loop_t* loop) { - return uv__loop_init(loop, /* default_loop? */ 0); -} - - -int uv_loop_close(uv_loop_t* loop) { - QUEUE* q; - uv_handle_t* h; - if (!QUEUE_EMPTY(&(loop)->active_reqs)) - return -EBUSY; - QUEUE_FOREACH(q, &loop->handle_queue) { - h = QUEUE_DATA(q, uv_handle_t, handle_queue); - if (!(h->flags & UV__HANDLE_INTERNAL)) - return -EBUSY; - } - uv__loop_close(loop); -#ifndef NDEBUG - memset(loop, -1, sizeof(*loop)); -#endif - if (loop == default_loop_ptr) - default_loop_ptr = NULL; - return 0; -} - - -uv_loop_t* uv_loop_new(void) { - uv_loop_t* loop; - - loop = malloc(sizeof(*loop)); - if (loop == NULL) - return NULL; - - if (uv_loop_init(loop)) { - free(loop); - return NULL; - } - - return loop; -} - - -void uv_loop_delete(uv_loop_t* loop) { - uv_loop_t* default_loop; - int err; - default_loop = default_loop_ptr; - err = uv_loop_close(loop); - assert(err == 0); - if (loop != default_loop) - free(loop); -} - - -static int uv__loop_init(uv_loop_t* loop, int default_loop) { int err; uv__signal_global_once_init(); @@ -130,7 +59,7 @@ static int uv__loop_init(uv_loop_t* loop, int default_loop) { loop->timer_counter = 0; loop->stop_flag = 0; - err = uv__platform_loop_init(loop, default_loop); + err = uv__platform_loop_init(loop); if (err) return err; @@ -155,7 +84,7 @@ static int uv__loop_init(uv_loop_t* loop, int default_loop) { } -static void uv__loop_close(uv_loop_t* loop) { +void uv__loop_close(uv_loop_t* loop) { uv__signal_loop_cleanup(loop); uv__platform_loop_delete(loop); uv__async_stop(loop, &loop->async_watcher); diff --git a/deps/uv/src/unix/netbsd.c b/deps/uv/src/unix/netbsd.c index de99d135f7..9eb0679de9 100644 --- a/deps/uv/src/unix/netbsd.c +++ b/deps/uv/src/unix/netbsd.c @@ -49,7 +49,7 @@ static char *process_title; -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { return uv__kqueue_init(loop); } diff --git a/deps/uv/src/unix/openbsd.c b/deps/uv/src/unix/openbsd.c index 3e7ae848ee..859bc0ccb1 100644 --- a/deps/uv/src/unix/openbsd.c +++ b/deps/uv/src/unix/openbsd.c @@ -47,7 +47,7 @@ static char *process_title; -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { return uv__kqueue_init(loop); } diff --git a/deps/uv/src/unix/pipe.c b/deps/uv/src/unix/pipe.c index ba833d3f54..bc8b856337 100644 --- a/deps/uv/src/unix/pipe.c +++ b/deps/uv/src/unix/pipe.c @@ -206,38 +206,56 @@ out: } -int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) { +typedef int (*uv__peersockfunc)(int, struct sockaddr*, socklen_t*); + + +static int uv__pipe_getsockpeername(const uv_pipe_t* handle, + uv__peersockfunc func, + char* buffer, + size_t* size) { struct sockaddr_un sa; socklen_t addrlen; int err; addrlen = sizeof(sa); memset(&sa, 0, addrlen); - err = getsockname(uv__stream_fd(handle), (struct sockaddr*) &sa, &addrlen); + err = func(uv__stream_fd(handle), (struct sockaddr*) &sa, &addrlen); if (err < 0) { - *len = 0; + *size = 0; return -errno; } +#if defined(__linux__) if (sa.sun_path[0] == 0) /* Linux abstract namespace */ addrlen -= offsetof(struct sockaddr_un, sun_path); else - addrlen = strlen(sa.sun_path) + 1; +#endif + addrlen = strlen(sa.sun_path); - if (addrlen > *len) { - *len = addrlen; + if (addrlen > *size) { + *size = addrlen; return UV_ENOBUFS; } - memcpy(buf, sa.sun_path, addrlen); - *len = addrlen; + memcpy(buffer, sa.sun_path, addrlen); + *size = addrlen; return 0; } +int uv_pipe_getsockname(const uv_pipe_t* handle, char* buffer, size_t* size) { + return uv__pipe_getsockpeername(handle, getsockname, buffer, size); +} + + +int uv_pipe_getpeername(const uv_pipe_t* handle, char* buffer, size_t* size) { + return uv__pipe_getsockpeername(handle, getpeername, buffer, size); +} + + void uv_pipe_pending_instances(uv_pipe_t* handle, int count) { } diff --git a/deps/uv/src/unix/poll.c b/deps/uv/src/unix/poll.c index a34a8d1e14..37da3b9585 100644 --- a/deps/uv/src/unix/poll.c +++ b/deps/uv/src/unix/poll.c @@ -51,6 +51,12 @@ static void uv__poll_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) { + int err; + + err = uv__nonblock(fd, 1); + if (err) + return err; + uv__handle_init(loop, (uv_handle_t*) handle, UV_POLL); uv__io_init(&handle->io_watcher, uv__poll_io, fd); handle->poll_cb = NULL; diff --git a/deps/uv/src/unix/sunos.c b/deps/uv/src/unix/sunos.c index ca183a6227..c41d0f0e52 100644 --- a/deps/uv/src/unix/sunos.c +++ b/deps/uv/src/unix/sunos.c @@ -62,7 +62,7 @@ #endif -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { int err; int fd; diff --git a/deps/uv/src/uv-common.c b/deps/uv/src/uv-common.c index f84f8c4ae1..791c09b4e2 100644 --- a/deps/uv/src/uv-common.c +++ b/deps/uv/src/uv-common.c @@ -359,22 +359,22 @@ int uv_send_buffer_size(uv_handle_t* handle, int *value) { return uv__socket_sockopt(handle, SO_SNDBUF, value); } -int uv_fs_event_getpath(uv_fs_event_t* handle, char* buf, size_t* len) { +int uv_fs_event_getpath(uv_fs_event_t* handle, char* buffer, size_t* size) { size_t required_len; if (!uv__is_active(handle)) { - *len = 0; + *size = 0; return UV_EINVAL; } - required_len = strlen(handle->path) + 1; - if (required_len > *len) { - *len = required_len; + required_len = strlen(handle->path); + if (required_len > *size) { + *size = required_len; return UV_ENOBUFS; } - memcpy(buf, handle->path, required_len); - *len = required_len; + memcpy(buffer, handle->path, required_len); + *size = required_len; return 0; } @@ -456,3 +456,73 @@ int uv_loop_configure(uv_loop_t* loop, uv_loop_option option, ...) { return err; } + + +static uv_loop_t default_loop_struct; +static uv_loop_t* default_loop_ptr; + + +uv_loop_t* uv_default_loop(void) { + if (default_loop_ptr != NULL) + return default_loop_ptr; + + if (uv_loop_init(&default_loop_struct)) + return NULL; + + default_loop_ptr = &default_loop_struct; + return default_loop_ptr; +} + + +uv_loop_t* uv_loop_new(void) { + uv_loop_t* loop; + + loop = malloc(sizeof(*loop)); + if (loop == NULL) + return NULL; + + if (uv_loop_init(loop)) { + free(loop); + return NULL; + } + + return loop; +} + + +int uv_loop_close(uv_loop_t* loop) { + QUEUE* q; + uv_handle_t* h; + + if (!QUEUE_EMPTY(&(loop)->active_reqs)) + return UV_EBUSY; + + QUEUE_FOREACH(q, &loop->handle_queue) { + h = QUEUE_DATA(q, uv_handle_t, handle_queue); + if (!(h->flags & UV__HANDLE_INTERNAL)) + return UV_EBUSY; + } + + uv__loop_close(loop); + +#ifndef NDEBUG + memset(loop, -1, sizeof(*loop)); +#endif + if (loop == default_loop_ptr) + default_loop_ptr = NULL; + + return 0; +} + + +void uv_loop_delete(uv_loop_t* loop) { + uv_loop_t* default_loop; + int err; + + default_loop = default_loop_ptr; + + err = uv_loop_close(loop); + assert(err == 0); + if (loop != default_loop) + free(loop); +} diff --git a/deps/uv/src/uv-common.h b/deps/uv/src/uv-common.h index 11e7fc395c..463cabac29 100644 --- a/deps/uv/src/uv-common.h +++ b/deps/uv/src/uv-common.h @@ -65,6 +65,8 @@ enum { int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap); +void uv__loop_close(uv_loop_t* loop); + int uv__tcp_bind(uv_tcp_t* tcp, const struct sockaddr* addr, unsigned int addrlen, diff --git a/deps/uv/src/win/core.c b/deps/uv/src/win/core.c index 2bef8b7f33..a101159438 100644 --- a/deps/uv/src/win/core.c +++ b/deps/uv/src/win/core.c @@ -184,19 +184,7 @@ void uv__once_init(void) { } -uv_loop_t* uv_default_loop(void) { - if (default_loop_ptr != NULL) - return default_loop_ptr; - - if (uv_loop_init(&default_loop_struct)) - return NULL; - - default_loop_ptr = &default_loop_struct; - return default_loop_ptr; -} - - -static void uv__loop_close(uv_loop_t* loop) { +void uv__loop_close(uv_loop_t* loop) { size_t i; /* close the async handle without needing an extra loop iteration */ @@ -221,57 +209,6 @@ static void uv__loop_close(uv_loop_t* loop) { } -int uv_loop_close(uv_loop_t* loop) { - QUEUE* q; - uv_handle_t* h; - if (!QUEUE_EMPTY(&(loop)->active_reqs)) - return UV_EBUSY; - QUEUE_FOREACH(q, &loop->handle_queue) { - h = QUEUE_DATA(q, uv_handle_t, handle_queue); - if (!(h->flags & UV__HANDLE_INTERNAL)) - return UV_EBUSY; - } - - uv__loop_close(loop); - -#ifndef NDEBUG - memset(loop, -1, sizeof(*loop)); -#endif - if (loop == default_loop_ptr) - default_loop_ptr = NULL; - - return 0; -} - - -uv_loop_t* uv_loop_new(void) { - uv_loop_t* loop; - - loop = (uv_loop_t*)malloc(sizeof(uv_loop_t)); - if (loop == NULL) { - return NULL; - } - - if (uv_loop_init(loop)) { - free(loop); - return NULL; - } - - return loop; -} - - -void uv_loop_delete(uv_loop_t* loop) { - uv_loop_t* default_loop; - int err; - default_loop = default_loop_ptr; - err = uv_loop_close(loop); - assert(err == 0); - if (loop != default_loop) - free(loop); -} - - int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap) { return UV_ENOSYS; } diff --git a/deps/uv/src/win/getaddrinfo.c b/deps/uv/src/win/getaddrinfo.c index 53a6084efe..f103f5fbd3 100644 --- a/deps/uv/src/win/getaddrinfo.c +++ b/deps/uv/src/win/getaddrinfo.c @@ -77,10 +77,13 @@ int uv__getaddrinfo_translate_error(int sys_err) { static void uv__getaddrinfo_work(struct uv__work* w) { uv_getaddrinfo_t* req; + struct addrinfoW* hints; int err; req = container_of(w, uv_getaddrinfo_t, work_req); - err = GetAddrInfoW(req->node, req->service, req->hints, &req->res); + hints = req->addrinfow; + req->addrinfow = NULL; + err = GetAddrInfoW(req->node, req->service, hints, &req->addrinfow); req->retcode = uv__getaddrinfo_translate_error(err); } @@ -115,17 +118,13 @@ static void uv__getaddrinfo_done(struct uv__work* w, int status) { if (status == UV_ECANCELED) { assert(req->retcode == 0); req->retcode = UV_EAI_CANCELED; - if (req->res != NULL) { - FreeAddrInfoW(req->res); - req->res = NULL; - } goto complete; } if (req->retcode == 0) { /* convert addrinfoW to addrinfo */ /* first calculate required length */ - addrinfow_ptr = req->res; + addrinfow_ptr = req->addrinfow; while (addrinfow_ptr != NULL) { addrinfo_len += addrinfo_struct_len + ALIGNED_SIZE(addrinfow_ptr->ai_addrlen); @@ -146,7 +145,7 @@ static void uv__getaddrinfo_done(struct uv__work* w, int status) { /* do conversions */ if (alloc_ptr != NULL) { cur_ptr = alloc_ptr; - addrinfow_ptr = req->res; + addrinfow_ptr = req->addrinfow; while (addrinfow_ptr != NULL) { /* copy addrinfo struct data */ @@ -196,22 +195,24 @@ static void uv__getaddrinfo_done(struct uv__work* w, int status) { addrinfo_ptr->ai_next = (struct addrinfo*)cur_ptr; } } + req->addrinfo = (struct addrinfo*)alloc_ptr; } else { req->retcode = UV_EAI_MEMORY; } } /* return memory to system */ - if (req->res != NULL) { - FreeAddrInfoW(req->res); - req->res = NULL; + if (req->addrinfow != NULL) { + FreeAddrInfoW(req->addrinfow); + req->addrinfow = NULL; } complete: uv__req_unregister(req->loop, req); /* finally do callback with converted result */ - req->getaddrinfo_cb(req, req->retcode, (struct addrinfo*)alloc_ptr); + if (req->getaddrinfo_cb) + req->getaddrinfo_cb(req, req->retcode, req->addrinfo); } @@ -250,8 +251,7 @@ int uv_getaddrinfo(uv_loop_t* loop, char* alloc_ptr = NULL; int err; - if (req == NULL || getaddrinfo_cb == NULL || - (node == NULL && service == NULL)) { + if (req == NULL || (node == NULL && service == NULL)) { err = WSAEINVAL; goto error; } @@ -259,7 +259,7 @@ int uv_getaddrinfo(uv_loop_t* loop, uv_req_init(loop, (uv_req_t*)req); req->getaddrinfo_cb = getaddrinfo_cb; - req->res = NULL; + req->addrinfo = NULL; req->type = UV_GETADDRINFO; req->loop = loop; req->retcode = 0; @@ -327,27 +327,32 @@ int uv_getaddrinfo(uv_loop_t* loop, /* copy hints to allocated memory and save pointer in req */ if (hints != NULL) { - req->hints = (struct addrinfoW*)alloc_ptr; - req->hints->ai_family = hints->ai_family; - req->hints->ai_socktype = hints->ai_socktype; - req->hints->ai_protocol = hints->ai_protocol; - req->hints->ai_flags = hints->ai_flags; - req->hints->ai_addrlen = 0; - req->hints->ai_canonname = NULL; - req->hints->ai_addr = NULL; - req->hints->ai_next = NULL; + req->addrinfow = (struct addrinfoW*)alloc_ptr; + req->addrinfow->ai_family = hints->ai_family; + req->addrinfow->ai_socktype = hints->ai_socktype; + req->addrinfow->ai_protocol = hints->ai_protocol; + req->addrinfow->ai_flags = hints->ai_flags; + req->addrinfow->ai_addrlen = 0; + req->addrinfow->ai_canonname = NULL; + req->addrinfow->ai_addr = NULL; + req->addrinfow->ai_next = NULL; } else { - req->hints = NULL; + req->addrinfow = NULL; } - uv__work_submit(loop, - &req->work_req, - uv__getaddrinfo_work, - uv__getaddrinfo_done); - uv__req_register(loop, req); - return 0; + if (getaddrinfo_cb) { + uv__work_submit(loop, + &req->work_req, + uv__getaddrinfo_work, + uv__getaddrinfo_done); + return 0; + } else { + uv__getaddrinfo_work(&req->work_req); + uv__getaddrinfo_done(&req->work_req, 0); + return req->retcode; + } error: if (req != NULL && req->alloc != NULL) { diff --git a/deps/uv/src/win/getnameinfo.c b/deps/uv/src/win/getnameinfo.c index 52cc790889..b1d045c79b 100644 --- a/deps/uv/src/win/getnameinfo.c +++ b/deps/uv/src/win/getnameinfo.c @@ -98,7 +98,8 @@ static void uv__getnameinfo_done(struct uv__work* w, int status) { service = req->service; } - req->getnameinfo_cb(req, req->retcode, host, service); + if (req->getnameinfo_cb) + req->getnameinfo_cb(req, req->retcode, host, service); } @@ -112,7 +113,7 @@ int uv_getnameinfo(uv_loop_t* loop, uv_getnameinfo_cb getnameinfo_cb, const struct sockaddr* addr, int flags) { - if (req == NULL || getnameinfo_cb == NULL || addr == NULL) + if (req == NULL || addr == NULL) return UV_EINVAL; if (addr->sa_family == AF_INET) { @@ -136,10 +137,15 @@ int uv_getnameinfo(uv_loop_t* loop, req->loop = loop; req->retcode = 0; - uv__work_submit(loop, - &req->work_req, - uv__getnameinfo_work, - uv__getnameinfo_done); - - return 0; + if (getnameinfo_cb) { + uv__work_submit(loop, + &req->work_req, + uv__getnameinfo_work, + uv__getnameinfo_done); + return 0; + } else { + uv__getnameinfo_work(&req->work_req); + uv__getnameinfo_done(&req->work_req, 0); + return req->retcode; + } } diff --git a/deps/uv/src/win/pipe.c b/deps/uv/src/win/pipe.c index c78051db7c..57fab065aa 100644 --- a/deps/uv/src/win/pipe.c +++ b/deps/uv/src/win/pipe.c @@ -1848,7 +1848,7 @@ static void eof_timer_cb(uv_timer_t* timer) { static void eof_timer_destroy(uv_pipe_t* pipe) { - assert(pipe->flags && UV_HANDLE_CONNECTION); + assert(pipe->flags & UV_HANDLE_CONNECTION); if (pipe->eof_timer) { uv_close((uv_handle_t*) pipe->eof_timer, eof_timer_close_cb); @@ -1910,7 +1910,7 @@ int uv_pipe_open(uv_pipe_t* pipe, uv_file file) { } -int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) { +static int uv__pipe_getname(const uv_pipe_t* handle, char* buffer, size_t* size) { NTSTATUS nt_status; IO_STATUS_BLOCK io_status; FILE_NAME_INFORMATION tmp_name_info; @@ -1924,7 +1924,7 @@ int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) { name_info = NULL; if (handle->handle == INVALID_HANDLE_VALUE) { - *len = 0; + *size = 0; return UV_EINVAL; } @@ -1939,7 +1939,7 @@ int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) { name_size = sizeof(*name_info) + tmp_name_info.FileNameLength; name_info = malloc(name_size); if (!name_info) { - *len = 0; + *size = 0; err = UV_ENOMEM; goto cleanup; } @@ -1952,7 +1952,7 @@ int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) { } if (nt_status != STATUS_SUCCESS) { - *len = 0; + *size = 0; err = uv_translate_sys_error(pRtlNtStatusToDosError(nt_status)); goto error; } @@ -1967,7 +1967,7 @@ int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) { } if (name_len == 0) { - *len = 0; + *size = 0; err = 0; goto error; } @@ -1984,34 +1984,33 @@ int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) { NULL, NULL); if (!addrlen) { - *len = 0; + *size = 0; err = uv_translate_sys_error(GetLastError()); goto error; - } else if (pipe_prefix_len + addrlen + 1 > *len) { - /* "\\\\.\\pipe" + name + '\0' */ - *len = pipe_prefix_len + addrlen + 1; + } else if (pipe_prefix_len + addrlen > *size) { + /* "\\\\.\\pipe" + name */ + *size = pipe_prefix_len + addrlen; err = UV_ENOBUFS; goto error; } - memcpy(buf, pipe_prefix, pipe_prefix_len); + memcpy(buffer, pipe_prefix, pipe_prefix_len); addrlen = WideCharToMultiByte(CP_UTF8, 0, name_buf, name_len, - buf+pipe_prefix_len, - *len-pipe_prefix_len, + buffer+pipe_prefix_len, + *size-pipe_prefix_len, NULL, NULL); if (!addrlen) { - *len = 0; + *size = 0; err = uv_translate_sys_error(GetLastError()); goto error; } addrlen += pipe_prefix_len; - buf[addrlen++] = '\0'; - *len = addrlen; + *size = addrlen; err = 0; goto cleanup; @@ -2032,6 +2031,32 @@ int uv_pipe_pending_count(uv_pipe_t* handle) { } +int uv_pipe_getsockname(const uv_pipe_t* handle, char* buffer, size_t* size) { + if (handle->flags & UV_HANDLE_BOUND) + return uv__pipe_getname(handle, buffer, size); + + if (handle->flags & UV_HANDLE_CONNECTION || + handle->handle != INVALID_HANDLE_VALUE) { + *size = 0; + return 0; + } + + return UV_EBADF; +} + + +int uv_pipe_getpeername(const uv_pipe_t* handle, char* buffer, size_t* size) { + /* emulate unix behaviour */ + if (handle->flags & UV_HANDLE_BOUND) + return UV_ENOTCONN; + + if (handle->handle != INVALID_HANDLE_VALUE) + return uv__pipe_getname(handle, buffer, size); + + return UV_EBADF; +} + + uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) { if (!handle->ipc) return UV_UNKNOWN_HANDLE; diff --git a/deps/uv/src/win/poll.c b/deps/uv/src/win/poll.c index 578d9fff17..4d8e1f99f6 100644 --- a/deps/uv/src/win/poll.c +++ b/deps/uv/src/win/poll.c @@ -505,6 +505,11 @@ int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, int len; SOCKET peer_socket, base_socket; DWORD bytes; + DWORD yes = 1; + + /* Set the socket to nonblocking mode */ + if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) + return uv_translate_sys_error(WSAGetLastError()); /* Try to obtain a base handle for the socket. This increases this chances */ /* that we find an AFD handle and are able to use the fast poll mechanism. */ |