qmsk/net/lib/event2/base.pyx
author Tero Marttila <terom@fixme.fi>
Sat, 26 Sep 2009 23:38:02 +0300
changeset 56 07ed878c847b
parent 51 c6b4abfc21da
permissions -rw-r--r--
doctweaks and some skeleton tests for event-aliveness
51
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
     1
from qmsk.net.lib.event2.event cimport build_timeout, event
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
     2
from qmsk.net.socket.platform cimport AF_UNIX, SOCK_STREAM
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
     3
cimport qmsk.net.py as py
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     5
class EventError (Exception) :
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     6
    """
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     7
        Base class of errors raised by lib.event2 code
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
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    10
    pass
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    11
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    12
class EventCallError (EventError) :
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    13
    """
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    14
        Some libevent function returned an error code.
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
    
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    17
    def __init__ (self, func, msg=None) :
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    18
        super(EventCallError, self).__init__(func)
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    19
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    20
        self.func = func
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    21
        self.msg = msg
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    22
51
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    23
cdef lib.event* build_pysignal_ev (lib.event_base *ev_base, lib._ev_callback_t cb_func, void *cb_arg) except NULL :
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    24
    """
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    25
        This constructs an returns an event* which will activate the given callback when a Python signal handler runs.
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    26
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    27
        The event is constructed as a persistent internal event, which means that it *must* be removed before trying to
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    28
        release the event_base.
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    29
    """
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    30
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    31
    cdef lib.evutil_socket_t fds[2]
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    32
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    33
    # construct the pipe/sockpair
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    34
    if lib.evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0 :
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    35
        raise EventCallError("evutil_socketpair(signals)")
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    36
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    37
    # prep: nonblocking
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    38
    # XXX: close-on-exec?
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    39
    lib.evutil_make_socket_nonblocking(fds[0])
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    40
    lib.evutil_make_socket_nonblocking(fds[1])
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    41
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    42
    # build event for one end
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    43
    cdef lib.event *ev = lib.event_new(ev_base, fds[1], lib.EV_READ | lib.EV_PERSIST, cb_func, cb_arg)
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    44
    
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    45
    # set magic flag to not count as active
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    46
    ev.ev_flags |= lib.EVLIST_INTERNAL
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    47
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    48
    if ev == NULL :
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    49
        raise EventCallError("event_new(signals)")
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    50
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    51
    # register wakeup fd
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    52
    py.PySignal_SetWakeupFd(fds[0])
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    53
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    54
    return ev
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    55
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    56
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    57
cdef void on_pysignal_wakeup (int sig, short what, void *arg) :
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    58
    """
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    59
        Python's signal handler trapped a signal, we need to run the signal handlers.
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    60
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    61
        This is executed by libevent's event_base_loop as a normal event (using the wakeup fd built using
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    62
        build_pysignal_ev), and hence the signal handlers will be run from "inside" of event_base.loop(). Exceptions
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    63
        raised by the signal handlers should be propagated "out" of event_base.loop().
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    64
    """
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    65
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    66
    cdef event_base ev_base = <event_base> arg
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    67
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    68
    try :
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    69
        # run the real signal handlers for any pending signals
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    70
        py.PyErr_CheckSignals()
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    71
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    72
    except :
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    73
        # TODO: implement propagate-to-event_base.loop()
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    74
        # drop out of the event loop
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    75
        ev_base.loopbreak()
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    76
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    77
        # Cython will log it
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    78
        raise
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    79
        
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    80
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
cdef class event_base :
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
    def __init__ (self) :
56
07ed878c847b doctweaks and some skeleton tests for event-aliveness
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    84
        """
07ed878c847b doctweaks and some skeleton tests for event-aliveness
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    85
            Constructs a new event_base with default parameters.
07ed878c847b doctweaks and some skeleton tests for event-aliveness
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    86
        """
39
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
        # construct
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
        self.ev_base = lib.event_base_new()
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 self.ev_base == NULL :
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    92
            raise EventCallError("event_base_new")
51
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    93
        
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    94
        # internal signal wakeup handler
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    95
        # XXX: only the main event_base really needs one...
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    96
        self.ev_pysignal = build_pysignal_ev(self.ev_base, on_pysignal_wakeup, <void *> self)
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    97
            
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    98
        # XXX: this will keep the loop active?
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    99
        if lib.event_add(self.ev_pysignal, NULL) < 0 :
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   100
            raise EventCallError("event_add(signals)")
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   101
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    def reinit (self) :
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
            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
   106
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
            Raises an error if some events could not be re-added.
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
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
        if lib.event_reinit(self.ev_base) < 0 :
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   111
            raise EventCallError("event_reinit", "could not re-add all events")
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
51
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   113
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
    property method :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
        def __get__ (self) :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
            """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
                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
   118
            """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
            return lib.event_base_get_method(self.ev_base)
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
51
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   122
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
    def loop (self, once = False, nonblock = False) :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
            Run the event loop.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
                once        - only run the event loop once, at most
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
                nonblock    - do not block waiting for events
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   129
56
07ed878c847b doctweaks and some skeleton tests for event-aliveness
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   130
            Returns True if the event loop exited, False if there were no more events to process
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        cdef int flags = 0
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
        # build flags
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
        if once :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
            flags |= lib.EVLOOP_ONCE
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
        if nonblock :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
            flags |= lib.EVLOOP_NONBLOCK
51
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   141
        
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
        # event_base_loop()
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   144
        ret = lib.event_base_loop(self.ev_base, flags)
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   145
51
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   146
        
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   147
        # check return status
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   148
        if ret < 0 :
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   149
            raise EventCallError("event_base_loop")
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   150
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   151
        elif ret > 0 :
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   152
            return False
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   153
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   154
        else :
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   155
            return True
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
51
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   157
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
    def loopexit (self, timeout = None) :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
            Exit the event loop normally.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
            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
   163
            to complete normally, before causing .loop() to return.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
        cdef lib.timeval tv
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
        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
   169
            raise EventCallError("event_base_loopexit")
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
51
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   171
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    def loopbreak (self) :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
            Abort the event immediately.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
            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
   177
            processed.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
        if lib.event_base_loopbreak(self.ev_base) < 0 :
41
02f7c0539843 * fix timeout=0.0
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   181
            raise EventCallError("event_base_loopbreak")
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
51
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   183
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
    def __dealloc__ (self) :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
        """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
            Release the event_base's resources.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
            XXX: is this entirely safe re our events?
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
        """
51
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   190
        
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   191
        if self.ev_pysignal :
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   192
            # remove the internal signal wakeup event
c6b4abfc21da qmsk/net/lib/event2/base.pxd
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   193
            lib.event_free(self.ev_pysignal)
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
        lib.event_base_free(self.ev_base)
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196