diff --git a/include/lighttpd/network.h b/include/lighttpd/network.h index 5de59ea..024fed5 100644 --- a/include/lighttpd/network.h +++ b/include/lighttpd/network.h @@ -13,7 +13,8 @@ typedef enum { NETWORK_STATUS_SUCCESS, /**< some IO was actually done (read/write) or cq was empty for write */ NETWORK_STATUS_FATAL_ERROR, NETWORK_STATUS_CONNECTION_CLOSE, - NETWORK_STATUS_WAIT_FOR_EVENT, /**< read/write returned -1 with errno=EAGAIN/EWOULDBLOCK; no real IO was done */ + NETWORK_STATUS_WAIT_FOR_EVENT, /**< read/write returned -1 with errno=EAGAIN/EWOULDBLOCK; no real IO was done + internal: some io may be done */ NETWORK_STATUS_WAIT_FOR_AIO_EVENT, /**< nothing done yet, read/write will be done somewhere else */ NETWORK_STATUS_WAIT_FOR_FD, /**< need a fd to open a file */ } network_status_t; diff --git a/src/connection.c b/src/connection.c index 86c212b..91818a6 100644 --- a/src/connection.c +++ b/src/connection.c @@ -206,7 +206,6 @@ static void connection_cb(struct ev_loop *loop, ev_io *w, int revents) { } if (revents & EV_WRITE) { - ev_io_rem_events(loop, w, EV_WRITE); if (con->raw_out->length > 0) { switch (network_write(con->mainvr, w->fd, con->raw_out)) { case NETWORK_STATUS_SUCCESS: @@ -222,12 +221,19 @@ static void connection_cb(struct ev_loop *loop, ev_io *w, int revents) { case NETWORK_STATUS_WAIT_FOR_EVENT: break; case NETWORK_STATUS_WAIT_FOR_AIO_EVENT: + ev_io_rem_events(loop, w, EV_WRITE); + CON_ERROR(con, "%s", "TODO: wait for aio"); /* TODO: aio */ break; case NETWORK_STATUS_WAIT_FOR_FD: + ev_io_rem_events(loop, w, EV_WRITE); + CON_ERROR(con, "%s", "TODO: wait for fd"); /* TODO: wait for fd */ break; } + } else { + CON_TRACE(con, "%s", "write event for empty queue"); + ev_io_rem_events(loop, w, EV_WRITE); } } diff --git a/src/network.c b/src/network.c index 3fc1b91..a894e7f 100644 --- a/src/network.c +++ b/src/network.c @@ -74,6 +74,8 @@ network_status_t network_write(vrequest *vr, int fd, chunkqueue *cq) { #else res = network_write_writev(con, fd, cq, &write_bytes); #endif + wrote = write_max - write_bytes; + if (wrote > 0 && res == NETWORK_STATUS_WAIT_FOR_EVENT) res = NETWORK_STATUS_SUCCESS; #ifdef TCP_CORK if (corked) { @@ -92,7 +94,6 @@ network_status_t network_write(vrequest *vr, int fd, chunkqueue *cq) { } /* stats */ - wrote = write_max - write_bytes; wrk = vr->con->wrk; wrk->stats.bytes_out += wrote; vr->con->stats.bytes_out += wrote;