Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Doug Evans <dje@google.com>
To: Keith Seitz <keiths@redhat.com>
Cc: gdb-patches <gdb-patches@sourceware.org>
Subject: Re: [PATCH 00/18] Implement full completer limiting
Date: Thu, 30 Apr 2015 00:26:00 -0000	[thread overview]
Message-ID: <21825.24292.47719.109523@ruffy2.mtv.corp.google.com> (raw)
In-Reply-To: <55412566.2020403@redhat.com>

Keith Seitz writes:
 > On 04/19/2015 08:21 PM, Doug Evans wrote:
 > > I've gone over the entire patch set.  A few things I like, but there's
 > > at least one thing I'm concerned about.  Replicating the above switch
 > > in each completer: IWBN to avoid such duplication.
 > > We should still be able to remove the global state and fix 17960.
 > 
 > The original patch series (necessarily IMO) exposed this
 > memory-management issue, and a global maintainer approved the change.
 > Surely the approving maintainer realized that this code would propagate
 > to other completer functions eventually, no? [I certainly hope the
 > maintainer did not accept that the complete_line hack would be long-lived!]

Just to make sure we're on the same page,
which complete_line hack?

 > I can certainly change the series to add a function which attempts to
 > hide this detail. For example:
 > 
 > /* Returns whether the maximum number of completions has been
 > reached/exceeded.  */
 > 
 > int
 > add_completion (struct completer_data *cdata, const char *match)
 > {
 >   char *match = xstrdup (name);
 >   enum maybe_add_completion_enum add_status;
 > 
 >   add_status = maybe_add_completion (cdata, match);
 >   switch (add_status)
 >     {
 >     case MAYBE_ADD_COMPLETION_OK:
 >       VEC_safe_push (char_ptr, cdata->results, match);
 >       break;
 >     case MAYBE_ADD_COMPLETION_OK_MAX_REACHED:
 >       VEC_safe_push (char_ptr, cdata->results, match);
 >       return 1;
 >     case MAYBE_ADD_COMPLETION_MAX_REACHED:
 >       xfree (match);
 >       return 1;
 >     case MAYBE_ADD_COMPLETION_DUPLICATE:
 >       xfree (match);
 >       break;
 >     }
 > 
 >   return 0;
 > }
 > 
 > Given that completions (like symbol reading/searching) are extremely
 > time-consuming, one of my design goals was to not introduce anything
 > that might slow down completion, including multiple allocations and copying.

Is there any data that says malloc/copying plays a significant role
in the time?  At this point the main culprit is file i/o and(/or) debug
info processing / symbol table processing.

I can imagine a case where the number of completions is large enough
that malloc/copying becomes an issue, but I think the number of
completions would have to be pretty large, far higher than any
reasonable value a user might set for max-completions.
[for some definition of "reasonable"]

So at this point I haven't been worrying about it.
We're already doing a fair bit of malloc/copying in the
code that's there today, e.g., xstrdup calls in complete_line,
and every user I talk to is thrilled with the feature.
[Maybe in a few years when they've forgotten it used to take
minutes will they start to complain about the seconds. :-)]

 > Unfortunately with this goal in mind, the use of this proposed function
 > (alone) can only be pushed into four of the fourteen functions dealing
 > with completions.
 > 
 > The ten remaining functions would require an additional malloc/copy or
 > yet another API function, e.g.,
 > add_completion_1/add_completionA/add_completion_Ex [:-)] to deal with
 > this case. All this to simply forgo checking the return result of
 > maybe_add_completion. I don't see the benefit.
 > 
 > Developers already have to deal with memory management in exception
 > handling, which is more complex than simply checking the return result
 > of a function -- especially in (what I would perceive as) cut-n-paste
 > code like this.

Any time one duplicates code one needs to consider the increased
maintenance burden. Plus less code is easier to read/digest.
I'd like to avoid the duplication where I can.

 > Or perhaps you had another idea in mind?

Some completers don't really need to track the count,
(e.g., even if there were 10000 signals, I doubt it'd matter if
signal_completer tracked them - interesting experiment though),
and the final pass performs its own limiting, so one thing
I have in mind is that individual tracking by every completer
is unnecessary.

Another thought I had was, for individual completers that do need
to track the result, to what extent can they all use the same
API provided by completion tracking (e.g., have an API call
that contains the switch() and have the completers call it, like
you've got above).
That way the quantity of these switches doesn't proliferate.

It may be that this API function can handle all completers,
in which case great, signal_completer et.al. can use it too.
I'm just not big on making it a requirement.
[Though of course I would like the consistency. :-)]

 > In any case, let me know what you'd like me to do, and I'll get right at it.

Does the above make sense?


      reply	other threads:[~2015-04-29 22:44 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-13 19:23 Keith Seitz
2015-04-13 19:23 ` [PATCH 12/18] Implement completion limiting for sim_command_completer Keith Seitz
2015-04-14 15:28   ` Mike Frysinger
2015-05-05 15:03     ` Keith Seitz
2015-05-05 15:34       ` Mike Frysinger
2015-05-05 15:53         ` Keith Seitz
2015-04-13 19:23 ` [PATCH 13/18] Implement completion limiting for complete_on_enum Keith Seitz
2015-04-13 19:23 ` [PATCH 10/18] Implement completion limiting for cmdpy_completer Keith Seitz
2015-04-13 19:23 ` [PATCH 15/18] Implement completion limiting for scmcmd_add_completion Keith Seitz
2015-04-13 19:23 ` [PATCH 17/18] Use the hashtable to accumulate completion results Keith Seitz
2015-04-13 19:23 ` [PATCH 02/18] Remove completion_tracker_t from the public completion API Keith Seitz
2015-04-13 19:23 ` [PATCH 14/18] Implement completion limiting in add_struct_fields Keith Seitz
2015-04-13 19:23 ` [PATCH 07/18] Implement completion limiting for filename_completer Keith Seitz
2015-04-13 19:23 ` [PATCH 09/18] Implement completion limiting for interpreter_completer Keith Seitz
2015-04-13 19:23 ` [PATCH 16/18] Make the completion API completely opaque Keith Seitz
2015-04-13 19:23 ` [PATCH 06/18] Implement completion limiting for condition_completer Keith Seitz
2015-04-13 19:23 ` [PATCH 18/18] Remove the vector return result from the completion API Keith Seitz
2015-04-13 19:23 ` [PATCH 04/18] Implement completion limiting for add_filename_to_list Keith Seitz
2015-04-13 19:23 ` [PATCH 01/18] Add struct completer_data to the completion API Keith Seitz
2015-04-13 19:23 ` [PATCH 03/18] Implement completion limiting for complete_on_cmdlist Keith Seitz
2015-04-13 19:23 ` [PATCH 11/18] Implement completion limiting for reg_or_group_completer Keith Seitz
2015-04-13 19:23 ` [PATCH 08/18] Implement completion limiting for signal_completer Keith Seitz
2015-04-13 19:23 ` [PATCH 05/18] Implement completion limiting for ada_make_symbol_completion_list Keith Seitz
2015-04-20  3:21 ` [PATCH 00/18] Implement full completer limiting Doug Evans
2015-04-29 19:19   ` Keith Seitz
2015-04-30  0:26     ` Doug Evans [this message]

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=21825.24292.47719.109523@ruffy2.mtv.corp.google.com \
    --to=dje@google.com \
    --cc=gdb-patches@sourceware.org \
    --cc=keiths@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