unix: return UV_EAGAIN if uv_try_write cannot write any data
This commit is contained in:
parent
0d43992c3b
commit
40ad12e5be
@ -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
|
* Same as `uv_write()`, but won't queue write request if it can't be completed
|
||||||
* immediately.
|
* immediately.
|
||||||
* Will return either:
|
* Will return either:
|
||||||
* - >= 0: number of bytes written (can be less than the supplied buffer size)
|
* - > 0: number of bytes written (can be less than the supplied buffer size)
|
||||||
* - < 0: negative error code
|
* - < 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,
|
UV_EXTERN int uv_try_write(uv_stream_t* handle,
|
||||||
const uv_buf_t bufs[],
|
const uv_buf_t bufs[],
|
||||||
|
|||||||
@ -1374,7 +1374,7 @@ int uv_try_write(uv_stream_t* stream,
|
|||||||
|
|
||||||
/* Connecting or already writing some data */
|
/* Connecting or already writing some data */
|
||||||
if (stream->connect_req != NULL || stream->write_queue_size != 0)
|
if (stream->connect_req != NULL || stream->write_queue_size != 0)
|
||||||
return 0;
|
return -EAGAIN;
|
||||||
|
|
||||||
has_pollout = uv__io_active(&stream->io_watcher, UV__POLLOUT);
|
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);
|
uv__stream_osx_interrupt_select(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (int) written;
|
if (written == 0)
|
||||||
|
return -EAGAIN;
|
||||||
|
else
|
||||||
|
return written;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -63,12 +63,14 @@ static void connect_cb(uv_connect_t* req, int status) {
|
|||||||
do {
|
do {
|
||||||
buf = uv_buf_init(zeroes, sizeof(zeroes));
|
buf = uv_buf_init(zeroes, sizeof(zeroes));
|
||||||
r = uv_try_write((uv_stream_t*) &client, &buf, 1);
|
r = uv_try_write((uv_stream_t*) &client, &buf, 1);
|
||||||
ASSERT(r >= 0);
|
ASSERT(r > 0 || r == UV_EAGAIN);
|
||||||
bytes_written += r;
|
if (r > 0) {
|
||||||
|
bytes_written += r;
|
||||||
|
|
||||||
/* Partial write */
|
/* Partial write */
|
||||||
if (r != (int) sizeof(zeroes))
|
if (r != (int) sizeof(zeroes))
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
} while (1);
|
} while (1);
|
||||||
uv_close((uv_handle_t*) &client, close_cb);
|
uv_close((uv_handle_t*) &client, close_cb);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user