diff options
Diffstat (limited to 'src/network_win32_send.c')
-rw-r--r-- | src/network_win32_send.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/network_win32_send.c b/src/network_win32_send.c index b6d59303..0ee3f4aa 100644 --- a/src/network_win32_send.c +++ b/src/network_win32_send.c @@ -30,7 +30,7 @@ */ NETWORK_BACKEND_READ(win32recv) { - int toread; + int toread, read_offset; buffer *b; off_t r, start_bytes_in; off_t max_read = 256 * 1024; @@ -45,15 +45,21 @@ NETWORK_BACKEND_READ(win32recv) start_bytes_in = cq->bytes_in; - /* use a chunk-size of 16k */ + /* use a chunk-size of 4k, append to last buffer if it has >= 1kb free */ +#define TOREAD 4096 + do { - toread = 16384; + b = (cq->last) ? cq->last->mem : NULL; - b = chunkqueue_get_append_buffer(cq); + if (NULL == b || b->size - b->used < 1024) { + b = chunkqueue_get_append_buffer(cq); + buffer_prepare_copy(b, TOREAD+1); + } - buffer_prepare_copy(b, toread); + read_offset = (b->used == 0) ? 0 : b->used - 1; + toread = b->size - 1 - read_offset; - if (-1 == (r = recv(sock->fd, b->ptr, toread, 0))) { + if (-1 == (r = recv(sock->fd, b->ptr + read_offset, toread, 0))) { switch (light_sock_errno()) { case EAGAIN: case EWOULDBLOCK: @@ -76,17 +82,19 @@ NETWORK_BACKEND_READ(win32recv) read_something = 1; - b->used = r; + if (b->used > 0) b->used--; + b->used += r; b->ptr[b->used++] = '\0'; + cq->bytes_in += r; if (cq->bytes_in - start_bytes_in > max_read) break; - } while (r == toread); + } while (r == toread); return NETWORK_STATUS_SUCCESS; } -NETWORK_BACKEND_WRITE(win32send) +NETWORK_BACKEND_WRITE(win32send) { chunk *c; size_t chunks_written = 0; |