diff options
author | Martin Sustrik <sustrik@250bpm.com> | 2012-05-20 08:17:42 +0200 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2012-05-21 12:17:59 +0200 |
commit | 338a8a0ee13388aceafa3d8b6d8add3b79e95986 (patch) | |
tree | 6bb8fb957c3247e43c536bdd678a61bf59a12a02 | |
parent | c4881d317e3ec5b02d1e354fb54a56dc0618b717 (diff) |
Expired survey returns ETIMEDOUT instead of EAGAIN
Up to now, when survey in surveyor pattern expired, xs_recv()
returned EAGAIN. That made it impossible to distinguish
epired survey from expired receive timeout (XS_RCVTIMEO).
This patch make errors different in both cases.
Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
-rw-r--r-- | doc/xs_recv.txt | 2 | ||||
-rw-r--r-- | doc/xs_recvmsg.txt | 2 | ||||
-rw-r--r-- | src/err.cpp | 2 | ||||
-rw-r--r-- | src/surveyor.cpp | 12 | ||||
-rw-r--r-- | tests/survey.cpp | 2 |
5 files changed, 16 insertions, 4 deletions
diff --git a/doc/xs_recv.txt b/doc/xs_recv.txt index 5706432..484c317 100644 --- a/doc/xs_recv.txt +++ b/doc/xs_recv.txt @@ -65,6 +65,8 @@ The provided 'socket' was invalid. *EINTR*:: The operation was interrupted by delivery of a signal before a message was available. +*ETIMEDOUT*:: +Survey has timed out. (Applicable only to XS_SURVEYOR socket.) EXAMPLE diff --git a/doc/xs_recvmsg.txt b/doc/xs_recvmsg.txt index 4a88177..86a15a6 100644 --- a/doc/xs_recvmsg.txt +++ b/doc/xs_recvmsg.txt @@ -67,6 +67,8 @@ The operation was interrupted by delivery of a signal before a message was available. *EFAULT*:: The message passed to the function was invalid. +*ETIMEDOUT*:: +Survey has timed out. (Applicable only to XS_SURVEYOR socket.) EXAMPLE diff --git a/src/err.cpp b/src/err.cpp index e330ed2..a771030 100644 --- a/src/err.cpp +++ b/src/err.cpp @@ -157,7 +157,7 @@ const char *xs::wsa_error_no (int no_) (no_ == WSAETOOMANYREFS) ? "Too many references can't splice" : (no_ == WSAETIMEDOUT) ? - "Connection timed out" : + "Operation timed out" : (no_ == WSAECONNREFUSED) ? "Connection refused" : (no_ == WSAELOOP) ? diff --git a/src/surveyor.cpp b/src/surveyor.cpp index b72b91b..bd19b8a 100644 --- a/src/surveyor.cpp +++ b/src/surveyor.cpp @@ -92,8 +92,16 @@ int xs::surveyor_t::xrecv (msg_t *msg_, int flags_) // Get the first part of the response -- the survey ID. rc = xsurveyor_t::xrecv (msg_, flags_); - if (rc != 0) - return rc; + if (rc != 0) { + if (errno != EAGAIN) + return -1; + + // In case of AGAIN we should check whether the survey timeout expired. + // If so, we should return ETIMEDOUT so that user is able to + // distinguish survey timeout from RCVTIMEO-caused timeout. + errno = now_ms () >= timeout ? ETIMEDOUT : EAGAIN; + return -1; + } // Check whether this is response for the onging survey. If not, we can // drop the response. diff --git a/tests/survey.cpp b/tests/survey.cpp index f21b217..2179779 100644 --- a/tests/survey.cpp +++ b/tests/survey.cpp @@ -126,7 +126,7 @@ int XS_TEST_MAIN () assert (rc == 3); void *watch = xs_stopwatch_start (); rc = xs_recv (surveyor, buf, sizeof (buf), 0); - assert (rc == - 1 && errno == EAGAIN); + assert (rc == - 1 && errno == ETIMEDOUT); unsigned long elapsed = xs_stopwatch_stop (watch) / 1000; time_assert (elapsed, (unsigned long) timeout); |