qmsk/net/lib/event2/base.pxd
author Tero Marttila <terom@fixme.fi>
Sat, 26 Sep 2009 21:50:42 +0300
changeset 52 722fc70a197a
parent 39 075eaafa80a7
child 56 07ed878c847b
permissions -rw-r--r--
change CallbackEvent to replace fd with ev, event2 doc/style tweaks
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Core `struct event_base` type
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
cimport qmsk.net.lib.event2.lib as lib
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
cdef class event_base :
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
    """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
        An event_base stores the "global" state associated with events - it holds a set of events (pending/active/scheduled),
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
        and uses some specific multiplexing method (select/poll/epoll/kqueue/etc) to drive these events.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
        
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
        Constructs a new event_base with default parameters.
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
52
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    14
        XXX: you must keep a reference to the event_base around yourself!
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    15
        XXX: what happens to events once we are destructed?
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    16
        
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    17
        Libevent has its own asynchronous signal-handling mechanism that is incompatible with Python's signal-handling
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    18
        mechanism.
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    19
        
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    20
        Technical details:
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    21
            Python's signal handlers will simply set a flag corresponding to the signal, and wait for
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    22
            PyErr_CheckSignals to be run. Following this, libevent's epoll/select/etc() call will return EINTER - but
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    23
            this will only cause libevent to check its own signal state, and continue running.
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    24
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    25
        To solve this, we register a "wakeup fd" in Python's signal handling system, whereby a byte is written to a
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    26
        socket pair whenever python's signal handler runs. We then register an (internal) event for the other end of
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    27
        this socketpair in the event_base, which then runs the python signal handlers from "inside" of .loop(),
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    28
        propagating exceptions out of .loop() - this solution is more or less equivalent to how libevent's signal
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    29
        handling works.
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    30
        
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    31
        This means that python's default signals and any other signals added using the signal module continue to work
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    32
        at the cost of some additional complexity, but any libevent signal-events also work as well :)
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    33
        
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    34
        XXX: currently, you can only have one event_base at a time - there should be separate types used for the main
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    35
        thread and sub-threads, since the python signal handling mechanism only works in the main thread.
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    36
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    37
        XXX: the propagate-exceptions doesn't actually work either, it just aborts the event loop :)
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    38
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        XXX: add support for event_config!
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        XXX: add support for event_base_priority_init!
52
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    41
39
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    """
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    # the underlying ev_base object
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
    cdef lib.event_base *ev_base
075eaafa80a7 initial lib.event2 code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
52
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    47
    # internal event for PySignal wakeups
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    48
    cdef lib.event *ev_pysignal
722fc70a197a change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    49