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-- |
39 | 1 |
""" |
2 |
Core `struct event_base` type |
|
3 |
""" |
|
4 |
||
5 |
cimport qmsk.net.lib.event2.lib as lib |
|
6 |
||
7 |
cdef class event_base : |
|
8 |
""" |
|
9 |
An event_base stores the "global" state associated with events - it holds a set of events (pending/active/scheduled), |
|
10 |
and uses some specific multiplexing method (select/poll/epoll/kqueue/etc) to drive these events. |
|
11 |
||
12 |
Constructs a new event_base with default parameters. |
|
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 | 39 |
XXX: add support for event_config! |
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 | 42 |
""" |
43 |
||
44 |
# the underlying ev_base object |
|
45 |
cdef lib.event_base *ev_base |
|
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 |