diff options
Diffstat (limited to 'deps/uv/src/unix')
-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 |
14 files changed, 101 insertions, 118 deletions
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; |