Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Simon Marchi <simon.marchi@ericsson.com>
To: Pedro Alves <palves@redhat.com>, <gdb-patches@sourceware.org>
Subject: Re: [PATCH v3 06/34] Introduce interpreter factories
Date: Wed, 18 May 2016 19:20:00 -0000	[thread overview]
Message-ID: <573CC052.6000502@ericsson.com> (raw)
In-Reply-To: <1462538104-19109-7-git-send-email-palves@redhat.com>

On 16-05-06 08:34 AM, Pedro Alves wrote:
> If every UI instance has its own set of interpreters, then the current
> scheme of creating the interpreters at GDB initialization time no
> longer works.  We need to create them whenever a new UI instance is
> created.
> 
> The scheme implemented here has each interpreter register an factory
> callback that when called creates a new instance of a specific type.
> Then, when some code in gdb looks up an interpreter (always by name),
> if there's none yet, the factory method is called to construct one.
> 
> gdb/ChangeLog:
> yyyy-mm-dd  Pedro Alves  <palves@redhat.com>
> 
> 	* cli/cli-interp.c (cli_uiout): Delete, moved into ...
> 	(struct cli_interp): ... this new structure.
> 	(cli_on_normal_stop, cli_on_signal_received)
> 	(cli_on_end_stepping_range, cli_on_signal_exited, cli_on_exited)
> 	(cli_on_no_history): Use interp_ui_out.
> 	(cli_interpreter_init): If top level, set the cli_interp global.
> 	(cli_interpreter_init): Return the interp's data instead of NULL.
> 	(cli_interpreter_resume, cli_interpreter_exec, cli_ui_out): Adjust
> 	to cli_uiout being in the interpreter's data.
> 	(cli_interp_procs): New, factored out from _initialize_cli_interp.
> 	(cli_interp_factory): New function.
> 	(_initialize_cli_interp): Call interp_factory_register.
> 	* interps.c (interp_new): Add parameter 'data'.  Store it.
> 	(struct interp_factory): New function.
> 	(interp_factory_p): New typedef.  Define a VEC_P.
> 	(interpreter_factories): New global.
> 	(interp_factory_register): New function.
> 	(interp_add): Use interp_lookup_existing.
> 	(interp_lookup): Rename to ...
> 	(interp_lookup_existing): ... this.  Don't check for NULL or empty
> 	name here.
> 	(interp_lookup): Reimplement.
> 	(interpreter_completer): Complete on registered interpreter
> 	factories instead of interpreters.
> 	* interps.h (interp_factory_func): New typedef.
> 	(interp_factory_register): Declare.
> 	(interp_new): Adjust.
> 	(interp_lookup): Declare.
> 	* mi/mi-interp.c (mi_interp_procs): New, factored out from
> 	_initialize_mi_interp.
> 	(mi_interp_factory): New function.
> 	* tui/tui-interp.c (tui_init): If top level, set the tui_interp
> 	global.
> 	(tui_interp_procs): New.
> 	(tui_interp_factory): New function.
> 	(_initialize_tui_interp): Call interp_factory_register.
> ---
>  gdb/cli/cli-interp.c |  87 ++++++++++++++++++++++++++----------------
>  gdb/interps.c        | 105 +++++++++++++++++++++++++++++++++++++++++++--------
>  gdb/interps.h        |  21 ++++++++++-
>  gdb/mi/mi-interp.c   |  40 ++++++++++++--------
>  gdb/tui/tui-interp.c |  38 ++++++++++++-------
>  5 files changed, 214 insertions(+), 77 deletions(-)
> 
> diff --git a/gdb/cli/cli-interp.c b/gdb/cli/cli-interp.c
> index dfbd808..ac12a4c 100644
> --- a/gdb/cli/cli-interp.c
> +++ b/gdb/cli/cli-interp.c
> @@ -26,9 +26,14 @@
>  #include "infrun.h"
>  #include "observer.h"
>  
> -/* These are the ui_out and the interpreter for the console
> -   interpreter.  */
> -struct ui_out *cli_uiout;
> +/* The console interpreter.  */
> +struct cli_interp
> +{
> +  /* The ui_out for the console interpreter.  */
> +  struct ui_out *cli_uiout;
> +};
> +
> +/* The interpreter for the console interpreter.  */
>  static struct interp *cli_interp;
>  
>  /* Longjmp-safe wrapper for "execute_command".  */
> @@ -48,7 +53,7 @@ cli_on_normal_stop (struct bpstats *bs, int print_frame)
>    if (!interp_quiet_p (cli_interp))
>      {
>        if (print_frame)
> -	print_stop_event (cli_uiout);
> +	print_stop_event (interp_ui_out (cli_interp));
>      }
>  }
>  
> @@ -58,7 +63,7 @@ static void
>  cli_on_signal_received (enum gdb_signal siggnal)
>  {
>    if (!interp_quiet_p (cli_interp))
> -    print_signal_received_reason (cli_uiout, siggnal);
> +    print_signal_received_reason (interp_ui_out (cli_interp), siggnal);
>  }
>  
>  /* Observer for the end_stepping_range notification.  */
> @@ -67,7 +72,7 @@ static void
>  cli_on_end_stepping_range (void)
>  {
>    if (!interp_quiet_p (cli_interp))
> -    print_end_stepping_range_reason (cli_uiout);
> +    print_end_stepping_range_reason (interp_ui_out (cli_interp));
>  }
>  
>  /* Observer for the signalled notification.  */
> @@ -76,7 +81,7 @@ static void
>  cli_on_signal_exited (enum gdb_signal siggnal)
>  {
>    if (!interp_quiet_p (cli_interp))
> -    print_signal_exited_reason (cli_uiout, siggnal);
> +    print_signal_exited_reason (interp_ui_out (cli_interp), siggnal);
>  }
>  
>  /* Observer for the exited notification.  */
> @@ -85,7 +90,7 @@ static void
>  cli_on_exited (int exitstatus)
>  {
>    if (!interp_quiet_p (cli_interp))
> -    print_exited_reason (cli_uiout, exitstatus);
> +    print_exited_reason (interp_ui_out (cli_interp), exitstatus);
>  }
>  
>  /* Observer for the no_history notification.  */
> @@ -94,7 +99,7 @@ static void
>  cli_on_no_history (void)
>  {
>    if (!interp_quiet_p (cli_interp))
> -    print_no_history_reason (cli_uiout);
> +    print_no_history_reason (interp_ui_out (cli_interp));
>  }
>  
>  /* Observer for the sync_execution_done notification.  */
> @@ -120,6 +125,9 @@ cli_on_command_error (void)
>  static void *
>  cli_interpreter_init (struct interp *self, int top_level)
>  {
> +  if (top_level)
> +    cli_interp = self;
> +
>    /* If changing this, remember to update tui-interp.c as well.  */
>    observer_attach_normal_stop (cli_on_normal_stop);
>    observer_attach_end_stepping_range (cli_on_end_stepping_range);
> @@ -130,12 +138,13 @@ cli_interpreter_init (struct interp *self, int top_level)
>    observer_attach_sync_execution_done (cli_on_sync_execution_done);
>    observer_attach_command_error (cli_on_command_error);
>  
> -  return NULL;
> +  return interp_data (self);
>  }
>  
>  static int
>  cli_interpreter_resume (void *data)
>  {
> +  struct cli_interp *cli = (struct cli_interp *) data;
>    struct ui_file *stream;
>  
>    /*sync_execution = 1; */
> @@ -144,17 +153,17 @@ cli_interpreter_resume (void *data)
>       previously writing to gdb_stdout, then set it to the new
>       gdb_stdout afterwards.  */
>  
> -  stream = cli_out_set_stream (cli_uiout, gdb_stdout);
> +  stream = cli_out_set_stream (cli->cli_uiout, gdb_stdout);
>    if (stream != gdb_stdout)
>      {
> -      cli_out_set_stream (cli_uiout, stream);
> +      cli_out_set_stream (cli->cli_uiout, stream);
>        stream = NULL;
>      }
>  
>    gdb_setup_readline ();
>  
>    if (stream != NULL)
> -    cli_out_set_stream (cli_uiout, gdb_stdout);
> +    cli_out_set_stream (cli->cli_uiout, gdb_stdout);
>  
>    return 1;
>  }
> @@ -169,6 +178,7 @@ cli_interpreter_suspend (void *data)
>  static struct gdb_exception
>  cli_interpreter_exec (void *data, const char *command_str)
>  {
> +  struct cli_interp *cli = (struct cli_interp *) data;
>    struct ui_file *old_stream;
>    struct gdb_exception result;
>  
> @@ -184,9 +194,9 @@ cli_interpreter_exec (void *data, const char *command_str)
>  
>       It is important that it gets reset everytime, since the user
>       could set gdb to use a different interpreter.  */
> -  old_stream = cli_out_set_stream (cli_uiout, gdb_stdout);
> -  result = safe_execute_command (cli_uiout, str, 1);
> -  cli_out_set_stream (cli_uiout, old_stream);
> +  old_stream = cli_out_set_stream (cli->cli_uiout, gdb_stdout);
> +  result = safe_execute_command (cli->cli_uiout, str, 1);
> +  cli_out_set_stream (cli->cli_uiout, old_stream);
>    return result;
>  }
>  
> @@ -222,7 +232,34 @@ safe_execute_command (struct ui_out *command_uiout, char *command, int from_tty)
>  static struct ui_out *
>  cli_ui_out (struct interp *self)
>  {
> -  return cli_uiout;
> +  struct cli_interp *cli = (struct cli_interp *) interp_data (self);
> +
> +  return cli->cli_uiout;
> +}
> +
> +/* The CLI interpreter's vtable.  */
> +
> +static const struct interp_procs cli_interp_procs = {
> +  cli_interpreter_init,		/* init_proc */
> +  cli_interpreter_resume,	/* resume_proc */
> +  cli_interpreter_suspend,	/* suspend_proc */
> +  cli_interpreter_exec,		/* exec_proc */
> +  cli_ui_out,			/* ui_out_proc */
> +  NULL,                       	/* set_logging_proc */
> +  cli_command_loop            	/* command_loop_proc */
> +};
> +
> +/* Factory for CLI interpreters.  */
> +
> +static struct interp *
> +cli_interp_factory (const char *name, struct ui *ui)
> +{
> +  struct cli_interp *cli = XNEW (struct cli_interp);
> +
> +  /* Create a default uiout builder for the CLI.  */
> +  cli->cli_uiout = cli_out_new (gdb_stdout);
> +
> +  return interp_new (name, &cli_interp_procs, cli);
>  }
>  
>  /* Standard gdb initialization hook.  */
> @@ -231,19 +268,5 @@ extern initialize_file_ftype _initialize_cli_interp; /* -Wmissing-prototypes */
>  void
>  _initialize_cli_interp (void)
>  {
> -  static const struct interp_procs procs = {
> -    cli_interpreter_init,	/* init_proc */
> -    cli_interpreter_resume,	/* resume_proc */
> -    cli_interpreter_suspend,	/* suspend_proc */
> -    cli_interpreter_exec,	/* exec_proc */
> -    cli_ui_out,			/* ui_out_proc */
> -    NULL,                       /* set_logging_proc */
> -    cli_command_loop            /* command_loop_proc */
> -  };
> -
> -  /* Create a default uiout builder for the CLI.  */
> -  cli_uiout = cli_out_new (gdb_stdout);
> -  cli_interp = interp_new (INTERP_CONSOLE, &procs);
> -
> -  interp_add (cli_interp);
> +  interp_factory_register (INTERP_CONSOLE, cli_interp_factory);
>  }
> diff --git a/gdb/interps.c b/gdb/interps.c
> index 7f57132..ca8512b 100644
> --- a/gdb/interps.c
> +++ b/gdb/interps.c
> @@ -91,18 +91,20 @@ struct interp
>  
>  void _initialize_interpreter (void);
>  
> +static struct interp *interp_lookup_existing (const char *name);
> +
>  /* interp_new - This allocates space for a new interpreter,
>     fills the fields from the inputs, and returns a pointer to the
>     interpreter.  */
>  struct interp *
> -interp_new (const char *name, const struct interp_procs *procs)
> +interp_new (const char *name, const struct interp_procs *procs, void *data)
>  {
>    struct interp *new_interp;
>  
>    new_interp = XNEW (struct interp);
>  
>    new_interp->name = xstrdup (name);
> -  new_interp->data = NULL;
> +  new_interp->data = data;
>    new_interp->quiet_p = 0;
>    new_interp->procs = procs;
>    new_interp->inited = 0;
> @@ -113,6 +115,49 @@ interp_new (const char *name, const struct interp_procs *procs)
>    return new_interp;
>  }
>  
> +/* An interpreter factory.  Maps an interpreter name to the factory
> +   function that instantiates an interpreter by that name.  */
> +
> +struct interp_factory
> +{
> +  /* This is the name in "-i=INTERP" and "interpreter-exec INTERP".  */
> +  const char *name;
> +
> +  /* The function that creates the interpreter.  */
> +  interp_factory_func func;
> +};
> +
> +typedef struct interp_factory *interp_factory_p;
> +DEF_VEC_P(interp_factory_p);
> +
> +/* The registered interpreter factories.  */
> +static VEC(interp_factory_p) *interpreter_factories = NULL;
> +
> +/* See interps.h.  */
> +
> +void
> +interp_factory_register (const char *name, interp_factory_func func)
> +{
> +  struct interp_factory *f;
> +  int ix;
> +
> +  /* Assert that no factory for NAME is already registered.  */
> +  for (ix = 0;
> +       VEC_iterate (interp_factory_p, interpreter_factories, ix, f);
> +       ++ix)
> +    if (strcmp (f->name, name) == 0)
> +      {
> +	internal_error (__FILE__, __LINE__,
> +			_("interpreter factory already registered: \"%s\"\n"),
> +			name);
> +      }
> +
> +  f = XNEW (struct interp_factory);
> +  f->name = name;
> +  f->func = func;
> +  VEC_safe_push (interp_factory_p, interpreter_factories, f);
> +}
> +
>  /* Add interpreter INTERP to the gdb interpreter list.  The
>     interpreter must not have previously been added.  */
>  void
> @@ -120,7 +165,7 @@ interp_add (struct interp *interp)
>  {
>    struct ui_interp_info *ui_interp = get_current_interp_info ();
>  
> -  gdb_assert (interp_lookup (interp->name) == NULL);
> +  gdb_assert (interp_lookup_existing (interp->name) == NULL);
>  
>    interp->next = ui_interp->interp_list;
>    ui_interp->interp_list = interp;
> @@ -219,18 +264,15 @@ interp_set (struct interp *interp, int top_level)
>    return 1;
>  }
>  
> -/* interp_lookup - Looks up the interpreter for NAME.  If no such
> -   interpreter exists, return NULL, otherwise return a pointer to the
> -   interpreter.  */
> -struct interp *
> -interp_lookup (const char *name)
> +/* Look up the interpreter for NAME.  If no such interpreter exists,
> +   return NULL, otherwise return a pointer to the interpreter.  */
> +
> +static struct interp *
> +interp_lookup_existing (const char *name)
>  {
>    struct ui_interp_info *ui_interp = get_current_interp_info ();
>    struct interp *interp;
>  
> -  if (name == NULL || strlen (name) == 0)
> -    return NULL;
> -
>    for (interp = ui_interp->interp_list;
>         interp != NULL;
>         interp = interp->next)
> @@ -242,6 +284,37 @@ interp_lookup (const char *name)
>    return NULL;
>  }
>  
> +/* See interps.h.  */
> +
> +struct interp *
> +interp_lookup (const char *name)
> +{
> +  struct ui *ui = current_ui;
> +  struct interp_factory *factory;
> +  struct interp *interp;
> +  int ix;
> +
> +  if (name == NULL || strlen (name) == 0)
> +    return NULL;
> +
> +  /* Only create each interpreter once per top level.  */
> +  interp = interp_lookup_existing (name);
> +  if (interp != NULL)
> +    return interp;
> +
> +  for (ix = 0;
> +       VEC_iterate (interp_factory_p, interpreter_factories, ix, factory);
> +       ++ix)
> +    if (strcmp (factory->name, name) == 0)
> +      {
> +	interp = factory->func (name, ui);
> +	interp_add (interp);
> +	return interp;
> +      }
> +
> +  return NULL;
> +}
> +
>  /* Returns the current interpreter.  */
>  
>  struct ui_out *
> @@ -469,15 +542,15 @@ static VEC (char_ptr) *
>  interpreter_completer (struct cmd_list_element *ignore,
>  		       const char *text, const char *word)
>  {
> -  struct ui_interp_info *ui_interp = get_current_interp_info ();
> +  struct interp_factory *interp;
>    int textlen;
>    VEC (char_ptr) *matches = NULL;
> -  struct interp *interp;
> +  int ix;
>  
>    textlen = strlen (text);
> -  for (interp = ui_interp->interp_list;
> -       interp != NULL;
> -       interp = interp->next)
> +  for (ix = 0;
> +       VEC_iterate (interp_factory_p, interpreter_factories, ix, interp);
> +       ++ix)
>      {
>        if (strncmp (interp->name, text, textlen) == 0)
>  	{
> diff --git a/gdb/interps.h b/gdb/interps.h
> index f0badc5..3065fdf 100644
> --- a/gdb/interps.h
> +++ b/gdb/interps.h
> @@ -24,6 +24,17 @@
>  
>  struct ui_out;
>  struct interp;
> +struct ui;
> +
> +typedef struct interp *(*interp_factory_func) (const char *interp,

Nit:

In the functions of this type ({cli,mi,tui}_interp_factory), this parameter is named
"name", so you could as well name it "name" here as well.

> +					       struct ui *ui);

Even in the final result (with all patches applied), none of the factories
use the ui parameter, is it expected?


  parent reply	other threads:[~2016-05-18 19:20 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-06 12:35 [PATCH v3 00/34] Towards great frontend GDB consoles Pedro Alves
2016-05-06 12:35 ` [PATCH v3 21/34] Replace the sync_execution global with a new enum prompt_state tristate Pedro Alves
2016-05-06 12:35 ` [PATCH v3 14/34] Make command line editing (use of readline) be per UI Pedro Alves
2016-05-06 12:35 ` [PATCH v3 20/34] Make gdb_in_secondary_prompt_p() " Pedro Alves
2016-05-06 12:35 ` [PATCH v3 02/34] [Ada catchpoints] Fix "warning: failed to get exception name: No definition of \"e.full_name\" in current context" Pedro Alves
2016-05-06 12:35 ` [PATCH v3 33/34] Make mi-break.exp always expect breakpoint commands output on the main UI Pedro Alves
2016-05-06 12:35 ` [PATCH v3 29/34] Add new command to create extra console/mi UI channels Pedro Alves
2016-05-26 18:34   ` Pedro Alves
2016-05-06 12:35 ` [PATCH v3 24/34] Push thread->control.command_interp to the struct thread_fsm Pedro Alves
2016-07-01 11:02   ` Thomas Preudhomme
     [not found]     ` <20144b4c-11ee-fc84-e3ad-b9992f14ce15@redhat.com>
2016-07-01 15:24       ` [PATCH] Build gdb.opt/inline-*.exp tests at -O0, rely on __attribute__((always_inline)) (was: Re: [PATCH v3 24/34] Push thread->control.command_interp to the struct thread_fsm) Thomas Preudhomme
2016-07-15 12:05         ` Thomas Preudhomme
2016-07-19 17:02           ` [PATCH] Build gdb.opt/inline-*.exp tests at -O0, rely on __attribute__((always_inline)) Pedro Alves
2016-07-20 16:35             ` Thomas Preudhomme
2016-05-06 12:35 ` [PATCH v3 15/34] Always process target events in the main UI Pedro Alves
2016-05-06 12:35 ` [PATCH v3 16/34] Make target_terminal_inferior/ours almost nops on non-main UIs Pedro Alves
2016-05-06 12:35 ` [PATCH v3 03/34] Introduce "struct ui" Pedro Alves
2016-05-06 12:35 ` [PATCH v3 01/34] Prepare gdb.python/mi-py-events.exp for Python/MI in separate channels Pedro Alves
2016-05-06 12:36 ` [PATCH v3 31/34] Add testing infrastruture bits for running with MI on a separate UI Pedro Alves
2016-06-28 20:19   ` Simon Marchi
2016-06-29 10:50     ` Pedro Alves
2016-06-30 11:12       ` [pushed] Fix gdbserver/MI testing regression (was: Re: [PATCH v3 31/34] Add testing infrastruture bits for running with MI on a separate UI) Pedro Alves
2016-06-30 12:10         ` gdbserver/ada testing broken (was: Re: [pushed] Fix gdbserver/MI testing regression) Pedro Alves
2016-07-04 20:40           ` gdbserver/ada testing broken Simon Marchi
2016-07-05 15:28             ` Joel Brobecker
2016-07-05 15:47               ` Joel Brobecker
2016-07-05 16:36           ` gdbserver/ada testing broken (was: Re: [pushed] Fix gdbserver/MI testing regression) Joel Brobecker
2016-07-05 17:19             ` gdbserver/ada testing broken Simon Marchi
2016-07-06 13:23               ` Joel Brobecker
2016-07-06 14:28                 ` Simon Marchi
2016-07-19 17:11               ` Pedro Alves
2016-07-04 17:22         ` [pushed] Fix gdbserver/MI testing regression Simon Marchi
2016-05-06 12:40 ` [PATCH v3 11/34] Make out and error streams be per UI Pedro Alves
2016-05-06 12:40 ` [PATCH v3 23/34] New function should_print_stop_to_console Pedro Alves
2016-05-06 12:40 ` [PATCH v3 13/34] Make current_ui_out be per UI Pedro Alves
2016-05-06 12:41 ` [PATCH v3 06/34] Introduce interpreter factories Pedro Alves
2016-05-18 19:18   ` Simon Marchi
2016-05-26 18:11     ` Pedro Alves
2016-05-18 19:20   ` Simon Marchi [this message]
2016-05-26 18:08     ` Pedro Alves
2016-05-06 12:42 ` [PATCH v3 30/34] [DOC] Document support for running interpreters on separate UI channels Pedro Alves
2016-05-06 13:04   ` Eli Zaretskii
2016-05-26 11:11     ` Pedro Alves
2016-06-17 17:24       ` Pedro Alves
2016-06-17 20:02         ` Eli Zaretskii
2016-05-06 12:43 ` [PATCH v3 07/34] Make the intepreters output to all UIs Pedro Alves
2016-05-19 15:16   ` Simon Marchi
2016-05-26 18:12     ` Pedro Alves
2016-05-06 12:43 ` [PATCH v3 08/34] Always run async signal handlers in the main UI Pedro Alves
2016-05-19 19:28   ` Simon Marchi
2016-05-26 18:13     ` Pedro Alves
2016-05-26 18:15       ` Simon Marchi
2016-05-06 12:43 ` [PATCH v3 25/34] Only send sync execution command output to the UI that ran the command Pedro Alves
2016-05-06 12:43 ` [PATCH v3 28/34] Make stdin be per UI Pedro Alves
2016-05-06 12:43 ` [PATCH v3 12/34] Delete def_uiout Pedro Alves
2016-05-06 12:43 ` [PATCH v3 17/34] Introduce display_mi_prompt Pedro Alves
2016-05-06 12:43 ` [PATCH v3 04/34] Make gdb_stdout&co be per UI Pedro Alves
2016-05-06 12:43 ` [PATCH v3 05/34] Make the interpreters " Pedro Alves
2016-05-18 17:51   ` Simon Marchi
2016-05-26 18:08     ` Pedro Alves
2016-05-06 12:43 ` [PATCH v3 10/34] Make input_fd " Pedro Alves
2016-05-06 12:45 ` [PATCH v3 27/34] Handle UI's terminal closing Pedro Alves
2016-05-06 12:45 ` [PATCH v3 22/34] Fix for spurious prompts in secondary UIs Pedro Alves
2016-05-06 12:45 ` [PATCH v3 26/34] Make main_ui be heap allocated Pedro Alves
2016-05-06 12:45 ` [PATCH v3 34/34] Always switch fork child to the main UI Pedro Alves
2016-05-06 12:45 ` [PATCH v3 32/34] Send deleted watchpoint-scope output to all UIs Pedro Alves
2016-05-06 12:52 ` [PATCH v3 18/34] Make raw_stdout be per MI instance Pedro Alves
2016-05-06 12:53 ` [PATCH v3 09/34] Make instream be per UI Pedro Alves
2016-05-06 12:53 ` [PATCH v3 19/34] Simplify starting the command event loop Pedro Alves
2016-05-26 18:37 ` [PATCH v3 35/34] Add "new-ui console" tests Pedro Alves
2016-06-21  0:23 ` [pushed] Re: [PATCH v3 00/34] Towards great frontend GDB consoles 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=573CC052.6000502@ericsson.com \
    --to=simon.marchi@ericsson.com \
    --cc=gdb-patches@sourceware.org \
    --cc=palves@redhat.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