stream: allow multiple buffers for uv_try_write

This commit is contained in:
Fedor Indutny 2013-12-13 22:59:47 +04:00
parent 7f65a74f8e
commit 17d60e3f94
4 changed files with 13 additions and 8 deletions

View File

@ -681,7 +681,9 @@ UV_EXTERN int uv_write2(uv_write_t* req,
* - zero - if queued write is needed * - zero - if queued write is needed
* - negative error code * - negative error code
*/ */
UV_EXTERN int uv_try_write(uv_stream_t* handle, const char* buf, size_t length); UV_EXTERN int uv_try_write(uv_stream_t* handle,
const uv_buf_t bufs[],
unsigned int nbufs);
/* uv_write_t is a subclass of uv_req_t */ /* uv_write_t is a subclass of uv_req_t */
struct uv_write_s { struct uv_write_s {

View File

@ -1305,13 +1305,14 @@ void uv_try_write_cb(uv_write_t* req, int status) {
} }
int uv_try_write(uv_stream_t* stream, const char* buf, size_t size) { int uv_try_write(uv_stream_t* stream,
const uv_buf_t bufs[],
unsigned int nbufs) {
int r; int r;
int has_pollout; int has_pollout;
size_t written; size_t written;
size_t req_size; size_t req_size;
uv_write_t req; uv_write_t req;
uv_buf_t bufstruct;
/* 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)
@ -1319,13 +1320,12 @@ int uv_try_write(uv_stream_t* stream, const char* buf, size_t size) {
has_pollout = uv__io_active(&stream->io_watcher, UV__POLLOUT); has_pollout = uv__io_active(&stream->io_watcher, UV__POLLOUT);
bufstruct = uv_buf_init((char*) buf, size); r = uv_write(&req, stream, bufs, nbufs, uv_try_write_cb);
r = uv_write(&req, stream, &bufstruct, 1, uv_try_write_cb);
if (r != 0) if (r != 0)
return r; return r;
/* Remove not written bytes from write queue size */ /* Remove not written bytes from write queue size */
written = size; written = uv_count_bufs(bufs, nbufs);
if (req.bufs != NULL) if (req.bufs != NULL)
req_size = uv__write_req_size(&req); req_size = uv__write_req_size(&req);
else else

View File

@ -202,7 +202,9 @@ int uv_write2(uv_write_t* req,
} }
int uv_try_write(uv_stream_t* handle, const char* buf, size_t length) { int uv_try_write(uv_stream_t* stream,
const uv_buf_t bufs[],
unsigned int nbufs) {
/* NOTE: Won't work with overlapped writes */ /* NOTE: Won't work with overlapped writes */
return UV_ENOSYS; return UV_ENOSYS;
} }

View File

@ -61,7 +61,8 @@ static void connect_cb(uv_connect_t* req, int status) {
connect_cb_called++; connect_cb_called++;
do { do {
r = uv_try_write((uv_stream_t*) &client, zeroes, sizeof(zeroes)); buf = uv_buf_init(zeroes, sizeof(zeroes));
r = uv_try_write((uv_stream_t*) &client, &buf, 1);
ASSERT(r >= 0); ASSERT(r >= 0);
bytes_written += r; bytes_written += r;