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.:
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;
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;
}
static void
free_one_thread (thread_info *thread)
{
- free_register_cache (thread_regcache_data (thread));
- free (thread);
+ delete thread;
}
void