From: Yao Qi <yao@codesourcery.com>
To: <gdb-patches@sourceware.org>
Subject: [PATCH 09/12] Delete varobj's children on traceframe is changed.
Date: Fri, 14 Feb 2014 08:46:00 -0000 [thread overview]
Message-ID: <1392367471-13527-10-git-send-email-yao@codesourcery.com> (raw)
In-Reply-To: <1392367471-13527-1-git-send-email-yao@codesourcery.com>
Hi,
The memory availability varies on trace frames. When
--available-children-only is used, the varobj tree structure changes
when trace frame is changed. GDB has to remove varobj's children if
it is marked as 'available_children_only'. For example, in traceframe
1, foo.a and foo.c is collected, and in traceframe 2, foo.b is
collected,
struct foo
{
int a; /* Collected in traceframe 1 */
int b; /* Collected in traceframe 2 */
int c; /* Collected in traceframe 1 */
};
When available-children-only is used, the expected result is that in
traceframe 1, foo has two children (a and c), and foo has one child
(b) in traceframe 2. Without this patch, foo has a, b, and c in
traceframe 2, which is wrong.
In this patch, we install a traceframe_changed observer to clear
varobjs marked as 'available_children_only'.
V2:
- Move common code to varobj_clear_children.
- Update comments.
gdb:
2014-02-14 Yao Qi <yao@codesourcery.com>
* varobj.c: Include "observer.h".
(varobj_clear_children): New functiuon.
(varobj_set_available_children_only): Move some code to
varobj_clear_children. Call varobj_clear_children.
(varobj_delete_if_available_children_only): New function.
(varobj_traceframe_changed): New function.
(_initialize_varobj): Install varobj_traceframe_changed to
traceframe_changed observer.
---
gdb/varobj.c | 47 +++++++++++++++++++++++++++++++++++++++--------
1 files changed, 39 insertions(+), 8 deletions(-)
diff --git a/gdb/varobj.c b/gdb/varobj.c
index bfa6b1d..f0ea383 100644
--- a/gdb/varobj.c
+++ b/gdb/varobj.c
@@ -24,6 +24,7 @@
#include "gdbcmd.h"
#include "block.h"
#include "valprint.h"
+#include "observer.h"
#include "gdb_assert.h"
#include <string.h>
@@ -919,6 +920,21 @@ varobj_get_num_children (struct varobj *var)
return var->num_children >= 0 ? var->num_children : 0;
}
+/* Clear children of VAR and stuff needed for iteration over
+ children. */
+
+static void
+varobj_clear_children (struct varobj *var)
+{
+ /* If there are any children now, wipe them. */
+ varobj_delete (var, NULL, /* children only */ 1);
+ var->num_children = -1;
+
+ varobj_iter_delete (var->dynamic->child_iter);
+ var->dynamic->child_iter = NULL;
+ varobj_clear_saved_item (var->dynamic);
+}
+
/* Update the field available_children_only of variable object VAR
with AVAILABLE_ONLY. */
@@ -927,15 +943,9 @@ varobj_set_available_children_only (struct varobj *var, int available_only)
{
if (var->dynamic->available_children_only != available_only)
{
- /* If there are any children now, wipe them. */
- varobj_delete (var, NULL, /* children only */ 1);
- var->num_children = -1;
- var->dynamic->available_children_only = available_only;
+ varobj_clear_children (var);
- /* We're starting over, so get rid of any iterator. */
- varobj_iter_delete (var->dynamic->child_iter);
- var->dynamic->child_iter = NULL;
- varobj_clear_saved_item (var->dynamic);
+ var->dynamic->available_children_only = available_only;
}
}
@@ -2753,6 +2763,25 @@ all_root_varobjs (void (*func) (struct varobj *var, void *data), void *data)
(*func) (var_root->rootvar, data);
}
}
+
+/* Delete VAR's children if it is marked as 'available_children_only'. */
+
+static void
+varobj_delete_if_available_children_only (struct varobj *var, void *data)
+{
+ if (var->dynamic->available_children_only)
+ varobj_clear_children (var);
+
+}
+
+/* The callback installed for traceframe_changed events. */
+
+static void
+varobj_traceframe_changed (int tfnum, int tpnum)
+{
+ all_root_varobjs (varobj_delete_if_available_children_only , NULL);
+}
+
\f
extern void _initialize_varobj (void);
void
@@ -2770,6 +2799,8 @@ _initialize_varobj (void)
_("When non-zero, varobj debugging is enabled."),
NULL, show_varobjdebug,
&setlist, &showlist);
+
+ observer_attach_traceframe_changed (varobj_traceframe_changed);
}
/* Invalidate varobj VAR if it is tied to locals and re-create it if it is
--
1.7.7.6
next prev parent reply other threads:[~2014-02-14 8:46 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-14 8:46 [RFC 00/12 V2] Visit varobj available children only in MI Yao Qi
2014-02-14 8:46 ` [PATCH 12/12] NEWS and Doc on --available-children-only Yao Qi
2014-02-14 9:40 ` Eli Zaretskii
2014-02-17 9:46 ` Yao Qi
2014-02-17 15:04 ` Eli Zaretskii
2014-02-18 2:01 ` Yao Qi
2014-02-18 5:11 ` Eli Zaretskii
2014-02-18 7:14 ` Yao Qi
2014-02-18 15:07 ` Eli Zaretskii
2014-02-14 8:46 ` [PATCH 03/12] Iterate over 'struct varobj_item' instead of PyObject Yao Qi
2014-04-23 19:29 ` Keith Seitz
2014-05-21 18:01 ` Tom Tromey
2014-05-23 1:33 ` Yao Qi
2014-06-04 20:22 ` Tom Tromey
2014-02-14 8:46 ` [PATCH 02/12] Generalize varobj iterator Yao Qi
2014-04-23 19:24 ` Keith Seitz
2014-05-21 17:51 ` Tom Tromey
2014-05-23 1:23 ` Yao Qi
2014-06-04 20:21 ` Tom Tromey
2014-06-05 5:36 ` Yao Qi
2014-06-05 18:21 ` Tom Tromey
2014-02-14 8:46 ` [PATCH 06/12] Use varobj_is_dynamic_p more widely Yao Qi
2014-04-24 18:17 ` Keith Seitz
2014-05-21 18:04 ` Tom Tromey
2014-02-14 8:46 ` [PATCH 04/12] Remove #if HAVE_PYTHON Yao Qi
2014-04-23 19:25 ` Keith Seitz
2014-05-21 17:52 ` Tom Tromey
2014-02-14 8:46 ` [PATCH 10/12] Match dynamic="1" in the output of -var-list-children Yao Qi
2014-04-24 20:50 ` Keith Seitz
2014-02-14 8:46 ` Yao Qi [this message]
2014-04-24 20:45 ` [PATCH 09/12] Delete varobj's children on traceframe is changed Keith Seitz
2014-02-14 8:46 ` [PATCH 08/12] Iterator varobj_items by their availability Yao Qi
2014-04-24 20:28 ` Keith Seitz
2014-02-14 8:46 ` [PATCH 11/12] Test case Yao Qi
2014-04-18 11:45 ` Yao Qi
2014-04-24 20:53 ` Keith Seitz
2014-02-14 8:46 ` [PATCH 05/12] Rename varobj_pretty_printed_p to varobj_is_dynamic_p Yao Qi
2014-04-24 17:39 ` Keith Seitz
2014-05-21 18:02 ` Tom Tromey
2014-02-14 8:46 ` [PATCH 01/12] Use 'struct varobj_item' to represent name and value pair Yao Qi
2014-04-23 18:16 ` Keith Seitz
2014-05-21 17:53 ` Tom Tromey
2014-02-14 8:46 ` [PATCH 07/12] MI option --available-children-only Yao Qi
2014-04-24 20:02 ` Keith Seitz
[not found] ` <5327A296.3050605@codesourcery.com>
2014-04-04 2:00 ` [RFC 00/12 V2] Visit varobj available children only in MI Yao Qi
2014-04-17 1:12 ` ping : " Yao Qi
2014-04-21 16:20 ` Joel Brobecker
2014-04-22 2:54 ` Yao Qi
2014-06-12 7:37 ` Yao Qi
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=1392367471-13527-10-git-send-email-yao@codesourcery.com \
--to=yao@codesourcery.com \
--cc=gdb-patches@sourceware.org \
/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