Re: [patch] python prompt additions at first prompt.

Matt Rice
2011-08-09T00:20:28Z

On Wed, Aug 3, 2011 at 11:07 AM, Tom Tromey <tromey@redhat.com> wrote:
>>>>>> "Matt" == Matt Rice <ratmice@gmail.com> writes:
>
> Matt> I think it's ok anyways, the 'if (async_command_editing_p)' case in
> Matt> display_gdb_prompt seems to cover it,
> Matt> with the addition of rl_callback_handler_remove() which afaict seemed
> Matt> ok to call before a handler is installed
>
> It is really unclear to me whether or not this patch is ok.
>
> display_gdb_prompt can early exit in a couple of cases:
>
> 1:
>
>  if (!current_interp_display_prompt_p ())
>    return;
>
> (I don't think this one can happen here.)
>
> 2:
>
>  if (sync_execution && is_running (inferior_ptid))
>    {
> [...]
>      rl_callback_handler_remove ();
>      return;
>
> This seems like it could be possible, maybe with attach + cont from the
> command line?

argh, thanks for noticing this should have seen it.
yes it is possible,

./gdb/gdb -ex 'set target-async on' -ex 'attach 26359' -ex 'continue&'

I have yet to fully unfurl the state machine, but in this case,
display_gdb_prompt
now gets called twice, first hitting this sync_execution && is_running
and returning, secondly without returning early, and hitting
async_editing. This leads to one prompt being displayed.

further, trying this same case without my patch leads me to believe
that the original code is not correct either.
precisely because it does call rl_callback_handler_install, debugging
gdb gives an infinite loop of these.
not debugging gdb you seem to wind up back at the shell needing to 'fg' gdb.

Program received signal SIGTTOU, Stopped (tty output).
0x000000394acd7f18 in tcsetattr () from /lib64/libc.so.6
(gdb) bt
#0 0x000000394acd7f18 in tcsetattr () from /lib64/libc.so.6
#1 0x00000000006c16db in _set_tty_settings (tty=0,
tiop=0x7fffffffdcf0) at rltty.c:476
#2 0x00000000006c1706 in set_tty_settings (tty=0,
tiop=0x7fffffffdcf0) at rltty.c:490
#3 0x00000000006c1a71 in rl_prep_terminal (meta_flag=1) at rltty.c:653
#4 0x00000000006d436e in _rl_callback_newline () at callback.c:82
#5 0x00000000006d43d3 in rl_callback_handler_install
(prompt=0x7fffffffdd70 "",
linefunc=0x5b6236 <command_line_handler>) at callback.c:102
#6 0x00000000004fa86c in tui_command_loop (data=0x0) at ./tui/tui-interp.c:159

the patch at least suffers from one issue that the first 'current'
argument to gdb.prompt_hook
is both inconsistent and unsatisfactory.
None, or "" empty string with patch: (normal vs target-async/attach .. etc)
rather than the "(gdb) " it is without the patch/should be.
(by putting the observer mechanism before the first rl_callback_handler_install)

So, I guess neither the current patch or adding the observer calls to
the existing code
is correct and we at least need to split up prompt displaying from the
setting of the prompt parameter?

> If that one cannot be taken, then I agree the patch is correct.
> Could you try this?
>
> Tom
>