public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Jan Kratochvil <jan.kratochvil@redhat.com>
To: gdb-patches@sourceware.org
Subject: [PATCH 3/6] register_dummy_frame_dtor: Permit multiple dtors
Date: Fri, 08 May 2015 20:21:00 -0000	[thread overview]
Message-ID: <20150508202136.15830.94995.stgit@host1.jankratochvil.net> (raw)
In-Reply-To: <20150508202119.15830.18218.stgit@host1.jankratochvil.net>

Hi,

later patch needs two independent destructors for the same dummy_frame.
Therefore the registrar has been extended to an arbitrary number of
destructors.


Jan


gdb/ChangeLog
2015-05-08  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* dummy-frame.c (struct dummy_frame_dtor_list): New.
	(struct dummy_frame): Replace dtor and dtor_data by dtor_list.
	(remove_dummy_frame): Process dtor_list.
	(pop_dummy_frame): Process dtor_list.
	(register_dummy_frame_dtor): Maintain dtor_list.
	(find_dummy_frame_dtor): Handle dtor_list.
	* dummy-frame.h (register_dummy_frame_dtor, find_dummy_frame_dtor):
	Update comments.
---
 gdb/dummy-frame.c |   60 +++++++++++++++++++++++++++++++++++++++++------------
 gdb/dummy-frame.h |    9 ++++----
 2 files changed, 51 insertions(+), 18 deletions(-)

diff --git a/gdb/dummy-frame.c b/gdb/dummy-frame.c
index 6c4fb4c..f1d3de8 100644
--- a/gdb/dummy-frame.c
+++ b/gdb/dummy-frame.c
@@ -49,6 +49,20 @@ dummy_frame_id_eq (struct dummy_frame_id *id1,
   return frame_id_eq (id1->id, id2->id) && ptid_equal (id1->ptid, id2->ptid);
 }
 
+/* List of dummy_frame destructors.  */
+
+struct dummy_frame_dtor_list
+{
+  /* Next element in the list or NULL if this is the last element.  */
+  struct dummy_frame_dtor_list *next;
+
+  /* If non-NULL, a destructor that is run when this dummy frame is freed.  */
+  dummy_frame_dtor_ftype *dtor;
+
+  /* Arbitrary data that is passed to DTOR.  */
+  void *dtor_data;
+};
+
 /* Dummy frame.  This saves the processor state just prior to setting
    up the inferior function call.  Older targets save the registers
    on the target stack (but that really slows down function calls).  */
@@ -63,11 +77,9 @@ struct dummy_frame
   /* The caller's state prior to the call.  */
   struct infcall_suspend_state *caller_state;
 
-  /* If non-NULL, a destructor that is run when this dummy frame is freed.  */
-  dummy_frame_dtor_ftype *dtor;
-
-  /* Arbitrary data that is passed to DTOR.  */
-  void *dtor_data;
+  /* First element of destructors list or NULL if there are no
+     destructors registered for this dummy_frame.  */
+  struct dummy_frame_dtor_list *dtor_list;
 };
 
 static struct dummy_frame *dummy_frame_stack = NULL;
