[PEAK] events.io_events.Selector question
Alexey Luchko
luch at ank-sia.com
Thu Jul 5 11:29:23 EDT 2007
Phillip J. Eby wrote:
> 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()
>
Hi,
Thank you, it helps :)
It fixes the problem.
Regards,
Alexey Luchko.
More information about the PEAK
mailing list