Ticket #3682: 3682-svn-diff.patch

File 3682-svn-diff.patch, 4.2 KB (added by gthomas, 7 years ago)

The modification as "svn diff"

  • abstract.py

     
    9191                                  reflect.qual(self.__class__))
    9292
    9393    def doWrite(self):
     94        """Called when data can be written.
     95        A result that is true (which will be a negative number) implies the
     96        connection was lost. A false result implies the connection is still
     97        there; a result of 0 implies no write was done, and a result of None
     98        indicates that a write was done.
    9499        """
    95         Called when data can be written.
    96 
    97         A result that is true (which will be a negative number or an
    98         exception instance) indicates that the connection was lost. A false
    99         result implies the connection is still there; a result of 0
    100         indicates no write was done, and a result of None indicates that a
    101         write was done.
    102         """
    103         if len(self.dataBuffer) - self.offset < self.SEND_LIMIT:
    104             # If there is currently less than SEND_LIMIT bytes left to send
    105             # in the string, extend it with the array data.
    106             self.dataBuffer = buffer(self.dataBuffer, self.offset) + "".join(self._tempDataBuffer)
    107             self.offset = 0
    108             self._tempDataBuffer = []
    109             self._tempDataLen = 0
    110 
    111         # Send as much data as you can.
    112         if self.offset:
    113             l = self.writeSomeData(buffer(self.dataBuffer, self.offset))
    114         else:
    115             l = self.writeSomeData(self.dataBuffer)
    116 
    117         # There is no writeSomeData implementation in Twisted which returns
    118         # 0, but the documentation for writeSomeData used to claim negative
    119         # integers meant connection lost.  Keep supporting this here,
    120         # although it may be worth deprecating and removing at some point.
    121         if l < 0 or isinstance(l, Exception):
    122             return l
    123         if l == 0 and self.dataBuffer:
    124             result = 0
    125         else:
    126             result = None
    127         self.offset += l
     100        while 1:
     101            # always try to do something
     102            # quit when dataBuffer size is acceptably low (see end)
     103            if len(self.dataBuffer) - self.offset < self.SEND_LIMIT:
     104                # If there is currently less than SEND_LIMIT bytes left to send
     105                # in the string, extend it with the array data.
     106                buf = []
     107                accum = len(self.dataBuffer)-self.offset
     108                m = 2 * max(self.SEND_LIMIT, self.bufferSize)
     109                chunk = None
     110                while self._tempDataBuffer and accum < m:
     111                    # don't want to join too much data at once
     112                    chunk = self._tempDataBuffer.pop(0)
     113                    buf.append(chunk)
     114                    n = len(chunk)
     115                    accum += n
     116                    self._tempDataLen -= n
     117                del chunk, accum, m
     118                self.dataBuffer = (buffer(self.dataBuffer, self.offset) + "".join(buf))
     119                del buf
     120                self.offset = 0
     121            # Send as much data as you can.
     122            if self.offset:
     123                l = self.writeSomeData(buffer(self.dataBuffer, self.offset))
     124            else:
     125                l = self.writeSomeData(self.dataBuffer)
     126            # There is no writeSomeData implementation in Twisted which returns
     127            # 0, but the documentation for writeSomeData used to claim negative
     128            # integers meant connection lost.  Keep supporting this here,
     129            # although it may be worth deprecating and removing at some point.
     130            if l < 0 or isinstance(l, Exception):
     131                return l
     132            if l == 0 and self.dataBuffer:
     133                # Couldn't send data
     134                result = 0
     135                break
     136            else:
     137                result = None
     138            self.offset += l
     139            if len(self.dataBuffer) - self.offset + self._tempDataLen < self.bufferSize:
     140              # quit, 'cause dataBuffer AND _tempDataBuffer is small enough
     141              break
     142        #
    128143        # If there is nothing left to send,
    129144        if self.offset == len(self.dataBuffer) and not self._tempDataLen:
    130145            self.dataBuffer = ""