[PEAK] events.io_events.Selector question
Phillip J. Eby
pje at telecommunity.com
Wed Jul 4 21:22:42 EDT 2007
At 04:15 PM 7/4/2007 +0300, ilja wrote:
>Hello.
>
>I can't get trough one type of error working with sockets and PEAK
>'Selector' class.
>I have a socket that is being monitored (using Selector) for
>'readable' and 'writable' state.
>Event source is being obtained using binding.Make.
>[cut]
>readable_evt = binding.Make(lambda self: self.selector.readable(self.socket))
>writable_evt = binding.Make(lambda self: self.selector.writable(self.socket))
>[/cut]
>After each event firing I subscribe object's callback to for this
>event using 'addCallback' method. The cancelers for last subscribed
>callbacks are being stored.
>
>So, when i need to close socket, I first call canceler methods, and
>then socket.close() method.
>It just happens that sometimes my socket objects (after cancelers
>are called and sockets are closed) are not being deleted from
>'Selector' socket cache. So, during next Selector's 'monitor' method
>iteration I get error """(10038, 'An operation was attempted on
>something that is not a socket')""" (It is being raised because my
>closed socket is being given to select() function).
>
>Because of this error PEAK reactor falls apart and application terminates.
>Basically, I would like to know what I'm doing wrong and how to fix it. :)
I think it's not you, it's me. :) It looks like AbstractIOEvent
doesn't update its activation when callbacks are cancelled. Try the
patch below for now and let me know if it fixes your problem. If so,
I will add a test and get it into SVN for you.
Index: src/peak/events/io_events.py
===================================================================
--- src/peak/events/io_events.py (revision 2125)
+++ src/peak/events/io_events.py (working copy)
@@ -69,7 +69,8 @@
def addCallback(self,func):
try:
- return super(AbstractIOEvent,self).addCallback(func)
+ canceller = super(AbstractIOEvent,self).addCallback(func)
+ return lambda: (canceller(), self._register())
finally:
self._register()
More information about the PEAK
mailing list