diff options
author | Nick Mathewson <nickm@torproject.org> | 2015-08-07 09:12:33 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2015-08-07 09:12:33 -0400 |
commit | 720a9ccb2f4392ca12e9a473125e54c20c291d4a (patch) | |
tree | 8c7c72ff308e9639f5cbe81071a65b9ef7d1c65a /src/common/compat_threads.c | |
parent | 9d1801b4b96d205d1896db754efbd54ecdf590d2 (diff) | |
download | tor-720a9ccb2f4392ca12e9a473125e54c20c291d4a.tar.gz tor-720a9ccb2f4392ca12e9a473125e54c20c291d4a.zip |
Check for EINTR correctly on windows
(even though these are nonblocking calls and EINTR shouldn't be possible).
Also, log what error we're seing if drain_fn fails.
Diffstat (limited to 'src/common/compat_threads.c')
-rw-r--r-- | src/common/compat_threads.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/common/compat_threads.c b/src/common/compat_threads.c index 15648d2851..85ad737574 100644 --- a/src/common/compat_threads.c +++ b/src/common/compat_threads.c @@ -88,7 +88,7 @@ in_main_thread(void) } #if defined(HAVE_EVENTFD) || defined(HAVE_PIPE) -/* non-interruptable versions */ +/* As write(), but retry on EINTR */ static int write_ni(int fd, const void *buf, size_t n) { @@ -99,6 +99,7 @@ write_ni(int fd, const void *buf, size_t n) goto again; return r; } +/* As read(), but retry on EINTR */ static int read_ni(int fd, void *buf, size_t n) { @@ -111,30 +112,32 @@ read_ni(int fd, void *buf, size_t n) } #endif -/* non-interruptable versions */ +/** As send(), but retry on EINTR. */ static int send_ni(int fd, const void *buf, size_t n, int flags) { int r; again: r = (int) send(fd, buf, n, flags); - if (r < 0 && errno == EINTR) + if (r < 0 && ERRNO_IS_EINTR(tor_socket_errno(fd))) goto again; return r; } +/** As recv(), but retry on EINTR. */ static int recv_ni(int fd, void *buf, size_t n, int flags) { int r; again: - r = (int) recv(fd, buf, n, flags); - if (r < 0 && errno == EINTR) + r = (int) recv(fd, buf, n, flags); + if (r < 0 && ERRNO_IS_EINTR(tor_socket_errno(fd))) goto again; return r; } #ifdef HAVE_EVENTFD +/* Increment the event count on an eventfd <b>fd</b> */ static int eventfd_alert(int fd) { @@ -145,6 +148,7 @@ eventfd_alert(int fd) return 0; } +/* Drain all events from an eventfd <b>fd</b>. */ static int eventfd_drain(int fd) { @@ -157,6 +161,7 @@ eventfd_drain(int fd) #endif #ifdef HAVE_PIPE +/** Send a byte over a pipe. Return 0 on success or EAGAIN; -1 on error */ static int pipe_alert(int fd) { @@ -166,6 +171,8 @@ pipe_alert(int fd) return 0; } +/** Drain all input from a pipe <b>fd</b> and ignore it. Return 0 on + * success, -1 on error. */ static int pipe_drain(int fd) { @@ -181,6 +188,8 @@ pipe_drain(int fd) } #endif +/** Send a byte on socket <b>fd</b>t. Return 0 on success or EAGAIN, + * -1 on error. */ static int sock_alert(tor_socket_t fd) { @@ -190,6 +199,8 @@ sock_alert(tor_socket_t fd) return 0; } +/** Drain all the input from a socket <b>fd</b>, and ignore it. Return 0 on + * success, -1 on error. */ static int sock_drain(tor_socket_t fd) { |