author | Tero Marttila <terom@fixme.fi> |
Sat, 26 Sep 2009 23:51:31 +0300 | |
changeset 57 | 8c4032265c8c |
parent 52 | 722fc70a197a |
permissions | -rw-r--r-- |
39 | 1 |
""" |
2 |
Core `struct event` type. |
|
3 |
""" |
|
4 |
||
5 |
cimport qmsk.net.lib.event2.lib as lib |
|
6 |
||
57
8c4032265c8c
event keeps a ref to its event_base - needed for later error propagation, and to ensure method calls remain valid
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
7 |
from qmsk.net.lib.event2.base cimport event_base |
8c4032265c8c
event keeps a ref to its event_base - needed for later error propagation, and to ensure method calls remain valid
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
8 |
|
39 | 9 |
# internal helper method for handling timeout arguments |
10 |
cdef lib.timeval* build_timeout (lib.timeval *tv, object timeout = ?) except? <lib.timeval *>-1 |
|
11 |
||
12 |
cdef class event : |
|
13 |
""" |
|
14 |
Create a new event object with the given parameters. |
|
15 |
||
16 |
An event tracks a single OS file descriptor with some set of events (EV_READ/EV_WRITE) and an optional timeout. |
|
17 |
||
18 |
An event is associated with some event_base, which handles the event mechanism. |
|
19 |
||
20 |
Arguments: |
|
21 |
base - event_base to use for this event |
|
22 |
fd - OS file descriptor to watch, or -1 |
|
23 |
events - bitmask of EV_* flags that represents the events to wait for |
|
24 |
||
50
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
25 |
When the event fires, it will "call" this event object (see docs for __call__()). |
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
26 |
|
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
27 |
The lifetime of event objects is slightly non-trivial, in that they will actually hold a reference to |
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
28 |
themselves while "active". In other words, .add() will aquire an internal reference, which will be released |
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
29 |
before the __call__(). |
52
722fc70a197a
change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents:
50
diff
changeset
|
30 |
|
722fc70a197a
change CallbackEvent to replace fd with ev, event2 doc/style tweaks
Tero Marttila <terom@fixme.fi>
parents:
50
diff
changeset
|
31 |
XXX: propagate errors (including e.g. KeyboardInterrupt?) from __call__ to event_base.loop()? |
39 | 32 |
""" |
33 |
||
57
8c4032265c8c
event keeps a ref to its event_base - needed for later error propagation, and to ensure method calls remain valid
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
34 |
# reference to our supporting event_base to ensure we don't lose it |
8c4032265c8c
event keeps a ref to its event_base - needed for later error propagation, and to ensure method calls remain valid
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
35 |
cdef readonly event_base base |
8c4032265c8c
event keeps a ref to its event_base - needed for later error propagation, and to ensure method calls remain valid
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
36 |
|
39 | 37 |
# the underlying event object |
38 |
cdef lib.event *ev |
|
39 |
||
50
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
40 |
# slightly different meaning from libevent's "active", this is used to track our own refcount |
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
41 |
cdef readonly bool alive |
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
42 |
|
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
43 |
# self-refcount scheme |
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
44 |
cdef object _mark (self) |
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
45 |
cdef object _unmark (self) |
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
46 |
|
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
47 |
# methods also used internally |
da394bb715af
try and keep lib.event2.event objects alive (via self-ref) while pending
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
48 |
cpdef pending (self, short mask = ?) |