From 87a5dae12cd584540908a1e58860fc2b5b03246f Mon Sep 17 00:00:00 2001 From: Will Date: Fri, 21 Jun 2013 12:31:05 +0900 Subject: [PATCH] correctly handle partial writes --- src/wrk.c | 14 +++++++++++--- src/wrk.h | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/wrk.c b/src/wrk.c index 4859fcc..75da007 100644 --- a/src/wrk.c +++ b/src/wrk.c @@ -279,6 +279,7 @@ static int connect_socket(thread *thread, connection *c) { http_parser_init(&c->parser, HTTP_RESPONSE); c->parser.data = c; c->fd = fd; + c->written = 0; return fd; @@ -390,10 +391,17 @@ static int check_timeouts(aeEventLoop *loop, long long id, void *data) { static void socket_writeable(aeEventLoop *loop, int fd, void *data, int mask) { connection *c = data; + size_t len = req.size - c->written; + ssize_t n; - if (write(fd, req.buf, req.size) < req.size) goto error; - c->start = time_us(); - aeDeleteFileEvent(loop, fd, AE_WRITABLE); + if ((n = write(fd, req.buf + c->written, len)) < 0) goto error; + if (!c->written) c->start = time_us(); + + c->written += n; + if (c->written == req.size) { + c->written = 0; + aeDeleteFileEvent(loop, fd, AE_WRITABLE); + } return; diff --git a/src/wrk.h b/src/wrk.h index 9c4637a..845805c 100644 --- a/src/wrk.h +++ b/src/wrk.h @@ -50,6 +50,7 @@ typedef struct connection { http_parser parser; int fd; uint64_t start; + size_t written; char buf[RECVBUF]; } connection;