summaryrefslogtreecommitdiff
path: root/deps/uv/src/unix
diff options
context:
space:
mode:
Diffstat (limited to 'deps/uv/src/unix')
-rw-r--r--deps/uv/src/unix/aix.c2
-rw-r--r--deps/uv/src/unix/darwin-proctitle.c5
-rw-r--r--deps/uv/src/unix/darwin.c2
-rw-r--r--deps/uv/src/unix/freebsd.c2
-rw-r--r--deps/uv/src/unix/getaddrinfo.c30
-rw-r--r--deps/uv/src/unix/getnameinfo.c22
-rw-r--r--deps/uv/src/unix/internal.h2
-rw-r--r--deps/uv/src/unix/linux-core.c33
-rw-r--r--deps/uv/src/unix/loop.c75
-rw-r--r--deps/uv/src/unix/netbsd.c2
-rw-r--r--deps/uv/src/unix/openbsd.c2
-rw-r--r--deps/uv/src/unix/pipe.c34
-rw-r--r--deps/uv/src/unix/poll.c6
-rw-r--r--deps/uv/src/unix/sunos.c2
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;