From 40ad12e5bedb7f328328f5fb634203e3b84b9af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Fri, 4 Jul 2014 20:45:09 +0200 Subject: [PATCH] unix: return UV_EAGAIN if uv_try_write cannot write any data --- include/uv.h | 5 +++-- src/unix/stream.c | 7 +++++-- test/test-tcp-try-write.c | 12 +++++++----- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/include/uv.h b/include/uv.h index c21a51a5..d7dcb449 100644 --- a/include/uv.h +++ b/include/uv.h @@ -707,8 +707,9 @@ UV_EXTERN int uv_write2(uv_write_t* req, * Same as `uv_write()`, but won't queue write request if it can't be completed * immediately. * Will return either: - * - >= 0: number of bytes written (can be less than the supplied buffer size) - * - < 0: negative error code + * - > 0: number of bytes written (can be less than the supplied buffer size) + * - < 0: negative error code (UV_EAGAIN is returned if no data can be sent + * immediately) */ UV_EXTERN int uv_try_write(uv_stream_t* handle, const uv_buf_t bufs[], diff --git a/src/unix/stream.c b/src/unix/stream.c index 85e958bd..db25187f 100644 --- a/src/unix/stream.c +++ b/src/unix/stream.c @@ -1374,7 +1374,7 @@ int uv_try_write(uv_stream_t* stream, /* Connecting or already writing some data */ if (stream->connect_req != NULL || stream->write_queue_size != 0) - return 0; + return -EAGAIN; has_pollout = uv__io_active(&stream->io_watcher, UV__POLLOUT); @@ -1404,7 +1404,10 @@ int uv_try_write(uv_stream_t* stream, uv__stream_osx_interrupt_select(stream); } - return (int) written; + if (written == 0) + return -EAGAIN; + else + return written; } diff --git a/test/test-tcp-try-write.c b/test/test-tcp-try-write.c index 00341e41..5523b7a1 100644 --- a/test/test-tcp-try-write.c +++ b/test/test-tcp-try-write.c @@ -63,12 +63,14 @@ static void connect_cb(uv_connect_t* req, int status) { do { buf = uv_buf_init(zeroes, sizeof(zeroes)); r = uv_try_write((uv_stream_t*) &client, &buf, 1); - ASSERT(r >= 0); - bytes_written += r; + ASSERT(r > 0 || r == UV_EAGAIN); + if (r > 0) { + bytes_written += r; - /* Partial write */ - if (r != (int) sizeof(zeroes)) - break; + /* Partial write */ + if (r != (int) sizeof(zeroes)) + break; + } } while (1); uv_close((uv_handle_t*) &client, close_cb); }