Use new and delete for windows_thread_info

This adds a constructor, destructor, and member initializers to
windows_thread_info, and changes gdb and gdbserver to use new and
delete.

gdb/ChangeLog
2020-04-08  Tom Tromey  <tromey@adacore.com>

	* windows-nat.c (windows_add_thread): Use new.
	(windows_init_thread_list, windows_delete_thread): Use delete.
	(get_windows_debug_event): Update.
	* nat/windows-nat.h (struct windows_thread_info): Add constructor,
	destructor, and initializers.

gdbserver/ChangeLog
2020-04-08  Tom Tromey  <tromey@adacore.com>

	* win32-low.c (child_add_thread): Use new.
	(delete_thread_info): Use delete.
This commit is contained in:
Tom Tromey 2020-04-08 14:33:35 -06:00
parent ae1f888075
commit e9534bd257
5 changed files with 41 additions and 20 deletions

View File

@ -1,3 +1,11 @@
2020-04-08 Tom Tromey <tromey@adacore.com>
* windows-nat.c (windows_add_thread): Use new.
(windows_init_thread_list, windows_delete_thread): Use delete.
(get_windows_debug_event): Update.
* nat/windows-nat.h (struct windows_thread_info): Add constructor,
destructor, and initializers.
2020-04-08 Tom Tromey <tromey@adacore.com> 2020-04-08 Tom Tromey <tromey@adacore.com>
* windows-nat.c (struct windows_thread_info): Remove. * windows-nat.c (struct windows_thread_info): Remove.

View File

@ -25,6 +25,20 @@
each thread. */ each thread. */
struct windows_thread_info struct windows_thread_info
{ {
windows_thread_info (DWORD tid_, HANDLE h_, CORE_ADDR tlb)
: tid (tid_),
h (h_),
thread_local_base (tlb)
{
}
~windows_thread_info ()
{
xfree (name);
}
DISABLE_COPY_AND_ASSIGN (windows_thread_info);
/* The Win32 thread identifier. */ /* The Win32 thread identifier. */
DWORD tid; DWORD tid;
@ -35,17 +49,17 @@ struct windows_thread_info
CORE_ADDR thread_local_base; CORE_ADDR thread_local_base;
/* Non zero if SuspendThread was called on this thread. */ /* Non zero if SuspendThread was called on this thread. */
int suspended; int suspended = 0;
#ifdef _WIN32_WCE #ifdef _WIN32_WCE
/* The context as retrieved right after suspending the thread. */ /* The context as retrieved right after suspending the thread. */
CONTEXT base_context; CONTEXT base_context {};
#endif #endif
/* The context of the thread, including any manipulations. */ /* The context of the thread, including any manipulations. */
union union
{ {
CONTEXT context; CONTEXT context {};
#ifdef __x86_64__ #ifdef __x86_64__
WOW64_CONTEXT wow64_context; WOW64_CONTEXT wow64_context;
#endif #endif
@ -53,14 +67,14 @@ struct windows_thread_info
/* Whether debug registers changed since we last set CONTEXT back to /* Whether debug registers changed since we last set CONTEXT back to
the thread. */ the thread. */
int debug_registers_changed; int debug_registers_changed = 0;
/* Nonzero if CONTEXT is invalidated and must be re-read from the /* Nonzero if CONTEXT is invalidated and must be re-read from the
inferior thread. */ inferior thread. */
int reload_context; int reload_context = 0;
/* The name of the thread, allocated by xmalloc. */ /* The name of the thread, allocated by xmalloc. */
char *name; char *name = nullptr;
}; };
#endif #endif

View File

@ -468,16 +468,14 @@ windows_add_thread (ptid_t ptid, HANDLE h, void *tlb, bool main_thread_p)
if ((th = thread_rec (id, FALSE))) if ((th = thread_rec (id, FALSE)))
return th; return th;
th = XCNEW (windows_thread_info); CORE_ADDR base = (CORE_ADDR) (uintptr_t) tlb;
th->tid = id;
th->h = h;
th->thread_local_base = (CORE_ADDR) (uintptr_t) tlb;
#ifdef __x86_64__ #ifdef __x86_64__
/* For WOW64 processes, this is actually the pointer to the 64bit TIB, /* For WOW64 processes, this is actually the pointer to the 64bit TIB,
and the 32bit TIB is exactly 2 pages after it. */ and the 32bit TIB is exactly 2 pages after it. */
if (wow64_process) if (wow64_process)
th->thread_local_base += 0x2000; base += 0x2000;
#endif #endif
th = new windows_thread_info (id, h, base);
thread_list.push_back (th); thread_list.push_back (th);
/* Add this new thread to the list of threads. /* Add this new thread to the list of threads.
@ -536,7 +534,7 @@ windows_init_thread_list (void)
init_thread_list (); init_thread_list ();
for (windows_thread_info *here : thread_list) for (windows_thread_info *here : thread_list)
xfree (here); delete here;
thread_list.clear (); thread_list.clear ();
} }
@ -581,8 +579,7 @@ windows_delete_thread (ptid_t ptid, DWORD exit_code, bool main_thread_p)
if (iter != thread_list.end ()) if (iter != thread_list.end ())
{ {
xfree ((*iter)->name); delete *iter;
xfree (*iter);
thread_list.erase (iter); thread_list.erase (iter);
} }
} }
@ -1718,7 +1715,7 @@ windows_nat_target::get_windows_debug_event (int pid,
BOOL debug_event; BOOL debug_event;
DWORD continue_status, event_code; DWORD continue_status, event_code;
windows_thread_info *th; windows_thread_info *th;
static windows_thread_info dummy_thread_info; static windows_thread_info dummy_thread_info (0, 0, 0);
DWORD thread_id = 0; DWORD thread_id = 0;
last_sig = GDB_SIGNAL_0; last_sig = GDB_SIGNAL_0;

View File

@ -1,3 +1,8 @@
2020-04-08 Tom Tromey <tromey@adacore.com>
* win32-low.c (child_add_thread): Use new.
(delete_thread_info): Use delete.
2020-04-08 Tom Tromey <tromey@adacore.com> 2020-04-08 Tom Tromey <tromey@adacore.com>
* win32-low.h (struct windows_thread_info): Remove. * win32-low.h (struct windows_thread_info): Remove.

View File

@ -212,10 +212,7 @@ child_add_thread (DWORD pid, DWORD tid, HANDLE h, void *tlb)
if ((th = thread_rec (ptid, FALSE))) if ((th = thread_rec (ptid, FALSE)))
return th; return th;
th = XCNEW (windows_thread_info); th = new windows_thread_info (tid, h, (CORE_ADDR) (uintptr_t) tlb);
th->tid = tid;
th->h = h;
th->thread_local_base = (CORE_ADDR) (uintptr_t) tlb;
add_thread (ptid, th); add_thread (ptid, th);
@ -233,7 +230,7 @@ delete_thread_info (thread_info *thread)
remove_thread (thread); remove_thread (thread);
CloseHandle (th->h); CloseHandle (th->h);
free (th); delete th;
} }
/* Delete a thread from the list of threads. */ /* Delete a thread from the list of threads. */