Hi,
I am using cython to wrap some relatively low level C api (ALSA). It
has worked great so far, specially for integrating numpy array and C
API. But I have a problem with signals. ALSA is the Linux API for
sound devices, and I have a cython class like the following:
cdef class AlsaDevice:
def __init__(AlsaDevice self):
# Set up the device
def __dealloca__(AlsaDevice self):
# Free-up the device and related resources
def play(AlsaDevice self, ndarray data):
# Play the data through the device
# Number of buffers to play
cdef int nbuf
cdef int i
for i in range(mbuf):
# Call the C API
When a KeyboardInterrupt is raised while executing the loop, it is
blocked until the end of the loop, which is not ideal, obviously.
After having tried different things, I came up with the following:
cdef int err
....
for i in range(mbuf):
err = python_exc.PyErr_CheckSignals()
if err != 0:
if python_exc.PyErr_ExceptionMatches(KeyboardInterrupt):
raise KeyboardInterrupt()
# Call the C API
Which seems to do what I want. But I don't really understand why it
works, in particular, is it guaranteed that every ressource is freed
(assuming everything is correctly handled when no SIGINT is send to
the python process) ? Is there a better way ?
David
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev