Ticket #5562: abstract.diff

File abstract.diff, 4.2 KB (added by BrianMatthews, 19 months ago)
  • .py

    old new  
    146146 
    147147    # write stuff 
    148148    dataBuffer = '' 
    149     offset = 0 
    150149    writing = False 
    151150    _writeScheduled = None 
    152151    _writeDisconnecting = False 
    153152    _writeDisconnected = False 
    154153    writeBufferSize = 2**2**2**2 
     154    writePending = False 
    155155 
    156156 
    157157    def loseWriteConnection(self): 
     
    168168        # in current code should never be called 
    169169        self.connectionLost(reason) 
    170170 
    171  
    172171    def startWriting(self): 
    173172        self.reactor.addActiveHandle(self) 
    174173        self.writing = True 
    175         if not self._writeScheduled: 
     174        if not self.writePending and not self._writeScheduled: 
    176175            self._writeScheduled = self.reactor.callLater(0, 
    177176                                                          self._resumeWriting) 
    178177 
    179  
    180178    def stopWriting(self): 
    181179        if self._writeScheduled: 
    182180            self._writeScheduled.cancel() 
    183181            self._writeScheduled = None 
    184182        self.writing = False 
    185183 
    186  
    187184    def _resumeWriting(self): 
    188185        self._writeScheduled = None 
    189186        self.doWrite() 
    190187 
    191188 
    192189    def _cbWrite(self, rc, bytes, evt): 
     190        self.writePending = False 
    193191        if self._handleWrite(rc, bytes, evt): 
    194192            self.doWrite() 
    195193 
     
    208206                                    (errno.errorcode.get(rc, 'unknown'), rc)))) 
    209207            return False 
    210208        else: 
    211             self.offset += bytes 
    212209            # If there is nothing left to send, 
    213             if self.offset == len(self.dataBuffer) and not self._tempDataLen: 
     210            if bytes == len(self.dataBuffer) and not self._tempDataLen: 
    214211                self.dataBuffer = "" 
    215                 self.offset = 0 
    216212                # stop writing 
    217213                self.stopWriting() 
    218214                # If I've got a producer who is supposed to supply me with data 
     
    227223                    self.connectionLost(failure.Failure(main.CONNECTION_DONE)) 
    228224                elif self._writeDisconnecting: 
    229225                    # I was previously asked to to half-close the connection. 
     226                    self._closeWriteConnection() 
    230227                    self._writeDisconnected = True 
    231                     self._closeWriteConnection() 
    232228                return False 
    233229            else: 
     230                if bytes > 0: 
     231                      if bytes < len(self.dataBuffer): 
     232                        # remove processed bytes 
     233                        self.dataBuffer = buffer(self.dataBuffer, bytes) 
     234                    else: 
     235                        self.databuffer = "" 
    234236                return True 
    235237 
    236238 
    237239    def doWrite(self): 
    238         if len(self.dataBuffer) - self.offset < self.SEND_LIMIT: 
     240        ''' should only called when no current write is pending,  
     241            we dont know where to start the write from until we know how many were written 
     242        ''' 
     243        if self.writePending: 
     244            return 
     245        if len(self.dataBuffer) < self.SEND_LIMIT: 
    239246            # If there is currently less than SEND_LIMIT bytes left to send 
    240247            # in the string, extend it with the array data. 
    241             self.dataBuffer = (buffer(self.dataBuffer, self.offset) + 
    242                                "".join(self._tempDataBuffer)) 
    243             self.offset = 0 
     248            self.dataBuffer += "".join(self._tempDataBuffer) 
    244249            self._tempDataBuffer = [] 
    245250            self._tempDataLen = 0 
    246251 
    247252        evt = _iocp.Event(self._cbWrite, self) 
    248253 
    249254        # Send as much data as you can. 
    250         if self.offset: 
    251             evt.buff = buff = buffer(self.dataBuffer, self.offset) 
     255        evt.buff = buff = self.dataBuffer 
     256        rc, _bytes = self.writeToHandle(buff, evt) 
     257        if rc and rc != ERROR_IO_PENDING: 
     258            self._handleWrite(rc, 0, evt) 
    252259        else: 
    253             evt.buff = buff = self.dataBuffer 
    254         rc, bytes = self.writeToHandle(buff, evt) 
    255         if rc and rc != ERROR_IO_PENDING: 
    256             self._handleWrite(rc, bytes, evt) 
     260            self.writePending = True 
    257261 
    258  
    259262    def writeToHandle(self, buff, evt): 
    260263        raise NotImplementedError() # TODO: this should default to WriteFile 
    261264