def doWrite(self): numWrites = 0 while 1: if len(self.dataBuffer) - self.offset < self.SEND_LIMIT: # If there is currently less than SEND_LIMIT bytes left to send # in the string, extend it with the array data. self.dataBuffer = (buffer(self.dataBuffer, self.offset) + "".join(self._tempDataBuffer)) self.offset = 0 self._tempDataBuffer = [] self._tempDataLen = 0 evt = _iocp.Event(self._cbWrite, self) # Send as much data as you can. if self.offset: evt.buff = buff = buffer(self.dataBuffer, self.offset) else: evt.buff = buff = self.dataBuffer rc, bytes = self.writeToHandle(buff, evt) if (rc == ERROR_IO_PENDING or (not rc and numWrites >= self.maxWrites)): break else: evt.ignore = True if not self._handleWrite(rc, bytes, evt): break numWrites += 1
def doRead(self): evt = _iocp.Event(self._cbRead, self) evt.buff = buff = self._readBuffers rc, bytes = self.readFromHandle(buff, evt) if not rc or rc == ERROR_IO_PENDING: self._readScheduledInOS = True else: self._handleRead(rc, bytes, evt)
def doRead(self): evt = _iocp.Event(self.cbRead, self) evt.buff = buff = self._readBuffers[0] evt.addr_buff = addr_buff = self.addressBuffer evt.addr_len_buff = addr_len_buff = self.addressLengthBuffer rc, data = _iocp.recvfrom(self.getFileHandle(), buff, addr_buff, addr_len_buff, evt) if rc and rc != ERROR_IO_PENDING: self.handleRead(rc, data, evt)
def doAccept(self): evt = _iocp.Event(self.cbAccept, self) # see AcceptEx documentation evt.buff = buff = bytearray(2 * (self.addrLen + 16)) evt.newskt = newskt = self.reactor.createSocket( self.addressFamily, self.socketType) rc = _iocp.accept(self.socket.fileno(), newskt.fileno(), buff, evt) if rc and rc != ERROR_IO_PENDING: self.handleAccept(rc, evt)
def doConnect(self): if not hasattr(self, "connector"): # this happens if we connector.stopConnecting in # factory.startedConnecting return assert _iocp.have_connectex self.reactor.addActiveHandle(self) evt = _iocp.Event(self.cbConnect, self) rc = _iocp.connect(self.socket.fileno(), self.realAddress, evt) if rc and rc != ERROR_IO_PENDING: self.cbConnect(rc, 0, evt)
def doRead(self): numReads = 0 while 1: evt = _iocp.Event(self._cbRead, self) evt.buff = buff = self._readBuffers rc, bytes = self.readFromHandle(buff, evt) if (rc == ERROR_IO_PENDING or (not rc and numReads >= self.maxReads)): self._readScheduledInOS = True break else: evt.ignore = True if not self._handleRead(rc, bytes, evt): break numReads += 1
def doRead(self): read = 0 while self.reading: evt = _iocp.Event(self.cbRead, self) evt.buff = buff = self._readBuffers[0] evt.addr_buff = addr_buff = self.addressBuffer rc, bytes = _iocp.recvfrom(self.getFileHandle(), buff, addr_buff, evt) if (rc == ERROR_IO_PENDING or (not rc and read >= self.maxThroughput)): break else: evt.ignore = True self.handleRead(rc, bytes, evt) read += bytes
def doWrite(self): if len(self.dataBuffer) - self.offset < self.SEND_LIMIT: # If there is currently less than SEND_LIMIT bytes left to send # in the string, extend it with the array data. self.dataBuffer = (buffer(self.dataBuffer, self.offset) + "".join(self._tempDataBuffer)) self.offset = 0 self._tempDataBuffer = [] self._tempDataLen = 0 evt = _iocp.Event(self._cbWrite, self) # Send as much data as you can. if self.offset: evt.buff = buff = buffer(self.dataBuffer, self.offset) else: evt.buff = buff = self.dataBuffer rc, bytes = self.writeToHandle(buff, evt) if rc and rc != ERROR_IO_PENDING: self._handleWrite(rc, bytes, evt)
def doAccept(self): numAccepts = 0 while 1: evt = _iocp.Event(self.cbAccept, self) # see AcceptEx documentation evt.buff = buff = _iocp.AllocateReadBuffer(2 * (self.addrLen + 16)) evt.newskt = newskt = self.reactor.createSocket( self.addressFamily, self.socketType) rc = _iocp.accept(self.socket.fileno(), newskt.fileno(), buff, evt) if (rc == ERROR_IO_PENDING or (not rc and numAccepts >= self.maxAccepts)): break else: evt.ignore = True if not self.handleAccept(rc, evt): break numAccepts += 1
def test_maxEventsPerIteration(self): """ Verify that we don't lose an event when more than EVENTS_PER_LOOP events occur in the same reactor iteration """ class FakeFD: counter = 0 def logPrefix(self): return 'FakeFD' def cb(self, rc, bytes, evt): self.counter += 1 ir = IOCPReactor() fd = FakeFD() event = _iocp.Event(fd.cb, fd) for _ in range(EVENTS_PER_LOOP + 1): ir.port.postEvent(0, KEY_NORMAL, event) ir.doIteration(None) self.assertEquals(fd.counter, EVENTS_PER_LOOP) ir.doIteration(0) self.assertEquals(fd.counter, EVENTS_PER_LOOP + 1)