Ticket #40: 1741.diff

File 1741.diff, 2.4 kB (added by tmm1, 1 year ago)

writev instead of send

  • a/ext/ed.cpp

    old new  
    581581        } 
    582582 
    583583        LastIo = gCurrentLoopTime; 
    584         char output_buffer [16 * 1024]; 
     584        // char output_buffer [16 * 1024]; 
    585585        size_t nbytes = 0; 
    586586 
     587        /* 
    587588        while ((OutboundPages.size() > 0) && (nbytes < sizeof(output_buffer))) { 
    588589                OutboundPage *op = &(OutboundPages[0]); 
    589590                if ((nbytes + op->Length - op->Offset) < sizeof (output_buffer)) { 
     
    599600                        nbytes += len; 
    600601                } 
    601602        } 
     603        */ 
     604 
     605        int iovcnt = OutboundPages.size(); 
     606        struct iovec iov[ iovcnt ]; 
     607 
     608        for(int i = 0; i < iovcnt; i++){ 
     609                OutboundPage *op = &(OutboundPages[i]); 
     610                iov[i].iov_base = (void *)(op->Buffer + op->Offset); 
     611                iov[i].iov_len  = op->Length - op->Offset; 
     612                nbytes += (op->Length - op->Offset); 
     613        } 
    602614 
    603615        // We should never have gotten here if there were no data to write, 
    604616        // so assert that as a sanity check. 
     
    607619        assert (nbytes > 0); 
    608620 
    609621        assert (GetSocket() != INVALID_SOCKET); 
    610         int bytes_written = send (GetSocket(), output_buffer, nbytes, 0); 
     622        // int bytes_written = send (GetSocket(), output_buffer, nbytes, 0); 
     623        int bytes_written = writev(GetSocket(), iov, iovcnt); 
    611624 
    612625        if (bytes_written > 0) { 
    613626                OutboundDataSize -= bytes_written; 
     627 
     628                int sent = bytes_written; 
     629                for(int i = 0; i < iovcnt; i++) { 
     630                        if (iov[i].iov_len <= sent) { 
     631                                OutboundPages.pop_front(); 
     632                                sent -= iov[i].iov_len; 
     633                        } else { 
     634                                OutboundPage *op = &(OutboundPages[i]); 
     635                                op->Offset += sent; 
     636                        } 
     637                } 
     638 
     639                /* 
    614640                if ((size_t)bytes_written < nbytes) { 
    615641                        int len = nbytes - bytes_written; 
    616642                        char *buffer = (char*) malloc (len + 1); 
     
    620646                        buffer [len] = 0; 
    621647                        OutboundPages.push_front (OutboundPage (buffer, len)); 
    622648                } 
     649                */ 
    623650 
    624651                #ifdef HAVE_EPOLL 
    625652                EpollEvent.events = (EPOLLIN | (SelectForWrite() ? EPOLLOUT : 0)); 
  • a/ext/project.h

    old new  
    4444#include <sys/types.h> 
    4545#include <sys/stat.h> 
    4646#include <sys/socket.h> 
     47#include <sys/uio.h> 
    4748#include <sys/un.h> 
    4849#include <sys/resource.h> 
    4950#include <sys/wait.h>