New EVUTIL_ERR_*_RETRIABLE macros to tell if an errno blocked or failed.

svn:r994
This commit is contained in:
Nick Mathewson 2009-01-13 19:19:50 +00:00
parent 99db0e7f72
commit 5ebd23ad74
2 changed files with 56 additions and 0 deletions

View File

@ -81,6 +81,8 @@ event-config.h: config.h
-e 's/#ifndef /#ifndef _EVENT_/' < config.h >> $@
echo "#endif" >> $@
noinst_HEADERS = util-internal.h
CORE_SRC = event.c buffer.c evbuffer-internal.h bufferevent.c \
bufferevent-internal.h evmap.c evmap.h \
log.c evutil.c strlcpy.c strlcpy-internal.h $(SYS_SRC)

54
util-internal.h Normal file
View File

@ -0,0 +1,54 @@
#ifndef _EVENT_UTIL_INTERNAL_H
#define _EVENT_UTIL_INTERNAL_H
#include "event-config.h"
#include <errno.h>
#ifdef __cplusplus
extern "C" {
#endif
/* Internal use only: macros to match patterns of error codes in a
cross-platform way. We need these macros because of two historical
reasons: first, nonblocking IO functions are generally written to give an
error on the "blocked now, try later" case, so sometimes an error from a
read, write, connect, or accept means "no error; just wait for more
data," and we need to look at the error code. Second, Windows defines
a different set of error codes for sockets. */
#ifndef WIN32
/* 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)
/* True iff e is an error that means an accept can be retried. */
#define EVUTIL_ERR_CONNECT_RETRIABLE(e) \
((e) == EINTR || (e) == EINPROGRESS)
/* True iff e is an error that means a connect can be retried. */
#define EVUTIL_ERR_ACCEPT_RETRIABLE(e) \
((e) == EINTR || (e) == EAGAIN || (e) == ECONNABORTED)
#else
#define EVUTIL_ERR_RW_RETRIABLE(e) \
((e) == WSAEAGAIN || \
(e) == WSAEWOULDBLOCK || \
(e) == WSAEINTR)
#define EVUTIL_ERR_CONNECT_RETRIABLE(e) \
((e) == WSAEWOULDBLOCK || \
(e) == WSAEINTR || \
(e) == WSAEINPROGRESS || \
(e) == WSAEINVAL))
#define EVUTIL_ERR_ACCEPT_RETRIABLE(e) \
EVUTIL_ERR_RW_RETRIABLE(e)
#endif
#ifdef __cplusplus
}
#endif
#endif