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]

Reply via email to