mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-24 12:35:55 +08:00
[gdb/cli] Handle pending ^C after rl_callback_read_char for readline 7
In commit faf01aee1d
("[gdb] Handle pending ^C after rl_callback_read_char")
we handled a problem (described in detail in that commit) for readline >= 8
using public readline functions rl_pending_signal and rl_check_signals.
For readline 7 (note that we require at least readline 7 so there's no need to
worry about readline 6), there was no fix though, because rl_check_signals was
not available.
Fix this by instead using the private readline function _rl_signal_handler.
There is precedent for using private readline variables and functions, but
it's something we want to get rid of (PR build/10723). Nevertheless, I think
we can allow this specific instance because it's not used when building
against readline >= 8.
[ In the meanwhile, a fix was committed in the devel branch of the readline
repo, contained in commit 8d0c439 ("rollup of changes since readline-8.2"),
first proposed here (
https://lists.gnu.org/archive/html/bug-readline/2022-10/msg00008.html ). ]
Tested on x86_64-linux, against system readline 7.0 on openSUSE Leap 15.4.
PR cli/27813
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=27813
This commit is contained in:
parent
22f2cf64f1
commit
a6bc87757c
@ -137,6 +137,9 @@ static struct async_signal_handler *async_sigterm_token;
|
||||
character is processed. */
|
||||
void (*after_char_processing_hook) (void);
|
||||
|
||||
#if RL_VERSION_MAJOR == 7
|
||||
EXTERN_C void _rl_signal_handler (int);
|
||||
#endif
|
||||
|
||||
/* Wrapper function for calling into the readline library. This takes
|
||||
care of a couple things:
|
||||
@ -203,8 +206,14 @@ gdb_rl_callback_read_char_wrapper_noexcept () noexcept
|
||||
pending signal. I'm not sure if that's possible, but it seems
|
||||
better to handle the scenario than to assert. */
|
||||
rl_check_signals ();
|
||||
#elif RL_VERSION_MAJOR == 7
|
||||
/* Unfortunately, rl_check_signals is not available. Use private
|
||||
function _rl_signal_handler instead. */
|
||||
|
||||
while (rl_pending_signal () != 0)
|
||||
_rl_signal_handler (rl_pending_signal ());
|
||||
#else
|
||||
/* Unfortunately, rl_check_signals is not available. */
|
||||
#error "Readline major version >= 7 expected"
|
||||
#endif
|
||||
if (after_char_processing_hook)
|
||||
(*after_char_processing_hook) ();
|
||||
|
Loading…
Reference in New Issue
Block a user