summaryrefslogtreecommitdiff
path: root/src/network_win32_send.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/network_win32_send.c')
-rw-r--r--src/network_win32_send.c26
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;