test: fix POLLHDRUP related failures for AIX

`POLLHDRUP` is not implemented on AIX. Therefore `UV_DISCONNECT` will
never be set on `events`. This causes the socket to never be closed and
the tests to be stuck inside `pollset_poll` indefinitely, resulting in a
timeout.

This fixes the following tests:
- poll_duplex
- poll_unidirectional

Updated docs to let end users know that `UV_DISCONNECT` can be set, but
is unsupported on AIX.

Fixes: https://github.com/libuv/libuv/issues/844
PR-URL: https://github.com/libuv/libuv/pull/857
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
This commit is contained in:
Imran Iqbal 2016-05-04 17:26:33 -04:00 committed by Saúl Ibarra Corretgé
parent d43ee0eafa
commit 337e9fd0f5
2 changed files with 14 additions and 3 deletions

View File

@ -31,6 +31,8 @@ closed immediately after a call to :c:func:`uv_poll_stop` or :c:func:`uv_close`.
On windows only sockets can be polled with poll handles. On Unix any file On windows only sockets can be polled with poll handles. On Unix any file
descriptor that would be accepted by :man:`poll(2)` can be used. descriptor that would be accepted by :man:`poll(2)` can be used.
.. note::
On AIX, watching for disconnection is not supported.
Data types Data types
---------- ----------
@ -101,6 +103,10 @@ API
Calling :c:func:`uv_poll_start` on a handle that is already active is fine. Doing so Calling :c:func:`uv_poll_start` on a handle that is already active is fine. Doing so
will update the events mask that is being watched for. will update the events mask that is being watched for.
.. note::
Though UV_DISCONNECT can be set, it is unsupported on AIX and as such will not be set
on the `events` field in the callback.
.. versionchanged:: 1.9.0 Added the UV_DISCONNECT event. .. versionchanged:: 1.9.0 Added the UV_DISCONNECT event.
.. c:function:: int uv_poll_stop(uv_poll_t* poll) .. c:function:: int uv_poll_stop(uv_poll_t* poll)

View File

@ -72,8 +72,9 @@ static int closed_connections = 0;
static int valid_writable_wakeups = 0; static int valid_writable_wakeups = 0;
static int spurious_writable_wakeups = 0; static int spurious_writable_wakeups = 0;
#ifndef _AIX
static int disconnects = 0; static int disconnects = 0;
#endif /* !_AIX */
static int got_eagain(void) { static int got_eagain(void) {
#ifdef _WIN32 #ifdef _WIN32
@ -377,7 +378,7 @@ static void connection_poll_cb(uv_poll_t* handle, int status, int events) {
new_events &= ~UV_WRITABLE; new_events &= ~UV_WRITABLE;
} }
} }
#ifndef _AIX
if (events & UV_DISCONNECT) { if (events & UV_DISCONNECT) {
context->got_disconnect = 1; context->got_disconnect = 1;
++disconnects; ++disconnects;
@ -385,6 +386,9 @@ static void connection_poll_cb(uv_poll_t* handle, int status, int events) {
} }
if (context->got_fin && context->sent_fin && context->got_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. */ /* Sent and received FIN. Close and destroy context. */
close_socket(context->sock); close_socket(context->sock);
destroy_connection_context(context); destroy_connection_context(context);
@ -552,8 +556,9 @@ static void start_poll_test(void) {
spurious_writable_wakeups > 20); spurious_writable_wakeups > 20);
ASSERT(closed_connections == NUM_CLIENTS * 2); ASSERT(closed_connections == NUM_CLIENTS * 2);
#ifndef _AIX
ASSERT(disconnects == NUM_CLIENTS * 2); ASSERT(disconnects == NUM_CLIENTS * 2);
#endif
MAKE_VALGRIND_HAPPY(); MAKE_VALGRIND_HAPPY();
} }