diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2011-10-04 16:53:17 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2011-10-04 16:53:20 -0700 |
commit | 627f379f2273341426ab3d5cb7eb4d5c148d500a (patch) | |
tree | 70e7a29423d2572db04fd16ce664396e9bbf0426 | |
parent | bc7cfd7cd7c2e513a9ac9a2820f3b6f7331735b5 (diff) | |
download | node-new-627f379f2273341426ab3d5cb7eb4d5c148d500a.tar.gz |
upgrade libuv to 0303197
30 files changed, 776 insertions, 209 deletions
diff --git a/deps/uv/config-unix.mk b/deps/uv/config-unix.mk index 59bf8f17f8..3453132ade 100644 --- a/deps/uv/config-unix.mk +++ b/deps/uv/config-unix.mk @@ -44,7 +44,7 @@ ifeq (SunOS,$(uname_S)) EV_CONFIG=config_sunos.h EIO_CONFIG=config_sunos.h CPPFLAGS += -Isrc/ares/config_sunos -D__EXTENSIONS__ -D_XOPEN_SOURCE=500 -LINKFLAGS+=-lsocket -lnsl +LINKFLAGS+=-lsocket -lnsl -lkstat OBJS += src/unix/sunos.o endif @@ -54,6 +54,7 @@ EIO_CONFIG=config_darwin.h CPPFLAGS += -Isrc/ares/config_darwin LINKFLAGS+=-framework CoreServices OBJS += src/unix/darwin.o +OBJS += src/unix/kqueue.o endif ifeq (Linux,$(uname_S)) @@ -71,6 +72,7 @@ EIO_CONFIG=config_freebsd.h CPPFLAGS += -Isrc/ares/config_freebsd LINKFLAGS+= OBJS += src/unix/freebsd.o +OBJS += src/unix/kqueue.o endif ifeq (NetBSD,$(uname_S)) @@ -79,6 +81,7 @@ EIO_CONFIG=config_netbsd.h CPPFLAGS += -Isrc/ares/config_netbsd LINKFLAGS+= OBJS += src/unix/netbsd.o +OBJS += src/unix/kqueue.o endif ifneq (,$(findstring CYGWIN,$(uname_S))) diff --git a/deps/uv/include/uv-private/ev.h b/deps/uv/include/uv-private/ev.h index 1db1e26649..5d2d7a1e37 100644 --- a/deps/uv/include/uv-private/ev.h +++ b/deps/uv/include/uv-private/ev.h @@ -207,6 +207,7 @@ enum { EV_NONE = 0x00, /* no events */ EV_READ = 0x01, /* ev_io detected read will not block */ EV_WRITE = 0x02, /* ev_io detected write will not block */ + EV_LIBUV_KQUEUE_HACK = 0x40, EV__IOFDSET = 0x80, /* internal use only */ EV_IO = EV_READ, /* alias for type-detection */ EV_TIMER = 0x00000100, /* timer timed out */ diff --git a/deps/uv/include/uv-private/uv-unix.h b/deps/uv/include/uv-private/uv-unix.h index be2abcd94a..1b6d86df60 100644 --- a/deps/uv/include/uv-private/uv-unix.h +++ b/deps/uv/include/uv-private/uv-unix.h @@ -27,10 +27,6 @@ #include "ev.h" #include "eio.h" -#if defined(__linux__) -#include "uv-private/uv-linux.h" -#endif - #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> @@ -47,11 +43,6 @@ typedef struct { typedef int uv_file; -/* Stub. Remove it once all platforms support the file watcher API. */ -#ifndef UV_FS_EVENT_PRIVATE_FIELDS -#define UV_FS_EVENT_PRIVATE_FIELDS /* empty */ -#endif - #define UV_LOOP_PRIVATE_FIELDS \ ares_channel channel; \ /* \ @@ -188,4 +179,28 @@ typedef int uv_file; struct termios orig_termios; \ int mode; +/* UV_FS_EVENT_PRIVATE_FIELDS */ +#if defined(__linux__) + +#define UV_FS_EVENT_PRIVATE_FIELDS \ + ev_io read_watcher; \ + uv_fs_event_cb cb; \ + +#elif (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) \ + || defined(__FreeBSD__) \ + || defined(__OpenBSD__) \ + || defined(__NetBSD__) + +#define UV_FS_EVENT_PRIVATE_FIELDS \ + ev_io event_watcher; \ + uv_fs_event_cb cb; \ + int fflags; \ + +#else + +/* Stub for platforms where the file watcher isn't implemented yet. */ +#define UV_FS_EVENT_PRIVATE_FIELDS + +#endif + #endif /* UV_UNIX_H */ diff --git a/deps/uv/include/uv.h b/deps/uv/include/uv.h index 348abe3f60..824b3c4178 100644 --- a/deps/uv/include/uv.h +++ b/deps/uv/include/uv.h @@ -1044,6 +1044,9 @@ struct uv_fs_event_s { }; +/* Gets load avg */ +void uv_loadavg(double avg[3]); + /* * If filename is a directory then we will watch for all events in that * directory. If filename is a file - we will only get events from that @@ -1065,6 +1068,10 @@ int uv_ip6_name(struct sockaddr_in6* src, char* dst, size_t size); /* Gets the executable path */ int uv_exepath(char* buffer, size_t* size); +/* Memory info */ +double uv_get_free_memory(void); +double uv_get_total_memory(void); + /* * Returns the current high-resolution real time. This is expressed in * nanoseconds. It is relative to an arbitrary time in the past. It is not diff --git a/deps/uv/src/unix/core.c b/deps/uv/src/unix/core.c index 8c065ad218..719327a9c5 100644 --- a/deps/uv/src/unix/core.c +++ b/deps/uv/src/unix/core.c @@ -172,7 +172,7 @@ void uv_loop_delete(uv_loop_t* loop) { uv_loop_t* uv_default_loop() { if (!default_loop_ptr) { default_loop_ptr = &default_loop_struct; -#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 +#if HAVE_KQUEUE default_loop_struct.ev = ev_default_loop(EVBACKEND_KQUEUE); #else default_loop_struct.ev = ev_default_loop(EVFLAG_AUTO); diff --git a/deps/uv/src/unix/cygwin.c b/deps/uv/src/unix/cygwin.c index 91681248e9..bafe83bfb3 100644 --- a/deps/uv/src/unix/cygwin.c +++ b/deps/uv/src/unix/cygwin.c @@ -36,6 +36,11 @@ uint64_t uv_hrtime() { return (ts.tv_sec * NANOSEC + ts.tv_nsec); } +void uv_loadavg(double avg[3]) { + /* Unsupported as of cygwin 1.7.7 */ + avg[0] = avg[1] = avg[2] = 0; +} + int uv_exepath(char* buffer, size_t* size) { uint32_t usize; @@ -53,6 +58,13 @@ int uv_exepath(char* buffer, size_t* size) { return 0; } +double uv_get_free_memory(void) { + return (double) sysconf(_SC_PAGESIZE) * sysconf(_SC_AVPHYS_PAGES); +} + +double uv_get_total_memory(void) { + return (double) sysconf(_SC_PAGESIZE) * sysconf(_SC_PHYS_PAGES); +} int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle, diff --git a/deps/uv/src/unix/darwin.c b/deps/uv/src/unix/darwin.c index fde515444b..a518cb265e 100644 --- a/deps/uv/src/unix/darwin.c +++ b/deps/uv/src/unix/darwin.c @@ -29,6 +29,9 @@ #include <mach/mach.h> #include <mach/mach_time.h> #include <mach-o/dyld.h> /* _NSGetExecutablePath */ +#include <sys/resource.h> +#include <sys/sysctl.h> +#include <unistd.h> /* sysconf */ uint64_t uv_hrtime() { @@ -68,16 +71,38 @@ int uv_exepath(char* buffer, size_t* size) { return 0; } +double uv_get_free_memory(void) { + vm_statistics_data_t info; + mach_msg_type_number_t count = sizeof(info) / sizeof(integer_t); -int uv_fs_event_init(uv_loop_t* loop, - uv_fs_event_t* handle, - const char* filename, - uv_fs_event_cb cb) { - uv__set_sys_error(loop, ENOSYS); - return -1; + if (host_statistics(mach_host_self(), HOST_VM_INFO, + (host_info_t)&info, &count) != KERN_SUCCESS) { + return -1; + } + + return (double) info.free_count * sysconf(_SC_PAGESIZE); +} + +double uv_get_total_memory(void) { + uint64_t info; + int which[] = {CTL_HW, HW_MEMSIZE}; + size_t size = sizeof(info); + + if (sysctl(which, 2, &info, &size, NULL, 0) < 0) { + return -1; + } + + return (double) info; } +void uv_loadavg(double avg[3]) { + struct loadavg info; + size_t size = sizeof(info); + int which[] = {CTL_VM, VM_LOADAVG}; + + if (sysctl(which, 2, &info, &size, NULL, 0) < 0) return; -void uv__fs_event_destroy(uv_fs_event_t* handle) { - assert(0 && "implement me"); + avg[0] = (double) info.ldavg[0] / info.fscale; + avg[1] = (double) info.ldavg[1] / info.fscale; + avg[2] = (double) info.ldavg[2] / info.fscale; } diff --git a/deps/uv/src/unix/ev/ev.c b/deps/uv/src/unix/ev/ev.c index 5e616c254f..a3bec43fbe 100644 --- a/deps/uv/src/unix/ev/ev.c +++ b/deps/uv/src/unix/ev/ev.c @@ -2663,7 +2663,8 @@ ev_io_start (EV_P_ ev_io *w) return; assert (("libev: ev_io_start called with negative fd", fd >= 0)); - assert (("libev: ev_io_start called with illegal event mask", !(w->events & ~(EV__IOFDSET | EV_READ | EV_WRITE)))); + assert (("libev: ev_io_start called with illegal event mask", + !(w->events & ~(EV__IOFDSET | EV_READ | EV_WRITE | EV_LIBUV_KQUEUE_HACK)))); EV_FREQUENT_CHECK; diff --git a/deps/uv/src/unix/ev/ev_kqueue.c b/deps/uv/src/unix/ev/ev_kqueue.c index 1b526d1c7b..212ca29ae6 100644 --- a/deps/uv/src/unix/ev/ev_kqueue.c +++ b/deps/uv/src/unix/ev/ev_kqueue.c @@ -43,6 +43,9 @@ #include <string.h> #include <errno.h> +extern void +uv__kqueue_hack (EV_P_ int fflags, ev_io *w); + void inline_speed kqueue_change (EV_P_ int fd, int filter, int flags, int fflags) { @@ -80,6 +83,10 @@ kqueue_modify (EV_P_ int fd, int oev, int nev) if (nev & EV_WRITE) kqueue_change (EV_A_ fd, EVFILT_WRITE, EV_ADD | EV_ENABLE, NOTE_EOF); + + if (nev & EV_LIBUV_KQUEUE_HACK) + kqueue_change (EV_A_ fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_ONESHOT, + NOTE_ATTRIB | NOTE_WRITE | NOTE_RENAME | NOTE_DELETE | NOTE_EXTEND | NOTE_REVOKE); } static void @@ -114,6 +121,13 @@ kqueue_poll (EV_P_ ev_tstamp timeout) { int fd = kqueue_events [i].ident; + if (kqueue_events [i].filter == EVFILT_VNODE) + { + /* pass kqueue filter flags to libuv */ + ev_io *w = (ev_io *)(anfds [fd].head); + uv__kqueue_hack (EV_A_ kqueue_events [i].fflags, w); + } + if (expect_false (kqueue_events [i].flags & EV_ERROR)) { int err = kqueue_events [i].data; @@ -140,6 +154,7 @@ kqueue_poll (EV_P_ ev_tstamp timeout) fd, kqueue_events [i].filter == EVFILT_READ ? EV_READ : kqueue_events [i].filter == EVFILT_WRITE ? EV_WRITE + : kqueue_events [i].filter == EVFILT_VNODE ? EV_LIBUV_KQUEUE_HACK : 0 ); } diff --git a/deps/uv/src/unix/freebsd.c b/deps/uv/src/unix/freebsd.c index cd1959a48b..49aeb95ec8 100644 --- a/deps/uv/src/unix/freebsd.c +++ b/deps/uv/src/unix/freebsd.c @@ -25,6 +25,7 @@ #include <errno.h> #include <sys/types.h> +#include <sys/resource.h> #include <sys/sysctl.h> #include <time.h> @@ -67,16 +68,39 @@ int uv_exepath(char* buffer, size_t* size) { return 0; } +double uv_get_free_memory(void) { + vm_statistics_data_t info; + mach_msg_type_number_t count = sizeof(info) / sizeof(integer_t); -int uv_fs_event_init(uv_loop_t* loop, - uv_fs_event_t* handle, - const char* filename, - uv_fs_event_cb cb) { - uv__set_sys_error(loop, ENOSYS); - return -1; + if (host_statistics(mach_host_self(), HOST_VM_INFO, + (host_info_t)&info, &count) != KERN_SUCCESS) { + return -1; + } + + return (double) info.free_count * sysconf(_SC_PAGESIZE); } +double uv_get_total_memory(void) { + unsigned long info; + int which[] = {CTL_HW, HW_PHYSMEM}; + + size_t size = sizeof(info); + + if (sysctl(which, 2, &info, &size, NULL, 0) < 0) { + return -1; + } + + return (double) info; +} + +void uv_loadavg(double avg[3]) { + struct loadavg info; + size_t size = sizeof(info); + int which[] = {CTL_VM, VM_LOADAVG}; + + if (sysctl(which, 2, &info, &size, NULL, 0) < 0) return; -void uv__fs_event_destroy(uv_fs_event_t* handle) { - assert(0 && "implement me"); + avg[0] = (double) info.ldavg[0] / info.fscale; + avg[1] = (double) info.ldavg[1] / info.fscale; + avg[2] = (double) info.ldavg[2] / info.fscale; } diff --git a/deps/uv/src/unix/internal.h b/deps/uv/src/unix/internal.h index a10cd3d00c..7200e33df3 100644 --- a/deps/uv/src/unix/internal.h +++ b/deps/uv/src/unix/internal.h @@ -32,33 +32,37 @@ #include <linux/version.h> #include <features.h> -#undef HAVE_FUTIMES -#undef HAVE_PIPE2 -#undef HAVE_ACCEPT4 - /* futimes() requires linux >= 2.6.22 and glib >= 2.6 */ #if LINUX_VERSION_CODE >= 0x20616 && __GLIBC_PREREQ(2, 6) -#define HAVE_FUTIMES +#define HAVE_FUTIMES 1 #endif /* pipe2() requires linux >= 2.6.27 and glibc >= 2.9 */ #if LINUX_VERSION_CODE >= 0x2061B && __GLIBC_PREREQ(2, 9) -#define HAVE_PIPE2 +#define HAVE_PIPE2 1 #endif /* accept4() requires linux >= 2.6.28 and glib >= 2.10 */ #if LINUX_VERSION_CODE >= 0x2061C && __GLIBC_PREREQ(2, 10) -#define HAVE_ACCEPT4 +#define HAVE_ACCEPT4 1 #endif #endif /* __linux__ */ #ifdef __APPLE__ -# define HAVE_FUTIMES +# define HAVE_FUTIMES 1 #endif #ifdef __FreeBSD__ -# define HAVE_FUTIMES +# define HAVE_FUTIMES 1 +#endif + +/* FIXME exact copy of the #ifdef guard in uv-unix.h */ +#if (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) \ + || defined(__FreeBSD__) \ + || defined(__OpenBSD__) \ + || defined(__NetBSD__) +# define HAVE_KQUEUE 1 #endif #define container_of(ptr, type, member) \ diff --git a/deps/uv/src/unix/kqueue.c b/deps/uv/src/unix/kqueue.c new file mode 100644 index 0000000000..924865bdff --- /dev/null +++ b/deps/uv/src/unix/kqueue.c @@ -0,0 +1,121 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include <assert.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#include <sys/sysctl.h> +#include <sys/types.h> +#include <sys/event.h> +#include <fcntl.h> +#include <time.h> + +static void uv__fs_event(EV_P_ ev_io* w, int revents); + + +static void uv__fs_event_start(uv_fs_event_t* handle) { + ev_io_init(&handle->event_watcher, + uv__fs_event, + handle->fd, + EV_LIBUV_KQUEUE_HACK); + ev_io_start(handle->loop->ev, &handle->event_watcher); +} + + +static void uv__fs_event_stop(uv_fs_event_t* handle) { + ev_io_stop(handle->loop->ev, &handle->event_watcher); +} + + +static void uv__fs_event(EV_P_ ev_io* w, int revents) { + uv_fs_event_t* handle; + int events; + + assert(revents == EV_LIBUV_KQUEUE_HACK); + + handle = container_of(w, uv_fs_event_t, event_watcher); + + if (handle->fflags & (NOTE_ATTRIB | NOTE_EXTEND)) + events = UV_CHANGE; + else + events = UV_RENAME; + + handle->cb(handle, NULL, events, 0); + + uv__fs_event_stop(handle); + + /* File watcher operates in one-shot mode, re-arm it. */ + if (handle->fd != -1) + uv__fs_event_start(handle); +} + + +/* Called by libev, don't touch. */ +void uv__kqueue_hack(EV_P_ int fflags, ev_io *w) { + uv_fs_event_t* handle; + + handle = container_of(w, uv_fs_event_t, event_watcher); + handle->fflags = fflags; +} + + +int uv_fs_event_init(uv_loop_t* loop, + uv_fs_event_t* handle, + const char* filename, + uv_fs_event_cb cb) { +#if HAVE_KQUEUE + int fd; + + if (cb == NULL) { + uv__set_sys_error(loop, EINVAL); + return -1; + } + + /* TODO open asynchronously - but how do we report back errors? */ + if ((fd = open(filename, O_RDONLY)) == -1) { + uv__set_sys_error(loop, errno); + return -1; + } + + uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); + handle->filename = strdup(filename); + handle->fflags = 0; + handle->cb = cb; + handle->fd = fd; + uv__fs_event_start(handle); + + return 0; +#else + uv__set_sys_error(loop, ENOSYS); + return -1; +#endif +} + + +void uv__fs_event_destroy(uv_fs_event_t* handle) { + free(handle->filename); + uv__close(handle->fd); + handle->fd = -1; +} diff --git a/deps/uv/src/unix/linux.c b/deps/uv/src/unix/linux.c index dd93e595e0..e37983d115 100644 --- a/deps/uv/src/unix/linux.c +++ b/deps/uv/src/unix/linux.c @@ -28,6 +28,7 @@ #include <errno.h> #include <sys/inotify.h> +#include <sys/sysinfo.h> #include <unistd.h> #include <time.h> @@ -52,6 +53,16 @@ uint64_t uv_hrtime() { return (ts.tv_sec * NANOSEC + ts.tv_nsec); } +void uv_loadavg(double avg[3]) { + struct sysinfo info; + + if (sysinfo(&info) < 0) return; + + avg[0] = (double) info.loads[0] / 65536.0; + avg[1] = (double) info.loads[1] / 65536.0; + avg[2] = (double) info.loads[2] / 65536.0; +} + int uv_exepath(char* buffer, size_t* size) { if (!buffer || !size) { @@ -64,6 +75,13 @@ int uv_exepath(char* buffer, size_t* size) { return 0; } +double uv_get_free_memory(void) { + return (double) sysconf(_SC_PAGESIZE) * sysconf(_SC_AVPHYS_PAGES); +} + +double uv_get_total_memory(void) { + return (double) sysconf(_SC_PAGESIZE) * sysconf(_SC_PHYS_PAGES); +} static int new_inotify_fd(void) { #if defined(IN_NONBLOCK) && defined(IN_CLOEXEC) diff --git a/deps/uv/src/unix/netbsd.c b/deps/uv/src/unix/netbsd.c index 0483b5e64f..ff42e8ce99 100644 --- a/deps/uv/src/unix/netbsd.c +++ b/deps/uv/src/unix/netbsd.c @@ -24,6 +24,7 @@ #include <string.h> #include <errno.h> +#include <sys/resource.h> #include <sys/types.h> #include <sys/sysctl.h> @@ -40,6 +41,17 @@ uint64_t uv_hrtime(void) { return (ts.tv_sec * NANOSEC + ts.tv_nsec); } +void uv_loadavg(double avg[3]) { + struct loadavg info; + size_t size = sizeof(info); + int which[] = {CTL_VM, VM_LOADAVG}; + + if (sysctl(which, 2, &info, &size, NULL, 0) < 0) return; + + avg[0] = (double) info.ldavg[0] / info.fscale; + avg[1] = (double) info.ldavg[1] / info.fscale; + avg[2] = (double) info.ldavg[2] / info.fscale; +} int uv_exepath(char* buffer, size_t* size) { uint32_t usize; @@ -70,16 +82,31 @@ int uv_exepath(char* buffer, size_t* size) { return 0; } +double uv_get_free_memory(void) { + struct uvmexp info; + size_t size = sizeof(info); + int which[] = {CTL_VM, VM_UVMEXP}; + + if (sysctl(which, 2, &info, &size, NULL, 0) < 0) { + return -1; + } -int uv_fs_event_init(uv_loop_t* loop, - uv_fs_event_t* handle, - const char* filename, - uv_fs_event_cb cb) { - uv__set_sys_error(loop, ENOSYS); - return -1; + return (double) info.free * psysconf(_SC_PAGESIZE); } +double uv_get_total_memory(void) { +#if defined(HW_PHYSMEM64) + uint64_t info; + int which[] = {CTL_HW, HW_PHYSMEM64}; +#else + unsigned int info; + int which[] = {CTL_HW, HW_PHYSMEM}; +#endif + size_t size = sizeof(info); + + if (sysctl(which, 2, &info, &size, NULL, 0) < 0) { + return -1; + } -void uv__fs_event_destroy(uv_fs_event_t* handle) { - assert(0 && "implement me"); + return (double) info; } diff --git a/deps/uv/src/unix/sunos.c b/deps/uv/src/unix/sunos.c index d80631ea56..554f15cda9 100644 --- a/deps/uv/src/unix/sunos.c +++ b/deps/uv/src/unix/sunos.c @@ -19,6 +19,7 @@ */ #include "uv.h" +#include "internal.h" #include <stdio.h> #include <stdint.h> @@ -26,7 +27,9 @@ #include <errno.h> #include <sys/time.h> +#include <sys/loadavg.h> #include <unistd.h> +#include <kstat.h> uint64_t uv_hrtime() { @@ -62,6 +65,39 @@ int uv_exepath(char* buffer, size_t* size) { return (0); } +double uv_get_free_memory(void) { + kstat_ctl_t *kc; + kstat_t *ksp; + kstat_named_t *knp; + + ulong_t freemem; + + if ((kc = kstat_open()) == NULL) return -1; + + ksp = kstat_lookup(kc, (char *)"unix", 0, (char *)"system_pages"); + + if(kstat_read(kc, ksp, NULL) == -1){ + return -1; + } + else { + knp = (kstat_named_t *) kstat_data_lookup(ksp, (char *)"freemem"); + freemem = knp->value.ul; + } + + kstat_close(kc); + + return (double) freemem * sysconf(_SC_PAGESIZE); +} + + +double uv_get_total_memory(void) { + return (double) sysconf(_SC_PAGESIZE) * sysconf(_SC_PHYS_PAGES); +} + +void uv_loadavg(double avg[3]) { + (void) getloadavg(avg, 3); +} + int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle, diff --git a/deps/uv/src/unix/tcp.c b/deps/uv/src/unix/tcp.c index 162dcce0fc..8695a9809a 100644 --- a/deps/uv/src/unix/tcp.c +++ b/deps/uv/src/unix/tcp.c @@ -33,10 +33,10 @@ int uv_tcp_init(uv_loop_t* loop, uv_tcp_t* tcp) { } -static int uv__tcp_bind(uv_tcp_t* tcp, - int domain, - struct sockaddr* addr, - int addrsize) { +static int uv__bind(uv_tcp_t* tcp, + int domain, + struct sockaddr* addr, + int addrsize) { int saved_errno; int status; @@ -76,29 +76,19 @@ out: } -int uv_tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) { - if (handle->type != UV_TCP || addr.sin_family != AF_INET) { - uv__set_sys_error(handle->loop, EFAULT); - return -1; - } - - return uv__tcp_bind(handle, - AF_INET, - (struct sockaddr*)&addr, - sizeof(struct sockaddr_in)); +int uv__tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) { + return uv__bind(handle, + AF_INET, + (struct sockaddr*)&addr, + sizeof(struct sockaddr_in)); } -int uv_tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) { - if (handle->type != UV_TCP || addr.sin6_family != AF_INET6) { - uv__set_sys_error(handle->loop, EFAULT); - return -1; - } - - return uv__tcp_bind(handle, - AF_INET6, - (struct sockaddr*)&addr, - sizeof(struct sockaddr_in6)); +int uv__tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) { + return uv__bind(handle, + AF_INET6, + (struct sockaddr*)&addr, + sizeof(struct sockaddr_in6)); } @@ -216,55 +206,37 @@ int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) { } -int uv_tcp_connect(uv_connect_t* req, +int uv__tcp_connect(uv_connect_t* req, uv_tcp_t* handle, struct sockaddr_in address, uv_connect_cb cb) { - int saved_errno; + int saved_errno = errno; int status; - saved_errno = errno; - status = -1; - - if (handle->type != UV_TCP || address.sin_family != AF_INET) { - uv__set_sys_error(handle->loop, EINVAL); - goto out; - } - status = uv__connect(req, (uv_stream_t*)handle, (struct sockaddr*)&address, sizeof address, cb); -out: errno = saved_errno; return status; } -int uv_tcp_connect6(uv_connect_t* req, +int uv__tcp_connect6(uv_connect_t* req, uv_tcp_t* handle, struct sockaddr_in6 address, uv_connect_cb cb) { - int saved_errno; + int saved_errno = errno; int status; - saved_errno = errno; - status = -1; - - if (handle->type != UV_TCP || address.sin6_family != AF_INET6) { - uv__set_sys_error(handle->loop, EINVAL); - goto out; - } - status = uv__connect(req, (uv_stream_t*)handle, (struct sockaddr*)&address, sizeof address, cb); -out: errno = saved_errno; return status; } diff --git a/deps/uv/src/unix/udp.c b/deps/uv/src/unix/udp.c index e8a772af71..0fbd18bc8e 100644 --- a/deps/uv/src/unix/udp.c +++ b/deps/uv/src/unix/udp.c @@ -34,8 +34,6 @@ static void uv__udp_run_pending(uv_udp_t* handle); static void uv__udp_recvmsg(uv_udp_t* handle); static void uv__udp_sendmsg(uv_udp_t* handle); static void uv__udp_io(EV_P_ ev_io* w, int events); -static int uv__udp_bind(uv_udp_t* handle, int domain, struct sockaddr* addr, - socklen_t len, unsigned flags); static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, int domain); static int uv__udp_send(uv_udp_send_t* req, uv_udp_t* handle, uv_buf_t bufs[], int bufcnt, struct sockaddr* addr, socklen_t addrlen, uv_udp_send_cb send_cb); @@ -289,11 +287,11 @@ static void uv__udp_io(EV_P_ ev_io* w, int events) { } -static int uv__udp_bind(uv_udp_t* handle, - int domain, - struct sockaddr* addr, - socklen_t len, - unsigned flags) { +static int uv__bind(uv_udp_t* handle, + int domain, + struct sockaddr* addr, + socklen_t len, + unsigned flags) { int saved_errno; int status; int yes; @@ -389,7 +387,7 @@ static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, int domain) { abort(); } - return uv__udp_bind(handle, domain, (struct sockaddr*)&taddr, addrlen, 0); + return uv__bind(handle, domain, (struct sockaddr*)&taddr, addrlen, 0); } @@ -443,31 +441,21 @@ int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) { } -int uv_udp_bind(uv_udp_t* handle, struct sockaddr_in addr, unsigned flags) { - if (handle->type != UV_UDP || addr.sin_family != AF_INET) { - uv__set_sys_error(handle->loop, EFAULT); - return -1; - } - - return uv__udp_bind(handle, - AF_INET, - (struct sockaddr*)&addr, - sizeof addr, - flags); +int uv__udp_bind(uv_udp_t* handle, struct sockaddr_in addr, unsigned flags) { + return uv__bind(handle, + AF_INET, + (struct sockaddr*)&addr, + sizeof addr, + flags); } -int uv_udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags) { - if (handle->type != UV_UDP || addr.sin6_family != AF_INET6) { - uv__set_sys_error(handle->loop, EFAULT); - return -1; - } - - return uv__udp_bind(handle, - AF_INET6, - (struct sockaddr*)&addr, - sizeof addr, - flags); +int uv__udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags) { + return uv__bind(handle, + AF_INET6, + (struct sockaddr*)&addr, + sizeof addr, + flags); } diff --git a/deps/uv/src/uv-common.c b/deps/uv/src/uv-common.c index dddcd8b32d..b97aac3b10 100644 --- a/deps/uv/src/uv-common.c +++ b/deps/uv/src/uv-common.c @@ -206,3 +206,65 @@ void uv_remove_ares_handle(uv_ares_task_t* handle) { int uv_ares_handles_empty(uv_loop_t* loop) { return loop->uv_ares_handles_ ? 0 : 1; } + +int uv_tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) { + if (handle->type != UV_TCP || addr.sin_family != AF_INET) { + uv__set_artificial_error(handle->loop, UV_EFAULT); + return -1; + } + + return uv__tcp_bind(handle, addr); +} + +int uv_tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) { + if (handle->type != UV_TCP || addr.sin6_family != AF_INET6) { + uv__set_artificial_error(handle->loop, UV_EFAULT); + return -1; + } + + return uv__tcp_bind6(handle, addr); +} + +int uv_udp_bind(uv_udp_t* handle, struct sockaddr_in addr, + unsigned int flags) { + if (handle->type != UV_UDP || addr.sin_family != AF_INET) { + uv__set_artificial_error(handle->loop, UV_EFAULT); + return -1; + } + + return uv__udp_bind(handle, addr, flags); +} + +int uv_udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, + unsigned int flags) { + if (handle->type != UV_UDP || addr.sin6_family != AF_INET6) { + uv__set_artificial_error(handle->loop, UV_EFAULT); + return -1; + } + + return uv__udp_bind6(handle, addr, flags); +} + +int uv_tcp_connect(uv_connect_t* req, + uv_tcp_t* handle, + struct sockaddr_in address, + uv_connect_cb cb) { + if (handle->type != UV_TCP || address.sin_family != AF_INET) { + uv__set_artificial_error(handle->loop, UV_EINVAL); + return -1; + } + + return uv__tcp_connect(req, handle, address, cb); +} + +int uv_tcp_connect6(uv_connect_t* req, + uv_tcp_t* handle, + struct sockaddr_in6 address, + uv_connect_cb cb) { + if (handle->type != UV_TCP || address.sin6_family != AF_INET6) { + uv__set_artificial_error(handle->loop, UV_EINVAL); + return -1; + } + + return uv__tcp_connect6(req, handle, address, cb); +} diff --git a/deps/uv/src/uv-common.h b/deps/uv/src/uv-common.h index f534d0e197..ff81e0dc0a 100644 --- a/deps/uv/src/uv-common.h +++ b/deps/uv/src/uv-common.h @@ -53,4 +53,21 @@ void uv__set_error(uv_loop_t* loop, uv_err_code code, int sys_error); void uv__set_sys_error(uv_loop_t* loop, int sys_error); void uv__set_artificial_error(uv_loop_t* loop, uv_err_code code); +int uv__tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr); +int uv__tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr); + +int uv__udp_bind(uv_udp_t* handle, struct sockaddr_in addr, unsigned flags); +int uv__udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags); + +int uv__tcp_connect(uv_connect_t* req, + uv_tcp_t* handle, + struct sockaddr_in address, + uv_connect_cb cb); + +int uv__tcp_connect6(uv_connect_t* req, + uv_tcp_t* handle, + struct sockaddr_in6 address, + uv_connect_cb cb); + + #endif /* UV_COMMON_H_ */ diff --git a/deps/uv/src/win/tcp.c b/deps/uv/src/win/tcp.c index d7a126e981..ee95aa1110 100644 --- a/deps/uv/src/win/tcp.c +++ b/deps/uv/src/win/tcp.c @@ -154,8 +154,10 @@ void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle) { } -static int uv__bind(uv_loop_t* loop, uv_tcp_t* handle, int domain, - struct sockaddr* addr, int addrsize) { +static int uv__bind(uv_tcp_t* handle, + int domain, + struct sockaddr* addr, + int addrsize) { DWORD err; int r; SOCKET sock; @@ -163,11 +165,11 @@ static int uv__bind(uv_loop_t* loop, uv_tcp_t* handle, int domain, if (handle->socket == INVALID_SOCKET) { sock = socket(domain, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { - uv__set_sys_error(loop, WSAGetLastError()); + uv__set_sys_error(handle->loop, WSAGetLastError()); return -1; } - if (uv_tcp_set_socket(loop, handle, sock) == -1) { + if (uv_tcp_set_socket(handle->loop, handle, sock) == -1) { closesocket(sock); return -1; } @@ -182,7 +184,7 @@ static int uv__bind(uv_loop_t* loop, uv_tcp_t* handle, int domain, handle->bind_error = err; handle->flags |= UV_HANDLE_BIND_ERROR; } else { - uv__set_sys_error(loop, err); + uv__set_sys_error(handle->loop, err); return -1; } } @@ -193,40 +195,24 @@ static int uv__bind(uv_loop_t* loop, uv_tcp_t* handle, int domain, } -int uv_tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) { - uv_loop_t* loop = handle->loop; - - if (handle->type != UV_TCP || addr.sin_family != AF_INET) { - uv__set_sys_error(loop, WSAEFAULT); - return -1; - } - - return uv__bind(loop, - handle, +int uv__tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) { + return uv__bind(handle, AF_INET, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)); } -int uv_tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) { - uv_loop_t* loop = handle->loop; - - if (handle->type != UV_TCP || addr.sin6_family != AF_INET6) { - uv__set_sys_error(loop, WSAEFAULT); - return -1; - } - +int uv__tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) { if (uv_allow_ipv6) { handle->flags |= UV_HANDLE_IPV6; - return uv__bind(loop, - handle, + return uv__bind(handle, AF_INET6, (struct sockaddr*)&addr, sizeof(struct sockaddr_in6)); } else { - uv__set_sys_error(loop, WSAEAFNOSUPPORT); + uv__set_sys_error(handle->loop, WSAEAFNOSUPPORT); return -1; } } @@ -472,8 +458,10 @@ int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb, } -int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle, - struct sockaddr_in address, uv_connect_cb cb) { +int uv__tcp_connect(uv_connect_t* req, + uv_tcp_t* handle, + struct sockaddr_in address, + uv_connect_cb cb) { uv_loop_t* loop = handle->loop; int addrsize = sizeof(struct sockaddr_in); BOOL success; @@ -484,11 +472,6 @@ int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle, return -1; } - if (handle->type != UV_TCP || address.sin_family != AF_INET) { - uv__set_sys_error(loop, WSAEFAULT); - return -1; - } - if (!(handle->flags & UV_HANDLE_BOUND) && uv_tcp_bind(handle, uv_addr_ip4_any_) < 0) return -1; @@ -523,8 +506,10 @@ int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle, } -int uv_tcp_connect6(uv_connect_t* req, uv_tcp_t* handle, - struct sockaddr_in6 address, uv_connect_cb cb) { +int uv__tcp_connect6(uv_connect_t* req, + uv_tcp_t* handle, + struct sockaddr_in6 address, + uv_connect_cb cb) { uv_loop_t* loop = handle->loop; int addrsize = sizeof(struct sockaddr_in6); BOOL success; @@ -540,11 +525,6 @@ int uv_tcp_connect6(uv_connect_t* req, uv_tcp_t* handle, return -1; } - if (handle->type != UV_TCP || address.sin6_family != AF_INET6) { - uv__set_sys_error(loop, WSAEFAULT); - return -1; - } - if (!(handle->flags & UV_HANDLE_BOUND) && uv_tcp_bind6(handle, uv_addr_ip6_any_) < 0) return -1; diff --git a/deps/uv/src/win/udp.c b/deps/uv/src/win/udp.c index 79120b61e2..3877f3996c 100644 --- a/deps/uv/src/win/udp.c +++ b/deps/uv/src/win/udp.c @@ -89,13 +89,14 @@ static int uv_udp_set_socket(uv_loop_t* loop, uv_udp_t* handle, } if (pSetFileCompletionNotificationModes) { - if (!pSetFileCompletionNotificationModes((HANDLE)socket, - FILE_SKIP_SET_EVENT_ON_HANDLE | FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)) { + if (pSetFileCompletionNotificationModes((HANDLE)socket, + FILE_SKIP_SET_EVENT_ON_HANDLE | + FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)) { + handle->flags |= UV_HANDLE_SYNC_BYPASS_IOCP; + } else if (GetLastError() != ERROR_INVALID_FUNCTION) { uv__set_sys_error(loop, GetLastError()); return -1; } - - handle->flags |= UV_HANDLE_SYNC_BYPASS_IOCP; } handle->socket = socket; @@ -139,27 +140,29 @@ void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle) { } -static int uv__bind(uv_udp_t* handle, int domain, struct sockaddr* addr, - int addrsize, unsigned int flags) { - uv_loop_t* loop = handle->loop; +static int uv__bind(uv_udp_t* handle, + int domain, + struct sockaddr* addr, + int addrsize, + unsigned int flags) { DWORD err; int r; SOCKET sock; if ((flags & UV_UDP_IPV6ONLY) && domain != AF_INET6) { /* UV_UDP_IPV6ONLY is supported only for IPV6 sockets */ - uv__set_sys_error(loop, UV_EINVAL); + uv__set_artificial_error(handle->loop, UV_EINVAL); return -1; } if (handle->socket == INVALID_SOCKET) { sock = socket(domain, SOCK_DGRAM, 0); if (sock == INVALID_SOCKET) { - uv__set_sys_error(loop, WSAGetLastError()); + uv__set_sys_error(handle->loop, WSAGetLastError()); return -1; } - if (uv_udp_set_socket(loop, handle, sock) == -1) { + if (uv_udp_set_socket(handle->loop, handle, sock) == -1) { closesocket(sock); return -1; } @@ -184,7 +187,7 @@ static int uv__bind(uv_udp_t* handle, int domain, struct sockaddr* addr, if (r == SOCKET_ERROR) { err = WSAGetLastError(); - uv__set_sys_error(loop, WSAGetLastError()); + uv__set_sys_error(handle->loop, WSAGetLastError()); return -1; } @@ -194,15 +197,8 @@ static int uv__bind(uv_udp_t* handle, int domain, struct sockaddr* addr, } -int uv_udp_bind(uv_udp_t* handle, struct sockaddr_in addr, +int uv__udp_bind(uv_udp_t* handle, struct sockaddr_in addr, unsigned int flags) { - uv_loop_t* loop = handle->loop; - - if (handle->type != UV_UDP || addr.sin_family != AF_INET) { - uv__set_sys_error(loop, WSAEFAULT); - return -1; - } - return uv__bind(handle, AF_INET, (struct sockaddr*) &addr, @@ -211,15 +207,8 @@ int uv_udp_bind(uv_udp_t* handle, struct sockaddr_in addr, } -int uv_udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, +int uv__udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned int flags) { - uv_loop_t* loop = handle->loop; - - if (handle->type != UV_UDP || addr.sin6_family != AF_INET6) { - uv__set_sys_error(loop, WSAEFAULT); - return -1; - } - if (uv_allow_ipv6) { handle->flags |= UV_HANDLE_IPV6; return uv__bind(handle, @@ -228,7 +217,7 @@ int uv_udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, sizeof(struct sockaddr_in6), flags); } else { - uv__set_sys_error(loop, WSAEAFNOSUPPORT); + uv__set_sys_error(handle->loop, WSAEAFNOSUPPORT); return -1; } } diff --git a/deps/uv/src/win/util.c b/deps/uv/src/win/util.c index c57a72981d..cb2d44381c 100644 --- a/deps/uv/src/win/util.c +++ b/deps/uv/src/win/util.c @@ -94,3 +94,32 @@ done: return retVal; } + +void uv_loadavg(double avg[3]) { + /* Can't be implemented */ + avg[0] = avg[1] = avg[2] = 0; +} + +double uv_get_free_memory(void) { + MEMORYSTATUSEX memory_status; + memory_status.dwLength = sizeof(memory_status); + + if(!GlobalMemoryStatusEx(&memory_status)) + { + return -1; + } + + return (double)memory_status.ullAvailPhys; +} + +double uv_get_total_memory(void) { + MEMORYSTATUSEX memory_status; + memory_status.dwLength = sizeof(memory_status); + + if(!GlobalMemoryStatusEx(&memory_status)) + { + return -1; + } + + return (double)memory_status.ullTotalPhys; +} diff --git a/deps/uv/test/test-fs-event.c b/deps/uv/test/test-fs-event.c index d249ec6692..724000db15 100644 --- a/deps/uv/test/test-fs-event.c +++ b/deps/uv/test/test-fs-event.c @@ -25,11 +25,12 @@ #include <string.h> #include <fcntl.h> -uv_fs_event_t fs_event; -uv_timer_t timer; -int timer_cb_called; -int close_cb_called; -int fs_event_cb_called; +static uv_fs_event_t fs_event; +static uv_timer_t timer; +static int timer_cb_called; +static int close_cb_called; +static int fs_event_cb_called; +static int timer_cb_touch_called; static void create_dir(uv_loop_t* loop, const char* name) { int r; @@ -84,7 +85,7 @@ static void fs_event_cb_dir(uv_fs_event_t* handle, const char* filename, ASSERT(handle == &fs_event); ASSERT(status == 0); ASSERT(events == UV_RENAME); - ASSERT(strcmp(filename, "file1") == 0); + ASSERT(filename == NULL || strcmp(filename, "file1") == 0); uv_close((uv_handle_t*)handle, close_cb); } @@ -94,7 +95,7 @@ static void fs_event_cb_file(uv_fs_event_t* handle, const char* filename, ASSERT(handle == &fs_event); ASSERT(status == 0); ASSERT(events == UV_CHANGE); - ASSERT(strcmp(filename, "file2") == 0); + ASSERT(filename == NULL || strcmp(filename, "file2") == 0); uv_close((uv_handle_t*)handle, close_cb); } @@ -104,7 +105,7 @@ static void fs_event_cb_file_current_dir(uv_fs_event_t* handle, ASSERT(handle == &fs_event); ASSERT(status == 0); ASSERT(events == UV_CHANGE); - ASSERT(strcmp(filename, "watch_file") == 0); + ASSERT(filename == NULL || strcmp(filename, "watch_file") == 0); uv_close((uv_handle_t*)handle, close_cb); } @@ -125,6 +126,13 @@ static void timer_cb_file(uv_timer_t* handle, int status) { } } +static void timer_cb_touch(uv_timer_t* timer, int status) { + ASSERT(status == 0); + uv_close((uv_handle_t*)timer, NULL); + touch_file(timer->loop, "watch_file"); + timer_cb_touch_called++; +} + TEST_IMPL(fs_event_watch_dir) { uv_fs_t fs_req; uv_loop_t* loop = uv_default_loop(); @@ -192,10 +200,13 @@ TEST_IMPL(fs_event_watch_file) { } TEST_IMPL(fs_event_watch_file_current_dir) { + uv_timer_t timer; + uv_loop_t* loop; uv_fs_t fs_req; - uv_loop_t* loop = uv_default_loop(); int r; + loop = uv_default_loop(); + /* Setup */ uv_fs_unlink(loop, &fs_req, "watch_file", NULL); create_file(loop, "watch_file"); @@ -203,11 +214,20 @@ TEST_IMPL(fs_event_watch_file_current_dir) { r = uv_fs_event_init(loop, &fs_event, "watch_file", fs_event_cb_file_current_dir); ASSERT(r != -1); - - touch_file(loop, "watch_file"); + + r = uv_timer_init(loop, &timer); + ASSERT(r == 0); + + r = uv_timer_start(&timer, timer_cb_touch, 1, 0); + ASSERT(r == 0); + + ASSERT(timer_cb_touch_called == 0); + ASSERT(fs_event_cb_called == 0); + ASSERT(close_cb_called == 0); uv_run(loop); + ASSERT(timer_cb_touch_called == 1); ASSERT(fs_event_cb_called == 1); ASSERT(close_cb_called == 1); diff --git a/deps/uv/test/test-fs.c b/deps/uv/test/test-fs.c index dfc373b654..d5e7e2915a 100644 --- a/deps/uv/test/test-fs.c +++ b/deps/uv/test/test-fs.c @@ -1260,4 +1260,4 @@ TEST_IMPL(fs_stat_missing_path) { uv_fs_req_cleanup(&req); return 0; -}
\ No newline at end of file +} diff --git a/deps/uv/include/uv-private/uv-linux.h b/deps/uv/test/test-get-loadavg.c index 7f7b05932d..7465e18b91 100644 --- a/deps/uv/include/uv-private/uv-linux.h +++ b/deps/uv/test/test-get-loadavg.c @@ -19,11 +19,18 @@ * IN THE SOFTWARE. */ -#ifndef UV_LINUX_H -#define UV_LINUX_H +#include "uv.h" +#include "task.h" -#define UV_FS_EVENT_PRIVATE_FIELDS \ - ev_io read_watcher; \ - uv_fs_event_cb cb; \ +TEST_IMPL(get_loadavg) { -#endif /* UV_LINUX_H */ + double avg[3]; + uv_loadavg(avg); + + ASSERT(avg != NULL); + ASSERT(avg[0] >= 0); + ASSERT(avg[1] >= 0); + ASSERT(avg[2] >= 0); + + return 0; +} diff --git a/deps/uv/test/test-get-memory.c b/deps/uv/test/test-get-memory.c new file mode 100644 index 0000000000..64b9e0dde1 --- /dev/null +++ b/deps/uv/test/test-get-memory.c @@ -0,0 +1,34 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "task.h" + +TEST_IMPL(get_memory) { + double free_mem = uv_get_free_memory(); + double total_mem = uv_get_total_memory(); + + ASSERT(free_mem > 0); + ASSERT(total_mem > 0); + ASSERT(total_mem > free_mem); + + return 0; +} diff --git a/deps/uv/test/test-list.h b/deps/uv/test/test-list.h index dcc5607655..f137493b29 100644 --- a/deps/uv/test/test-list.h +++ b/deps/uv/test/test-list.h @@ -61,12 +61,14 @@ TEST_DECLARE (idle_starvation) TEST_DECLARE (loop_handles) TEST_DECLARE (ref) TEST_DECLARE (idle_ref) +TEST_DECLARE (get_loadavg) TEST_DECLARE (async_ref) TEST_DECLARE (prepare_ref) TEST_DECLARE (check_ref) TEST_DECLARE (unref_in_prepare_cb) TEST_DECLARE (async) TEST_DECLARE (get_currentexe) +TEST_DECLARE (get_memory) TEST_DECLARE (hrtime) TEST_DECLARE (getaddrinfo_basic) TEST_DECLARE (getaddrinfo_concurrent) @@ -185,6 +187,10 @@ TASK_LIST_START TEST_ENTRY (get_currentexe) + TEST_ENTRY (get_memory) + + TEST_ENTRY (get_loadavg) + TEST_ENTRY (hrtime) TEST_ENTRY (getaddrinfo_basic) diff --git a/deps/uv/test/test-tcp-connect-error.c b/deps/uv/test/test-tcp-connect-error.c new file mode 100644 index 0000000000..5cdacab632 --- /dev/null +++ b/deps/uv/test/test-tcp-connect-error.c @@ -0,0 +1,70 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "task.h" +#include <stdio.h> +#include <stdlib.h> + + +static int connect_cb_called = 0; +static int close_cb_called = 0; + + + +static void connect_cb(uv_connect_t* handle, int status) { + ASSERT(handle != NULL); + connect_cb_called++; +} + + + +static void close_cb(uv_handle_t* handle) { + ASSERT(handle != NULL); + close_cb_called++; +} + + +TEST_IMPL(tcp_connect_error_fault) { + char garbage[] = "blah blah blah blah blah blah blah blah blah blah blah blah"; + struct sockaddr_in* garbage_addr; + uv_tcp_t server; + int r; + uv_connect_t req; + + garbage_addr = (struct sockaddr_in*) &garbage; + + r = uv_tcp_init(uv_default_loop(), &server); + ASSERT(r == 0); + r = uv_tcp_connect(&req, &server, *garbage_addr, connect_cb); + ASSERT(r == -1); + + ASSERT(uv_last_error(uv_default_loop()).code == UV_EINVAL); + + uv_close((uv_handle_t*)&server, close_cb); + + uv_run(uv_default_loop()); + + ASSERT(connect_cb_called == 0); + ASSERT(close_cb_called == 1); + + return 0; +} diff --git a/deps/uv/test/test-tcp-connect6-error.c b/deps/uv/test/test-tcp-connect6-error.c new file mode 100644 index 0000000000..5c158ff876 --- /dev/null +++ b/deps/uv/test/test-tcp-connect6-error.c @@ -0,0 +1,68 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "task.h" +#include <stdio.h> +#include <stdlib.h> + + +static int connect_cb_called = 0; +static int close_cb_called = 0; + + +static void connect_cb(uv_connect_t* handle, int status) { + ASSERT(handle != NULL); + connect_cb_called++; +} + + +static void close_cb(uv_handle_t* handle) { + ASSERT(handle != NULL); + close_cb_called++; +} + + +TEST_IMPL(tcp_connect6_error_fault) { + char garbage[] = "blah blah blah blah blah blah blah blah blah blah blah blah"; + struct sockaddr_in6* garbage_addr; + uv_tcp_t server; + int r; + uv_connect_t req; + + garbage_addr = (struct sockaddr_in6*) &garbage; + + r = uv_tcp_init(uv_default_loop(), &server); + ASSERT(r == 0); + r = uv_tcp_connect6(&req, &server, *garbage_addr, connect_cb); + ASSERT(r == -1); + + ASSERT(uv_last_error(uv_default_loop()).code == UV_EINVAL); + + uv_close((uv_handle_t*)&server, close_cb); + + uv_run(uv_default_loop()); + + ASSERT(connect_cb_called == 0); + ASSERT(close_cb_called == 1); + + return 0; +} diff --git a/deps/uv/uv.gyp b/deps/uv/uv.gyp index dc4338dd36..e85927aa31 100644 --- a/deps/uv/uv.gyp +++ b/deps/uv/uv.gyp @@ -215,7 +215,10 @@ 'EIO_CONFIG_H="config_sunos.h"', ], 'direct_dependent_settings': { - 'libraries': [ '-lrt' ], + 'libraries': [ + '-lsocket', + '-lnsl', + ], }, }], [ 'OS=="freebsd"', { @@ -226,6 +229,9 @@ 'EIO_CONFIG_H="config_freebsd.h"', ], }], + [ 'OS=="mac" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd"', { + 'sources': [ 'src/unix/kqueue.c' ], + }], ] }, @@ -238,6 +244,7 @@ 'test/run-tests.c', 'test/runner.c', 'test/runner.h', + 'test/test-get-loadavg.c', 'test/task.h', 'test/test-async.c', 'test/test-callback-stack.c', @@ -247,6 +254,7 @@ 'test/test-fs.c', 'test/test-fs-event.c', 'test/test-get-currentexe.c', + 'test/test-get-memory.c', 'test/test-getaddrinfo.c', 'test/test-gethostbyname.c', 'test/test-getsockname.c', @@ -263,6 +271,8 @@ 'test/test-tcp-bind-error.c', 'test/test-tcp-bind6-error.c', 'test/test-tcp-close.c', + 'test/test-tcp-connect-error.c', + 'test/test-tcp-connect6-error.c', 'test/test-tcp-write-error.c', 'test/test-tcp-writealot.c', 'test/test-threadpool.c', @@ -287,7 +297,13 @@ 'test/runner-unix.c', 'test/runner-unix.h', ] - }] + }], + [ 'OS=="solaris"', { # make test-fs.c compile, needs _POSIX_C_SOURCE + 'defines': [ + '__EXTENSIONS__', + '_XOPEN_SOURCE=500', + ], + }], ], 'msvs-settings': { 'VCLinkerTool': { |