[1/3] gdbserver: make thread_info non-POD

Message ID 20211012161755.502639-1-simon.marchi@efficios.com
State New
Headers show
Series
  • [1/3] gdbserver: make thread_info non-POD
Related show

Commit Message

Tom de Vries via Gdb-patches Oct. 12, 2021, 4:17 p.m.
From: Simon Marchi <simon.marchi@polymtl.ca>


Add a constructor and a destructor.  The constructor takes care of the
initialization that happened in add_thread, while the destructor takes
care of the freeing that happened in free_one_thread.  This is needed to
make target_waitstatus non-POD, as thread_info contains a member of that
type.

Change-Id: I1db321b4de9dd233ede0d5c101950f1d6f1d13b7
---
 gdbserver/gdbthread.h  | 21 ++++++++++++++++-----
 gdbserver/inferiors.cc | 11 ++---------
 2 files changed, 18 insertions(+), 14 deletions(-)

-- 
2.33.0

Comments

Tom de Vries via Gdb-patches Oct. 21, 2021, 8:15 p.m. | #1
On 2021-10-12 12:17 p.m., Simon Marchi wrote:
> From: Simon Marchi <simon.marchi@polymtl.ca>

> 

> Add a constructor and a destructor.  The constructor takes care of the

> initialization that happened in add_thread, while the destructor takes

> care of the freeing that happened in free_one_thread.  This is needed to

> make target_waitstatus non-POD, as thread_info contains a member of that

> type.

> 

> Change-Id: I1db321b4de9dd233ede0d5c101950f1d6f1d13b7


I pushed these patches.

Simon

Patch

diff --git a/gdbserver/gdbthread.h b/gdbserver/gdbthread.h
index 0e45f9a7100..fc9b4d20435 100644
--- a/gdbserver/gdbthread.h
+++ b/gdbserver/gdbthread.h
@@ -29,20 +29,31 @@  struct regcache;
 
 struct thread_info
 {
+  thread_info (ptid_t id, void *target_data)
+    : id (id), target_data (target_data)
+  {
+    this->last_status.kind = TARGET_WAITKIND_IGNORE;
+  }
+
+  ~thread_info ()
+  {
+    free_register_cache (this->regcache_data);
+  }
+
   /* The id of this thread.  */
   ptid_t id;
 
   void *target_data;
-  struct regcache *regcache_data;
+  struct regcache *regcache_data = nullptr;
 
   /* The last resume GDB requested on this thread.  */
-  enum resume_kind last_resume_kind;
+  enum resume_kind last_resume_kind = resume_continue;
 
   /* The last wait status reported for this thread.  */
   struct target_waitstatus last_status;
 
   /* True if LAST_STATUS hasn't been reported to GDB yet.  */
-  int status_pending_p;
+  int status_pending_p = 0;
 
   /* Given `while-stepping', a thread may be collecting data for more
      than one tracepoint simultaneously.  E.g.:
@@ -67,10 +78,10 @@  struct thread_info
    tracepoint actions this thread is now collecting; NULL if empty.
    Each item in the list holds the current step of the while-stepping
    action.  */
-  struct wstep_state *while_stepping;
+  struct wstep_state *while_stepping = nullptr;
 
   /* Branch trace target information for this thread.  */
-  struct btrace_target_info *btrace;
+  struct btrace_target_info *btrace = nullptr;
 };
 
 extern std::list<thread_info *> all_threads;
diff --git a/gdbserver/inferiors.cc b/gdbserver/inferiors.cc
index 32f847812e6..a636266c798 100644
--- a/gdbserver/inferiors.cc
+++ b/gdbserver/inferiors.cc
@@ -36,19 +36,13 @@  static std::string current_inferior_cwd;
 struct thread_info *
 add_thread (ptid_t thread_id, void *target_data)
 {
-  struct thread_info *new_thread = XCNEW (struct thread_info);
-
-  new_thread->id = thread_id;
-  new_thread->last_resume_kind = resume_continue;
-  new_thread->last_status.kind = TARGET_WAITKIND_IGNORE;
+  thread_info *new_thread = new thread_info (thread_id, target_data);
 
   all_threads.push_back (new_thread);
 
   if (current_thread == NULL)
     current_thread = new_thread;
 
-  new_thread->target_data = target_data;
-
   return new_thread;
 }
 
@@ -93,8 +87,7 @@  find_any_thread_of_pid (int pid)
 static void
 free_one_thread (thread_info *thread)
 {
-  free_register_cache (thread_regcache_data (thread));
-  free (thread);
+  delete thread;
 }
 
 void