gdbserver: make thread_info non-POD

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
This commit is contained in:
Simon Marchi
2021-09-28 16:02:29 -04:00
committed by Simon Marchi
parent add3db9182
commit d2f325df0b
2 changed files with 18 additions and 14 deletions

View File

@@ -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;

View File

@@ -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