ext/libuv/test/test-poll.c in libuv-2.0.8 vs ext/libuv/test/test-poll.c in libuv-2.0.9
- old
+ new
@@ -29,11 +29,21 @@
#endif
#include "uv.h"
#include "task.h"
+#ifdef __linux__
+# include <sys/epoll.h>
+#endif
+#ifdef UV_HAVE_KQUEUE
+# include <sys/types.h>
+# include <sys/event.h>
+# include <sys/time.h>
+#endif
+
+
#define NUM_CLIENTS 5
#define TRANSFER_BYTES (1 << 16)
#undef MIN
#define MIN(a, b) (((a) < (b)) ? (a) : (b));
@@ -70,13 +80,14 @@
static int closed_connections = 0;
static int valid_writable_wakeups = 0;
static int spurious_writable_wakeups = 0;
+#ifndef _AIX
static int disconnects = 0;
+#endif /* !_AIX */
-
static int got_eagain(void) {
#ifdef _WIN32
return WSAGetLastError() == WSAEWOULDBLOCK;
#else
return errno == EAGAIN
@@ -375,18 +386,21 @@
ASSERT(r == 0);
context->sent_fin = 1;
new_events &= ~UV_WRITABLE;
}
}
-
+#ifndef _AIX
if (events & UV_DISCONNECT) {
context->got_disconnect = 1;
++disconnects;
new_events &= ~UV_DISCONNECT;
}
if (context->got_fin && context->sent_fin && context->got_disconnect) {
+#else /* _AIX */
+ if (context->got_fin && context->sent_fin) {
+#endif /* !_AIx */
/* Sent and received FIN. Close and destroy context. */
close_socket(context->sock);
destroy_connection_context(context);
context->events = 0;
@@ -550,12 +564,13 @@
ASSERT(spurious_writable_wakeups == 0 ||
(valid_writable_wakeups + spurious_writable_wakeups) /
spurious_writable_wakeups > 20);
ASSERT(closed_connections == NUM_CLIENTS * 2);
+#ifndef _AIX
ASSERT(disconnects == NUM_CLIENTS * 2);
-
+#endif
MAKE_VALGRIND_HAPPY();
}
TEST_IMPL(poll_duplex) {
@@ -594,5 +609,49 @@
#endif
MAKE_VALGRIND_HAPPY();
return 0;
}
+
+
+#ifdef __linux__
+TEST_IMPL(poll_nested_epoll) {
+ uv_poll_t poll_handle;
+ int fd;
+
+ fd = epoll_create(1);
+ ASSERT(fd != -1);
+
+ ASSERT(0 == uv_poll_init(uv_default_loop(), &poll_handle, fd));
+ ASSERT(0 == uv_poll_start(&poll_handle, UV_READABLE, (uv_poll_cb) abort));
+ ASSERT(0 != uv_run(uv_default_loop(), UV_RUN_NOWAIT));
+
+ uv_close((uv_handle_t*) &poll_handle, NULL);
+ ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
+ ASSERT(0 == close(fd));
+
+ MAKE_VALGRIND_HAPPY();
+ return 0;
+}
+#endif /* __linux__ */
+
+
+#ifdef UV_HAVE_KQUEUE
+TEST_IMPL(poll_nested_kqueue) {
+ uv_poll_t poll_handle;
+ int fd;
+
+ fd = kqueue();
+ ASSERT(fd != -1);
+
+ ASSERT(0 == uv_poll_init(uv_default_loop(), &poll_handle, fd));
+ ASSERT(0 == uv_poll_start(&poll_handle, UV_READABLE, (uv_poll_cb) abort));
+ ASSERT(0 != uv_run(uv_default_loop(), UV_RUN_NOWAIT));
+
+ uv_close((uv_handle_t*) &poll_handle, NULL);
+ ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
+ ASSERT(0 == close(fd));
+
+ MAKE_VALGRIND_HAPPY();
+ return 0;
+}
+#endif /* UV_HAVE_KQUEUE */