qmsk/net/lib/event2/base.pyx
author Tero Marttila <terom@fixme.fi>
Mon, 31 Aug 2009 21:36:15 +0300
changeset 41 02f7c0539843
parent 39 075eaafa80a7
child 51 c6b4abfc21da
permissions -rw-r--r--
* fix timeout=0.0
* fix loop() return value for case ret == 0, ret > 1
* change event_base to raise EventCallErrors (to be renamed...?)
* move some event docstrings to __call__
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
from qmsk.net.lib.event2.base cimport *
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
from qmsk.net.lib.event2.event cimport build_timeout
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     4
class EventError (Exception) :
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     5
    """
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     6
        Base class of errors raised by lib.event2 code
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     7
    """
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     8
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     9
    pass
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    10
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    11
class EventCallError (EventError) :
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    12
    """
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    13
        Some libevent function returned an error code.
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    14
    """
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    15
    
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    16
    def __init__ (self, func, msg=None) :
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    17
        super(EventCallError, self).__init__(func)
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    18
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    19
        self.func = func
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    20
        self.msg = msg
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    21
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
cdef class event_base :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    def __init__ (self) :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        # construct
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
        self.ev_base = lib.event_base_new()
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        if self.ev_base == NULL :
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    30
            raise EventCallError("event_base_new")
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    def reinit (self) :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
            Re-initialize the event_base following a fork(). This is required for some event mechanisms.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
            Raises an error if some events could not be re-added.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        if lib.event_reinit(self.ev_base) < 0 :
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    40
            raise EventCallError("event_reinit", "could not re-add all events")
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    property method :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
        def __get__ (self) :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
            """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
                Query the underlying method used by this event_base as a string ("kqueue", "epoll", etc.)
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
            """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
            return lib.event_base_get_method(self.ev_base)
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    def loop (self, once = False, nonblock = False) :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
            Run the event loop.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
                once        - only run the event loop once, at most
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
                nonblock    - do not block waiting for events
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    56
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    57
            Returns True if succesfull, False if no events were registered
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
        cdef int flags = 0
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        # build flags
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
        if once :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
            flags |= lib.EVLOOP_ONCE
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        if nonblock :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
            flags |= lib.EVLOOP_NONBLOCK
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
        # event_base_loop()
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    70
        ret = lib.event_base_loop(self.ev_base, flags)
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    71
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    72
        if ret < 0 :
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    73
            raise EventCallError("event_base_loop")
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    74
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    75
        elif ret > 0 :
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    76
            return False
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    77
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    78
        else :
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    79
            return True
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    def loopexit (self, timeout = None) :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
            Exit the event loop normally.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
            This will optionally wait until the given timeout expires, and then allow the current event loop iteration
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
            to complete normally, before causing .loop() to return.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
        cdef lib.timeval tv
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        if lib.event_base_loopexit(self.ev_base, build_timeout(&tv, timeout)) < 0 :
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    92
            raise EventCallError("event_base_loopexit")
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
    def loopbreak (self) :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
            Abort the event immediately.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
            The current event loop will end and .loop() return as soon as the currently running event has been
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
            processed.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
        if lib.event_base_loopbreak(self.ev_base) < 0 :
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   103
            raise EventCallError("event_base_loopbreak")
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    def __dealloc__ (self) :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
            Release the event_base's resources.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
            XXX: is this entirely safe re our events?
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
        lib.event_base_free(self.ev_base)
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113