Tom Tromey <tro...@redhat.com> skribis: >>>>>> "Ludovic" == Ludovic Courtès <l...@gnu.org> 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’.