diff --git a/ext/ed.cpp b/ext/ed.cpp index 135cb2d..b885d8b 100644 --- a/ext/ed.cpp +++ b/ext/ed.cpp @@ -581,9 +581,10 @@ void ConnectionDescriptor::_WriteOutboundData() } LastIo = gCurrentLoopTime; - char output_buffer [16 * 1024]; + // char output_buffer [16 * 1024]; size_t nbytes = 0; + /* while ((OutboundPages.size() > 0) && (nbytes < sizeof(output_buffer))) { OutboundPage *op = &(OutboundPages[0]); if ((nbytes + op->Length - op->Offset) < sizeof (output_buffer)) { @@ -599,6 +600,17 @@ void ConnectionDescriptor::_WriteOutboundData() nbytes += len; } } + */ + + int iovcnt = OutboundPages.size(); + struct iovec iov[ iovcnt ]; + + for(int i = 0; i < iovcnt; i++){ + OutboundPage *op = &(OutboundPages[i]); + iov[i].iov_base = (void *)(op->Buffer + op->Offset); + iov[i].iov_len = op->Length - op->Offset; + nbytes += (op->Length - op->Offset); + } // We should never have gotten here if there were no data to write, // so assert that as a sanity check. @@ -607,10 +619,24 @@ void ConnectionDescriptor::_WriteOutboundData() assert (nbytes > 0); assert (GetSocket() != INVALID_SOCKET); - int bytes_written = send (GetSocket(), output_buffer, nbytes, 0); + // int bytes_written = send (GetSocket(), output_buffer, nbytes, 0); + int bytes_written = writev(GetSocket(), iov, iovcnt); if (bytes_written > 0) { OutboundDataSize -= bytes_written; + + int sent = bytes_written; + for(int i = 0; i < iovcnt; i++) { + if (iov[i].iov_len <= sent) { + OutboundPages.pop_front(); + sent -= iov[i].iov_len; + } else { + OutboundPage *op = &(OutboundPages[i]); + op->Offset += sent; + } + } + + /* if ((size_t)bytes_written < nbytes) { int len = nbytes - bytes_written; char *buffer = (char*) malloc (len + 1); @@ -620,6 +646,7 @@ void ConnectionDescriptor::_WriteOutboundData() buffer [len] = 0; OutboundPages.push_front (OutboundPage (buffer, len)); } + */ #ifdef HAVE_EPOLL EpollEvent.events = (EPOLLIN | (SelectForWrite() ? EPOLLOUT : 0)); diff --git a/ext/project.h b/ext/project.h index 8fe0f63..4fe9e9d 100644 --- a/ext/project.h +++ b/ext/project.h @@ -44,6 +44,7 @@ See the file COPYING for complete licensing information. #include #include #include +#include #include #include #include