Ticket #5562: abstract.diff
| File abstract.diff, 4.2 KB (added by BrianMatthews, 4 months ago) |
|---|
-
.py
old new 146 146 147 147 # write stuff 148 148 dataBuffer = '' 149 offset = 0150 149 writing = False 151 150 _writeScheduled = None 152 151 _writeDisconnecting = False 153 152 _writeDisconnected = False 154 153 writeBufferSize = 2**2**2**2 154 writePending = False 155 155 156 156 157 157 def loseWriteConnection(self): … … 168 168 # in current code should never be called 169 169 self.connectionLost(reason) 170 170 171 172 171 def startWriting(self): 173 172 self.reactor.addActiveHandle(self) 174 173 self.writing = True 175 if not self. _writeScheduled:174 if not self.writePending and not self._writeScheduled: 176 175 self._writeScheduled = self.reactor.callLater(0, 177 176 self._resumeWriting) 178 177 179 180 178 def stopWriting(self): 181 179 if self._writeScheduled: 182 180 self._writeScheduled.cancel() 183 181 self._writeScheduled = None 184 182 self.writing = False 185 183 186 187 184 def _resumeWriting(self): 188 185 self._writeScheduled = None 189 186 self.doWrite() 190 187 191 188 192 189 def _cbWrite(self, rc, bytes, evt): 190 self.writePending = False 193 191 if self._handleWrite(rc, bytes, evt): 194 192 self.doWrite() 195 193 … … 208 206 (errno.errorcode.get(rc, 'unknown'), rc)))) 209 207 return False 210 208 else: 211 self.offset += bytes212 209 # 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: 214 211 self.dataBuffer = "" 215 self.offset = 0216 212 # stop writing 217 213 self.stopWriting() 218 214 # If I've got a producer who is supposed to supply me with data … … 227 223 self.connectionLost(failure.Failure(main.CONNECTION_DONE)) 228 224 elif self._writeDisconnecting: 229 225 # I was previously asked to to half-close the connection. 226 self._closeWriteConnection() 230 227 self._writeDisconnected = True 231 self._closeWriteConnection()232 228 return False 233 229 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 = "" 234 236 return True 235 237 236 238 237 239 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: 239 246 # If there is currently less than SEND_LIMIT bytes left to send 240 247 # 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) 244 249 self._tempDataBuffer = [] 245 250 self._tempDataLen = 0 246 251 247 252 evt = _iocp.Event(self._cbWrite, self) 248 253 249 254 # 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) 252 259 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 257 261 258 259 262 def writeToHandle(self, buff, evt): 260 263 raise NotImplementedError() # TODO: this should default to WriteFile 261 264