@@ -96,8 +108,14 @@ remove_dummy_frame (struct dummy_frame **dummy_ptr)
 {
   struct dummy_frame *dummy = *dummy_ptr;
 
-  if (dummy->dtor != NULL)
-    dummy->dtor (dummy->dtor_data, 0);
+  while (dummy->dtor_list != NULL)
+    {
+      struct dummy_frame_dtor_list *list = dummy->dtor_list;
+
+      dummy->dtor_list = list->next;
+      list->dtor (list->dtor_data, 0);
+      xfree (list);
+    }
 
   *dummy_ptr = dummy->next;
   discard_infcall_suspend_state (dummy->caller_state);
@@ -138,8 +156,14 @@ pop_dummy_frame (struct dummy_frame **dummy_ptr)
 
   gdb_assert (ptid_equal (dummy->id.ptid, inferior_ptid));
 
-  if (dummy->dtor != NULL)
-    dummy->dtor (dummy->dtor_data, 1);
+  while (dummy->dtor_list != NULL)
+    {
+      struct dummy_frame_dtor_list *list = dummy->dtor_list;
+
+      dummy->dtor_list = list->next;
+      list->dtor (list->dtor_data, 1);
+      xfree (list);
+    }
 
   restore_infcall_suspend_state (dummy->caller_state);
 
@@ -212,13 +236,16 @@ register_dummy_frame_dtor (struct frame_id dummy_id, ptid_t ptid,
 {
   struct dummy_frame_id id = { dummy_id, ptid };
   struct dummy_frame **dp, *d;
+  struct dummy_frame_dtor_list *list;
 
   dp = lookup_dummy_frame (&id);
   gdb_assert (dp != NULL);
   d = *dp;
-  gdb_assert (d->dtor == NULL);
-  d->dtor = dtor;
-  d->dtor_data = dtor_data;
+  list = xmalloc (sizeof (*list));
+  list->next = d->dtor_list;
+  d->dtor_list = list;
+  list->dtor = dtor;
+  list->dtor_data = dtor_data;
 }
 
 /* See dummy-frame.h.  */
@@ -229,8 +256,13 @@ find_dummy_frame_dtor (dummy_frame_dtor_ftype *dtor, void *dtor_data)
   struct dummy_frame *d;
 
   for (d = dummy_frame_stack; d != NULL; d = d->next)
-    if (d->dtor == dtor && d->dtor_data == dtor_data)
-      return 1;
+    {
+      struct dummy_frame_dtor_list *list;
+
+      for (list = d->dtor_list; list != NULL; list = list->next)
+	if (list->dtor == dtor && list->dtor_data == dtor_data)
+	  return 1;
+    }
   return 0;
 }
 
diff --git a/gdb/dummy-frame.h b/gdb/dummy-frame.h
index c156b81..9b5aff5 100644
--- a/gdb/dummy-frame.h
+++ b/gdb/dummy-frame.h
@@ -59,14 +59,15 @@ extern const struct frame_unwind dummy_frame_unwind;
 typedef void (dummy_frame_dtor_ftype) (void *data, int registers_valid);
 
 /* Call DTOR with DTOR_DATA when DUMMY_ID frame of thread PTID gets discarded.
-   Dummy frame with DUMMY_ID must exist.  There must be no other call of
-   register_dummy_frame_dtor for that dummy frame.  */
+   Dummy frame with DUMMY_ID must exist.  Multiple destructors may be
+   registered, they will be called in the reverse order of registrations
+   (LIFO).  */
 extern void register_dummy_frame_dtor (struct frame_id dummy_id, ptid_t ptid,
 				       dummy_frame_dtor_ftype *dtor,
 				       void *dtor_data);
 
-/* Return 1 if there exists dummy frame with registered DTOR and DTOR_DATA.
-   Return 0 otherwise.  */
+/* Return 1 if there exists any dummy frame with any of its registered
+   destructors equal to both DTOR and DTOR_DATA.  Return 0 otherwise.  */
 extern int find_dummy_frame_dtor (dummy_frame_dtor_ftype *dtor,
 				  void *dtor_data);
 

  parent reply	other threads:[~2015-05-08 20:21 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-08 20:21 [PATCH 1/6] dummy_frame_dtor_ftype vs. call_function_by_hand_dummy_dtor_ftype cleanup Jan Kratochvil
2015-05-08 20:21 ` [PATCH 2/6] Call dummy_frame_dtor_ftype also from remove_dummy_frame Jan Kratochvil
2015-05-13 12:57   ` Pedro Alves
2015-05-13 13:52     ` Jan Kratochvil
2015-05-13 18:53   ` [commit] " Jan Kratochvil
2015-05-08 20:21 ` [PATCH 5/6] Remove stop_registers Jan Kratochvil
2015-05-13 13:10   ` Pedro Alves
2015-05-13 18:55     ` [commit] " Jan Kratochvil
2015-05-08 20:21 ` [PATCH 4/6] infcall: stop_registers -> register_dummy_frame_dtor Jan Kratochvil
2015-05-13 13:28   ` Pedro Alves
2015-05-13 18:54     ` [commit] " Jan Kratochvil
2015-05-08 20:21 ` Jan Kratochvil [this message]
2015-05-13 13:00   ` [PATCH 3/6] register_dummy_frame_dtor: Permit multiple dtors Pedro Alves
2015-05-13 19:50     ` [commit] " Jan Kratochvil
2015-05-08 20:22 ` [PATCH 6/6] Make regcache_cpy_no_passthrough static Jan Kratochvil
2015-05-13 13:16   ` Pedro Alves
2015-05-13 19:49     ` [commit] " Jan Kratochvil
2015-05-13 12:55 ` [PATCH 1/6] dummy_frame_dtor_ftype vs. call_function_by_hand_dummy_dtor_ftype cleanup Pedro Alves
2015-05-13 13:56   ` [commit] " Jan Kratochvil

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=20150508202136.15830.94995.stgit@host1.jankratochvil.net \
    --to=jan.kratochvil@redhat.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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).