From: Pedro Alves <palves@redhat.com>
To: Yao Qi <qiyaoltc@gmail.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH v2 05/25] Make the intepreters output to all UIs
Date: Fri, 06 May 2016 12:19:00 -0000 [thread overview]
Message-ID: <433fc8ce-4eac-63e7-19db-5953fd845db6@redhat.com> (raw)
In-Reply-To: <86vb4evov5.fsf@gmail.com>
On 03/22/2016 09:33 AM, Yao Qi wrote:
> Pedro Alves <palves@redhat.com> writes:
>
> Hi Pedro,
> We have three interpreters, cli, mi and tui. Each of them has a
> ${inter}_on_normal_stop registered to normal_stop observer, as below,
>
> Why don't we have 'struct ui' have a method 'print_stop_event', so that
> we can put the different handling there.
That's what I tried in an earlier attempt as I tried to describe in
the commit log:
An earlier prototype of this series did the looping over struct UIs in
common code, and then dispatched events to the interpreters through a
matching interp_on_foo method for each observer. That turned out a
lot more complicated than the present solution, as we'd end up with
having to create a new interp method every time some interpreter
wanted to listen to some observer notification, resulting in a lot of
duplicated make-work and more coupling than desirable.
I have an earlier version of the series on my github that goes all
the way to make it possible to have multiple independent TUIs active.
And then the TUI has even more random observers. It turned out to be
a huge mess.
So even though this particular observer could seemingly be handled
like that, there's a larger pattern here that applies to all
observers all interpreters use.
I think that if we do switch to the mechanism of calling a
"virtual" method directly, it'll be by calling into the
method on the UI's top level interpreter directly.
A wrinkle is that some interpreters install an observer than
works with the current interpreter, while others install an
observer that works with the top level interpreter. That should
probably be changed to always dispatch through the top level
interpreter. I tried that too, but, it was getting unwildly,
and decided to back off. Yet another large-ish change for another
day. I suspect it'll be easier in C++.
But even that isn't clear to me is the best approach. The
lose coupling between common code and the interpreters provided
by the observers is quite convenient. I think of it as the
common code posting an event, and then the interpreters consuming
it. I thought of making it possible to associate a "data" pointer
with each observer, thus have each UI instance register itself
as an observer for a particular event, instead of registering
an observer for the whole set of UI instances of a type of UI
and then have each observer iterate over all instances.
But then that would be painful to do with the current observers
design, it'd much much more natural in C++11 with lambdas or
some such...
> In this way, we can only
> register one to normal_stop observer, in interps.c for example, and the
> code can be simplified, like this,
>
> static void
> interp_on_normal_stop (struct bpstats *bs, int print_frame)
> {
> struct switch_thru_all_uis state;
>
> SWITCH_THRU_ALL_UIS (state)
> {
> current_ui->print_stop_event (bs, print_frame);
> }
> }
>
> we don't have to check the type of interpreter in the loop anymore.
>
I'd much prefer to go the direction of calling into the top interpreter,
instead of adding virtual methods to the UI:
SWITCH_THRU_ALL_UIS (state)
{
current_ui->top_level_interpreter->print_stop_event (bs, print_frame);
}
Because an UI has-a interpreter, not is-a one.
But I've tried this, and ended up with too-ugly template-like
macros and too much boilerplace, and lots of duplication in
in UI's interface, and I never managed to make it regression free.
Thanks,
Pedro Alves
next prev parent reply other threads:[~2016-05-06 12:19 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1458573675-15478-1-git-send-email-palves@redhat.com>
2016-03-21 15:21 ` [PATCH v2 02/25] Make gdb_stdout&co be per UI Pedro Alves
2016-03-21 15:21 ` [PATCH v2 01/25] Introduce "struct ui" Pedro Alves
2016-03-21 15:21 ` [PATCH v2 12/25] Make command line editing (use of readline) be per UI Pedro Alves
2016-03-21 15:21 ` [PATCH v2 03/25] Make the interpreters " Pedro Alves
2016-03-21 15:21 ` [PATCH v2 22/25] Make main_ui be heap allocated Pedro Alves
2016-03-22 10:14 ` Yao Qi
2016-05-06 11:50 ` Pedro Alves
2016-03-21 15:22 ` [PATCH v2 13/25] Always process target events in the main UI Pedro Alves
2016-03-22 10:26 ` Yao Qi
2016-05-06 11:53 ` Pedro Alves
2016-03-21 15:22 ` [PATCH v2 24/25] Add new command to create extra console/mi UI channels Pedro Alves
2016-03-21 16:31 ` Eli Zaretskii
2016-03-21 16:51 ` Pedro Alves
2016-03-21 17:12 ` Eli Zaretskii
2016-03-21 17:57 ` Pedro Alves
2016-05-26 11:43 ` Pedro Alves
2016-05-26 15:46 ` Eli Zaretskii
2016-05-26 16:03 ` Pedro Alves
2016-05-26 16:36 ` Eli Zaretskii
2016-05-26 16:41 ` Pedro Alves
2016-03-21 15:22 ` [PATCH v2 18/25] Replace the sync_execution global with a new enum prompt_state tristate Pedro Alves
2016-03-21 15:26 ` [PATCH v2 08/25] Make input_fd be per UI Pedro Alves
2016-03-22 9:46 ` Yao Qi
2016-05-06 11:53 ` Pedro Alves
2016-03-21 15:26 ` [PATCH v2 10/25] Delete def_uiout Pedro Alves
2016-03-21 15:27 ` [PATCH v2 09/25] Make outstream be per UI Pedro Alves
2016-03-21 15:27 ` [PATCH v2 21/25] Only send sync execution command output to the UI that ran the command Pedro Alves
2016-03-21 15:27 ` [PATCH v2 15/25] Introduce display_mi_prompt Pedro Alves
2016-03-21 15:27 ` [PATCH v2 23/25] Handle UI terminal closed Pedro Alves
2016-03-21 15:29 ` [PATCH v2 16/25] Simplify starting the command event loop Pedro Alves
2016-03-21 15:29 ` [PATCH v2 17/25] Make gdb_in_secondary_prompt_p() be per UI Pedro Alves
2016-03-21 15:29 ` [PATCH v2 11/25] Make current_ui_out " Pedro Alves
2016-03-21 15:29 ` [PATCH v2 05/25] Make the intepreters output to all UIs Pedro Alves
2016-03-22 9:33 ` Yao Qi
2016-05-06 12:19 ` Pedro Alves [this message]
2016-03-21 15:29 ` [PATCH v2 04/25] Introduce interpreter factories Pedro Alves
2016-03-22 8:55 ` Yao Qi
2016-05-06 11:49 ` Pedro Alves
2016-03-21 15:30 ` [PATCH v2 25/25] Add command to list UIs Pedro Alves
2016-03-22 10:36 ` Yao Qi
2016-05-06 11:49 ` Pedro Alves
2016-03-21 15:30 ` [PATCH v2 19/25] New function should_print_stop_to_console Pedro Alves
2016-03-21 15:30 ` [PATCH v2 06/25] Always run async signal handlers in the main UI Pedro Alves
2016-03-21 15:30 ` [PATCH v2 20/25] Push thread->control.command_interp to the struct thread_fsm Pedro Alves
2016-03-21 15:30 ` [PATCH v2 07/25] Make instream and serial_stdin be per UI Pedro Alves
2016-03-21 15:39 ` [PATCH v2 14/25] Make target_terminal_inferior/ours almost nops on non-main UIs Pedro Alves
2016-03-21 16:34 ` [PATCH v2 00/25] Towards great frontend GDB consoles Eli Zaretskii
2016-03-21 17:02 ` Pedro Alves
2016-03-21 17:17 ` Eli Zaretskii
2016-03-21 17:43 ` Marc Khouzam
2016-03-21 18:35 ` Marc Khouzam
2016-03-21 18:51 ` Pedro Alves
2016-03-21 19:06 ` Marc Khouzam
2016-05-06 12:58 ` Pedro Alves
2016-03-22 10:41 ` Yao Qi
2016-05-06 11:58 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=433fc8ce-4eac-63e7-19db-5953fd845db6@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=qiyaoltc@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox