Repository: qpid-proton Updated Branches: refs/heads/master dc27a7b1c -> 37a0d6b07
PROTON-824: idle timeout test on Windows: make selector PN_ERROR handling more like POSIX, especially for broken connections Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/37a0d6b0 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/37a0d6b0 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/37a0d6b0 Branch: refs/heads/master Commit: 37a0d6b07708beb2eeb21cd2bd97bd756f33ee71 Parents: dc27a7b Author: Clifford Jansen <[email protected]> Authored: Wed Feb 25 01:56:14 2015 -0800 Committer: Clifford Jansen <[email protected]> Committed: Wed Feb 25 01:56:14 2015 -0800 ---------------------------------------------------------------------- proton-c/src/windows/iocp.c | 14 ++++++++++++-- proton-c/src/windows/iocp.h | 3 ++- proton-c/src/windows/selector.c | 8 +++++--- 3 files changed, 19 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37a0d6b0/proton-c/src/windows/iocp.c ---------------------------------------------------------------------- diff --git a/proton-c/src/windows/iocp.c b/proton-c/src/windows/iocp.c index 3feec01..9cedd34 100644 --- a/proton-c/src/windows/iocp.c +++ b/proton-c/src/windows/iocp.c @@ -97,7 +97,8 @@ static void iocpdesc_fail(iocpdesc_t *iocpd, HRESULT status, const char* text) iocp_shutdown(iocpd); iocpd->write_closed = true; iocpd->read_closed = true; - pni_events_update(iocpd, iocpd->events | PN_READABLE | PN_WRITABLE); + iocpd->poll_error = true; + pni_events_update(iocpd, iocpd->events & ~(PN_READABLE | PN_WRITABLE)); } // Helper functions to use specialized IOCP AcceptEx() and ConnectEx() @@ -552,8 +553,17 @@ static void complete_write(write_result_t *result, DWORD xfer_count, HRESULT sta return; } } + // Other error pni_write_pipeline_return(iocpd->pipeline, result); - iocpdesc_fail(iocpd, status, "IOCP async write error"); + if (status == WSAECONNABORTED || status == WSAECONNRESET || status == WSAENOTCONN + || status == ERROR_NETNAME_DELETED) { + iocpd->write_closed = true; + iocpd->poll_error = true; + pni_events_update(iocpd, iocpd->events & ~PN_WRITABLE); + pni_win32_error(iocpd->error, "Remote close or timeout", status); + } else { + iocpdesc_fail(iocpd, status, "IOCP async write error"); + } } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37a0d6b0/proton-c/src/windows/iocp.h ---------------------------------------------------------------------- diff --git a/proton-c/src/windows/iocp.h b/proton-c/src/windows/iocp.h index adccaab..0e052e5 100644 --- a/proton-c/src/windows/iocp.h +++ b/proton-c/src/windows/iocp.h @@ -71,9 +71,10 @@ struct iocpdesc_t { read_result_t *read_result; bool external; // true if socket set up outside Proton bool bound; // associted with the completion port - bool closing; // pn_close called + bool closing; // pn_close called by application bool read_closed; // EOF or read error bool write_closed; // shutdown sent or write error + bool poll_error; // flag posix-like POLLERR/POLLHUP/POLLNVAL bool deadline_desc; // Socket-less deadline descriptor for selectors pn_selector_t *selector; pn_selectable_t *selectable; http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37a0d6b0/proton-c/src/windows/selector.c ---------------------------------------------------------------------- diff --git a/proton-c/src/windows/selector.c b/proton-c/src/windows/selector.c index 6bd8d8c..e22c428 100644 --- a/proton-c/src/windows/selector.c +++ b/proton-c/src/windows/selector.c @@ -163,7 +163,7 @@ void pn_selector_update(pn_selector_t *selector, pn_selectable_t *selectable) if (iocpd) { assert(sock == iocpd->socket || iocpd->closing); - int interests = 0; + int interests = PN_ERROR; // Always if (pn_selectable_is_reading(selectable)) { interests |= PN_READABLE; } @@ -313,8 +313,10 @@ static void triggered_list_remove(pn_selector_t *selector, iocpdesc_t *iocpd) void pni_events_update(iocpdesc_t *iocpd, int events) { - int old_events = iocpd->events; - if (old_events == events) + // If set, a poll error is permanent + if (iocpd->poll_error) + events |= PN_ERROR; + if (iocpd->events == events) return; iocpd->events = events; if (iocpd->selector) { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
