# HG changeset patch # User jbe # Date 1429151061 -7200 # Node ID 293e666a41e09005ff2da8706c925d6f2de254da # Parent 89fc89b22e280983b3fcdb395151b7c7d20d6fe4 Revised flushing behavior of write_nb(...) diff -r 89fc89b22e28 -r 293e666a41e0 moonbridge_io.c --- a/moonbridge_io.c Wed Apr 15 00:59:52 2015 +0200 +++ b/moonbridge_io.c Thu Apr 16 04:24:21 2015 +0200 @@ -48,6 +48,7 @@ int readbufout; int writeerr; size_t writeleft; + size_t flushedleft; #if LUA_VERSION_NUM >= 503 lua_Integer writeqin; lua_Integer writeqout; @@ -287,12 +288,14 @@ lua_rawseti(L, -2, handle->writeqin++); handle->writeleft += strlen; } + if (flush) handle->flushedleft = handle->writeleft; + if (handle->flushedleft) moonbr_io_handle_set_nopush(L, handle, 0); while (handle->writeqout != handle->writeqin) { lua_rawgeti(L, -1, handle->writeqout); str = lua_tolstring(L, -1, &strlen); while (handle->writeqoff < strlen) { if ( - strlen - handle->writeqoff <= + strlen - handle->writeqoff < MOONBR_IO_WRITEBUFLEN - handle->writebufin ) { memcpy( @@ -303,7 +306,6 @@ handle->writebufin += strlen - handle->writeqoff; break; } else { - moonbr_io_handle_set_nopush(L, handle, 1); memcpy( handle->writebuf + handle->writebufin, str + handle->writeqoff, @@ -311,6 +313,7 @@ ); handle->writeqoff += MOONBR_IO_WRITEBUFLEN - handle->writebufin; while (handle->writebufout < MOONBR_IO_WRITEBUFLEN) { + if (!handle->flushedleft) moonbr_io_handle_set_nopush(L, handle, 1); written = write( handle->fd, handle->writebuf + handle->writebufout, @@ -328,6 +331,8 @@ } else { handle->writebufout += written; handle->writeleft -= written; + if (written >= handle->flushedleft) handle->flushedleft = 0; + else handle->flushedleft -= written; } } handle->writebufin = 0; @@ -339,28 +344,29 @@ lua_pushnil(L); lua_rawseti(L, -2, handle->writeqout++); } - if (flush) { - moonbr_io_handle_set_nopush(L, handle, 0); - while (handle->writebufout < handle->writebufin) { - written = write( - handle->fd, - handle->writebuf + handle->writebufout, - handle->writebufin - handle->writebufout - ); - if (written < 0) { - if (nonblocking && (errno == EAGAIN || errno == EWOULDBLOCK)) { - goto moonbr_io_write_impl_block; - } else if (errno != EINTR) { - moonbr_io_errmsg(); - lua_pushnil(L); - lua_pushstring(L, errmsg); - return 2; - } - } else { - handle->writebufout += written; - handle->writeleft -= written; + while (handle->flushedleft) { + written = write( + handle->fd, + handle->writebuf + handle->writebufout, + handle->writebufin - handle->writebufout + ); + if (written < 0) { + if (nonblocking && (errno == EAGAIN || errno == EWOULDBLOCK)) { + goto moonbr_io_write_impl_block; + } else if (errno != EINTR) { + moonbr_io_errmsg(); + lua_pushnil(L); + lua_pushstring(L, errmsg); + return 2; } + } else { + handle->writebufout += written; + handle->writeleft -= written; + if (written >= handle->flushedleft) handle->flushedleft = 0; + else handle->flushedleft -= written; } + } + if (handle->writebufout == handle->writebufin) { handle->writebufin = 0; handle->writebufout = 0; } @@ -527,6 +533,7 @@ handle->readbufout = 0; handle->writeerr = 0; handle->writeleft = 0; + handle->flushedleft = 0; handle->writeqin = 0; handle->writeqout = 0; handle->writeqoff = 0;