qmsk/net/lib/event2/event.pyx
changeset 52 722fc70a197a
parent 50 da394bb715af
child 57 8c4032265c8c
equal deleted inserted replaced
51:c6b4abfc21da 52:722fc70a197a
    51         # libevent seems to segfault otherwise...
    51         # libevent seems to segfault otherwise...
    52         if events & (lib.EV_READ | lib.EV_WRITE) and fd < 0 :
    52         if events & (lib.EV_READ | lib.EV_WRITE) and fd < 0 :
    53             raise ValueError(fd)
    53             raise ValueError(fd)
    54 
    54 
    55         # construct event using our internal callback, with self as the arg
    55         # construct event using our internal callback, with self as the arg
    56         self.ev = lib.event_new(base.ev_base, fd, events, ev_callback, <void *>self)
    56         self.ev = lib.event_new(base.ev_base, fd, events, ev_callback, <void *> self)
    57 
    57 
    58         if self.ev == NULL :
    58         if self.ev == NULL :
    59             raise Exception("event_new")
    59             raise Exception("event_new")
    60     
    60     
    61 
    61 
    68 
    68 
    69         if self.alive :
    69         if self.alive :
    70             raise RuntimeError("Cannot change event while active")
    70             raise RuntimeError("Cannot change event while active")
    71         
    71         
    72         # interesting... no error return code
    72         # interesting... no error return code
    73         lib.event_assign(self.ev, base.ev_base, fd, events, ev_callback, <void *>self)
    73         lib.event_assign(self.ev, base.ev_base, fd, events, ev_callback, <void *> self)
    74 
    74 
    75 
    75 
    76     def add (self, timeout = None) :
    76     def add (self, timeout = None) :
    77         """
    77         """
    78             Add this event to our event_base's set of monitored events.
    78             Add this event to our event_base's set of monitored events.
   195             lib.event_free(self.ev)
   195             lib.event_free(self.ev)
   196 
   196 
   197 class CallbackEvent (event) :
   197 class CallbackEvent (event) :
   198     """
   198     """
   199         Extends the event type to take a callback and additional arguments to invoke from the __call__ method.
   199         Extends the event type to take a callback and additional arguments to invoke from the __call__ method.
       
   200 
       
   201         This will pass the event object itself to the callback in place of the fd.
   200     """
   202     """
   201 
   203 
   202     def __init__ (self, event_base base, lib.evutil_socket_t fd, short events, object callback, *args, **kwargs) :
   204     def __init__ (self, event_base base, lib.evutil_socket_t fd, short events, object callback, *args, **kwargs) :
   203         # parent
   205         # parent
   204         super(CallbackEvent, self).__init__(base, fd, events)
   206         super(CallbackEvent, self).__init__(base, fd, events)
   207         self.callback = callback
   209         self.callback = callback
   208         self.args = args
   210         self.args = args
   209         self.kwargs = kwargs
   211         self.kwargs = kwargs
   210 
   212 
   211     def __call__ (self, lib.evutil_socket_t fd, short mask) :
   213     def __call__ (self, lib.evutil_socket_t fd, short mask) :
   212         self.callback(fd, mask, *self.args, **self.kwargs)
   214         self.callback(self, mask, *self.args, **self.kwargs)
   213 
   215