[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