aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2018-06-29 20:45:34 +0100
committerPedro Alves <palves@redhat.com>2018-06-29 20:45:34 +0100
commitc76a8ea36c9567b2b194285ceeae29bbfc26b20a (patch)
treee98d745c585aedcba9f53be5d80e7c472ba67120
parentcd2bb709940d33668fe6dbe8d4ffee0ed44c25e6 (diff)
downloadfsf-binutils-gdb-c76a8ea36c9567b2b194285ceeae29bbfc26b20a.zip
fsf-binutils-gdb-c76a8ea36c9567b2b194285ceeae29bbfc26b20a.tar.gz
fsf-binutils-gdb-c76a8ea36c9567b2b194285ceeae29bbfc26b20a.tar.bz2
remote & target_extra_thread_info, use cache w/ qThreadExtraInfo and qP too
The following patch will make "info threads" call target_extra_thread_info more frequently. When I looked at the remote implementation, I noticed that if we're not using qXfer:threads:read, then we'd be increasing the remote protocol traffic. This commit prevents that from happening. Also, it removes a gratuitous local static buffer, which seems good on its own. gdb/ChangeLog: 2018-06-29 Pedro Alves <palves@redhat.com> * remote.c (remote_target::extra_thread_info): Delete 'display_buf' and 'n' locals. from the cache, regardless of packet mechanims is in use. Use cache for qThreadExtra and qP methods too.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/remote.c49
2 files changed, 30 insertions, 26 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8cce351..2d75bd2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
2018-06-29 Pedro Alves <palves@redhat.com>
+ * remote.c (remote_target::extra_thread_info): Delete
+ 'display_buf' and 'n' locals. from the cache, regardless of
+ packet mechanims is in use. Use cache for qThreadExtra and qP
+ methods too.
+
+2018-06-29 Pedro Alves <palves@redhat.com>
+
* blockframe.c (find_pc_sect_containing_function): New function.
* breakpoint.c (print_breakpoint_location): Don't call
find_pc_sect_function.
diff --git a/gdb/remote.c b/gdb/remote.c
index cf56a56..f88e801 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -3830,12 +3830,9 @@ const char *
remote_target::extra_thread_info (thread_info *tp)
{
struct remote_state *rs = get_remote_state ();
- int result;
int set;
threadref id;
struct gdb_ext_thread_info threadinfo;
- static char display_buf[100]; /* arbitrary... */
- int n = 0; /* position in display_buf */
if (rs->remote_desc == 0) /* paranoia */
internal_error (__FILE__, __LINE__,
@@ -3847,15 +3844,18 @@ remote_target::extra_thread_info (thread_info *tp)
server doesn't know about it. */
return NULL;
+ std::string &extra = get_remote_thread_info (tp)->extra;
+
+ /* If already have cached info, use it. */
+ if (!extra.empty ())
+ return extra.c_str ();
+
if (packet_support (PACKET_qXfer_threads) == PACKET_ENABLE)
{
- if (tp->priv != NULL)
- {
- const std::string &extra = get_remote_thread_info (tp)->extra;
- return !extra.empty () ? extra.c_str () : NULL;
- }
- else
- return NULL;
+ /* If we're using qXfer:threads:read, then the extra info is
+ included in the XML. So if we didn't have anything cached,
+ it's because there's really no extra info. */
+ return NULL;
}
if (rs->use_threadextra_query)
@@ -3871,10 +3871,9 @@ remote_target::extra_thread_info (thread_info *tp)
getpkt (&rs->buf, &rs->buf_size, 0);
if (rs->buf[0] != 0)
{
- n = std::min (strlen (rs->buf) / 2, sizeof (display_buf));
- result = hex2bin (rs->buf, (gdb_byte *) display_buf, n);
- display_buf [result] = '\0';
- return display_buf;
+ extra.resize (strlen (rs->buf) / 2);
+ hex2bin (rs->buf, (gdb_byte *) &extra[0], extra.size ());
+ return extra.c_str ();
}
}
@@ -3887,22 +3886,20 @@ remote_target::extra_thread_info (thread_info *tp)
if (threadinfo.active)
{
if (*threadinfo.shortname)
- n += xsnprintf (&display_buf[0], sizeof (display_buf) - n,
- " Name: %s,", threadinfo.shortname);
+ string_appendf (extra, " Name: %s", threadinfo.shortname);
if (*threadinfo.display)
- n += xsnprintf (&display_buf[n], sizeof (display_buf) - n,
- " State: %s,", threadinfo.display);
+ {
+ if (!extra.empty ())
+ extra += ',';
+ string_appendf (extra, " State: %s", threadinfo.display);
+ }
if (*threadinfo.more_display)
- n += xsnprintf (&display_buf[n], sizeof (display_buf) - n,
- " Priority: %s", threadinfo.more_display);
-
- if (n > 0)
{
- /* For purely cosmetic reasons, clear up trailing commas. */
- if (',' == display_buf[n-1])
- display_buf[n-1] = ' ';
- return display_buf;
+ if (!extra.empty ())
+ extra += ',';
+ string_appendf (extra, " Priority: %s", threadinfo.more_display);
}
+ return extra.c_str ();
}
return NULL;
}