Tom Tromey <[email protected]> skribis:
>>>>>> "Ludovic" == Ludovic Courtès <[email protected]> writes:
>
> Ludovic> I’m not sure I understand the problem.
>
> Ludovic> What are extension languages typically expected to do when the ‘quit’
> Ludovic> flag is set?
>
> The basic idea is that if some extension code is running, then C-c ought
> to interrupt that code in the way expected by programmers writing code
> in that language.
>
> Python provides a kind of low-level API to its equivalent of Guile's
> SCM_TICK and async stuff. So the approach we took in gdb was to unify
> gdb's implementation with Python's, when Python is enabled. This
> ensures that a SIGINT delivery is handled a single time -- by Python if
> Python code is running, and by gdb if gdb code is running.
So do I get it right that it’s GDB that does signal(SIGINT, ...), and
its handler just calls PyOS_InterruptOccurred (or so) if Python code
happens to be running?
> One approach for multiple extension languages might be to notice when
> switching languages and move the bit. However I didn't see any way to
> do this in the Guile API. In Python it can be accomplished with
> PyErr_SetInterrupt and PyOS_InterruptOccurred.
Would it work, upon SIGINT, to do something like:
(system-async-mark (lambda ()
(throw 'system-error ... EINTR)))
That would eventually raise an exception in Scheme code.
Ludo’.