From bf7a0ff26808199ec68b86bb78c65fc21ba770f9 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 11 Jan 2013 16:37:34 -0800 Subject: [PATCH] When EWOULDBLOCK is not EAGAIN, treat it as equivalent to it Acording to http://stackoverflow.com/questions/7003234/which-systems-define-eagain-and-ewouldblock-as-different-values there are some older unixes that distinguish these error.s --- event.c | 2 +- util-internal.h | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/event.c b/event.c index ce2828fe..fb20f696 100644 --- a/event.c +++ b/event.c @@ -2157,7 +2157,7 @@ evthread_notify_base_default(struct event_base *base) #else r = write(base->th_notify_fd[1], buf, 1); #endif - return (r < 0 && errno != EAGAIN) ? -1 : 0; + return (r < 0 && ! EVUTIL_ERR_IS_EAGAIN(errno)) ? -1 : 0; } #ifdef EVENT__HAVE_EVENTFD diff --git a/util-internal.h b/util-internal.h index fa29f271..f52ae3f4 100644 --- a/util-internal.h +++ b/util-internal.h @@ -79,15 +79,23 @@ extern "C" { #ifndef _WIN32 +#if EAGAIN == EWOULDBLOCK +#define EVUTIL_ERR_IS_EAGAIN(e) \ + ((e) == EAGAIN) +#else +#define EVUTIL_ERR_IS_EAGAIN(e) \ + ((e) == EAGAIN || (e) == EWOULDBLOCK) +#endif + /* True iff e is an error that means a read/write operation can be retried. */ #define EVUTIL_ERR_RW_RETRIABLE(e) \ - ((e) == EINTR || (e) == EAGAIN) + ((e) == EINTR || EVUTIL_ERR_IS_EAGAIN(e)) /* True iff e is an error that means an connect can be retried. */ #define EVUTIL_ERR_CONNECT_RETRIABLE(e) \ ((e) == EINTR || (e) == EINPROGRESS) /* True iff e is an error that means a accept can be retried. */ #define EVUTIL_ERR_ACCEPT_RETRIABLE(e) \ - ((e) == EINTR || (e) == EAGAIN || (e) == ECONNABORTED) + ((e) == EINTR || EVUTIL_ERR_IS_EAGAIN(e) || (e) == ECONNABORTED) /* True iff e is an error that means the connection was refused */ #define EVUTIL_ERR_CONNECT_REFUSED(e) \ -- 2.50.1