Skip to content
This repository has been archived by the owner on Feb 14, 2020. It is now read-only.

Commit

Permalink
More Stream undos: Get rid of the set/unset paranoia
Browse files Browse the repository at this point in the history
Test shows that the new code is as fast as the old code, and the
new code is significantly smaller.  Yeah!
  • Loading branch information
bassosimone committed Jan 11, 2011
1 parent ab45c25 commit 5494114
Showing 1 changed file with 26 additions and 35 deletions.
61 changes: 26 additions & 35 deletions neubot/net/streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,28 +129,6 @@ def readable(self):
def writable(self):
self.handleWritable()

def set_readable(self, func):
if not self.handleReadable:
self.poller.set_readable(self)
if self.handleReadable != func:
self.handleReadable = func

def set_writable(self, func):
if not self.handleWritable:
self.poller.set_writable(self)
if self.handleWritable != func:
self.handleWritable = func

def unset_readable(self):
if self.handleReadable:
self.poller.unset_readable(self)
self.handleReadable = None

def unset_writable(self):
if self.handleWritable:
self.poller.unset_writable(self)
self.handleWritable = None

def recv(self, maxlen, recv_success):
if self.isclosed:
return
Expand All @@ -163,17 +141,20 @@ def recv(self, maxlen, recv_success):
if self.recvblocked:
return

self.set_readable(self._do_recv)
self.poller.set_readable(self)
self.handleReadable = self._do_recv

def _do_recv(self):
if self.recvblocked:
return

if self.sendblocked:
if self.send_pending:
self.set_writable(self._do_send)
self.poller.set_writable(self)
self.handleWritable = self._do_send
else:
self.unset_writable()
self.poller.unset_writable(self)
self.handleWritable = None
self.sendblocked = 0

status, octets = self.sorecv(self.recv_maxlen)
Expand All @@ -186,17 +167,20 @@ def _do_recv(self):
self.recv_success = None
self.recv_ticks = 0
self.recv_pending = 0
self.unset_readable()
self.poller.unset_readable(self)
self.handleReadable = None
if notify:
notify(self, octets)
return

if status == WANT_READ:
self.set_readable(self._do_recv)
self.poller.set_readable(self)
self.handleReadable = self._do_recv
return

if status == WANT_WRITE:
self.set_writable(self._do_recv)
self.poller.set_writable(self)
self.handleWritable = self._do_recv
self.sendblocked = 1
return

Expand Down Expand Up @@ -228,17 +212,20 @@ def send(self, octets, send_success):
if self.sendblocked:
return

self.set_writable(self._do_send)
self.poller.set_writable(self)
self.handleWritable = self._do_send

def _do_send(self):
if self.sendblocked:
return

if self.recvblocked:
if self.recv_pending:
self.set_readable(self._do_recv)
self.poller.set_readable(self)
self.handleReadable = self._do_recv
else:
self.unset_readable()
self.poller.unset_readable(self)
self.handleReadable = None
self.recvblocked = 0

status, count = self.sosend(self.send_octets)
Expand All @@ -254,25 +241,29 @@ def _do_send(self):
self.send_success = None
self.send_ticks = 0
self.send_pending = 0
self.unset_writable()
self.poller.unset_writable(self)
self.handleWritable = None
if notify:
notify(self, octets)
return

if count < len(self.send_octets):
self.send_octets = buffer(self.send_octets, count)
self.send_ticks = ticks()
self.set_writable(self._do_send)
self.poller.set_writable(self)
self.handleWritable = self._do_send
return

raise RuntimeError("Sent more than expected")

if status == WANT_WRITE:
self.set_writable(self._do_send)
self.poller.set_writable(self)
self.handleWritable = self._do_send
return

if status == WANT_READ:
self.set_readable(self._do_send)
self.poller.set_readable(self)
self.handleReadable = self._do_send
self.recvblocked = 1
return

Expand Down

0 comments on commit 5494114

Please sign in to comment.