mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-05 12:53:16 +08:00
Remove the "next" field from windows_thread_info
This changes windows_thread_info to remove the "next" field, replacing the linked list of threads with a vector. This is a prerequisite to sharing this structure with gdbserver, which manages threads differently. gdb/ChangeLog 2020-04-08 Tom Tromey <tromey@adacore.com> * windows-nat.c (struct windows_thread_info): Remove typedef. (thread_head): Remove. (thread_list): New global. (thread_rec, windows_add_thread, windows_init_thread_list) (windows_delete_thread, windows_continue): Update.
This commit is contained in:
parent
0f2265e246
commit
93366324f5
@ -1,3 +1,11 @@
|
||||
2020-04-08 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* windows-nat.c (struct windows_thread_info): Remove typedef.
|
||||
(thread_head): Remove.
|
||||
(thread_list): New global.
|
||||
(thread_rec, windows_add_thread, windows_init_thread_list)
|
||||
(windows_delete_thread, windows_continue): Update.
|
||||
|
||||
2020-04-08 Simon Marchi <simon.marchi@polymtl.ca>
|
||||
|
||||
* windows-tdep.h (windows_init_abi): Add comment.
|
||||
|
@ -43,6 +43,7 @@
|
||||
#include <cygwin/version.h>
|
||||
#endif
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
#include "filenames.h"
|
||||
#include "symfile.h"
|
||||
@ -245,9 +246,8 @@ static enum gdb_signal last_sig = GDB_SIGNAL_0;
|
||||
|
||||
/* Thread information structure used to track information that is
|
||||
not available in gdb's thread structure. */
|
||||
typedef struct windows_thread_info_struct
|
||||
struct windows_thread_info
|
||||
{
|
||||
struct windows_thread_info_struct *next;
|
||||
DWORD id;
|
||||
HANDLE h;
|
||||
CORE_ADDR thread_local_base;
|
||||
@ -261,10 +261,9 @@ typedef struct windows_thread_info_struct
|
||||
WOW64_CONTEXT wow64_context;
|
||||
#endif
|
||||
};
|
||||
}
|
||||
windows_thread_info;
|
||||
};
|
||||
|
||||
static windows_thread_info thread_head;
|
||||
static std::vector<windows_thread_info *> thread_list;
|
||||
|
||||
/* The process and thread handles for the above context. */
|
||||
|
||||
@ -429,9 +428,7 @@ check (BOOL ok, const char *file, int line)
|
||||
static windows_thread_info *
|
||||
thread_rec (DWORD id, int get_context)
|
||||
{
|
||||
windows_thread_info *th;
|
||||
|
||||
for (th = &thread_head; (th = th->next) != NULL;)
|
||||
for (windows_thread_info *th : thread_list)
|
||||
if (th->id == id)
|
||||
{
|
||||
if (!th->suspended && get_context)
|
||||
@ -499,8 +496,7 @@ windows_add_thread (ptid_t ptid, HANDLE h, void *tlb, bool main_thread_p)
|
||||
if (wow64_process)
|
||||
th->thread_local_base += 0x2000;
|
||||
#endif
|
||||
th->next = thread_head.next;
|
||||
thread_head.next = th;
|
||||
thread_list.push_back (th);
|
||||
|
||||
/* Add this new thread to the list of threads.
|
||||
|
||||
@ -554,17 +550,13 @@ windows_add_thread (ptid_t ptid, HANDLE h, void *tlb, bool main_thread_p)
|
||||
static void
|
||||
windows_init_thread_list (void)
|
||||
{
|
||||
windows_thread_info *th = &thread_head;
|
||||
|
||||
DEBUG_EVENTS (("gdb: windows_init_thread_list\n"));
|
||||
init_thread_list ();
|
||||
while (th->next != NULL)
|
||||
{
|
||||
windows_thread_info *here = th->next;
|
||||
th->next = here->next;
|
||||
xfree (here);
|
||||
}
|
||||
thread_head.next = NULL;
|
||||
|
||||
for (windows_thread_info *here : thread_list)
|
||||
xfree (here);
|
||||
|
||||
thread_list.clear ();
|
||||
}
|
||||
|
||||
/* Delete a thread from the list of threads.
|
||||
@ -577,7 +569,6 @@ windows_init_thread_list (void)
|
||||
static void
|
||||
windows_delete_thread (ptid_t ptid, DWORD exit_code, bool main_thread_p)
|
||||
{
|
||||
windows_thread_info *th;
|
||||
DWORD id;
|
||||
|
||||
gdb_assert (ptid.tid () != 0);
|
||||
@ -600,17 +591,17 @@ windows_delete_thread (ptid_t ptid, DWORD exit_code, bool main_thread_p)
|
||||
|
||||
delete_thread (find_thread_ptid (&the_windows_nat_target, ptid));
|
||||
|
||||
for (th = &thread_head;
|
||||
th->next != NULL && th->next->id != id;
|
||||
th = th->next)
|
||||
continue;
|
||||
auto iter = std::find_if (thread_list.begin (), thread_list.end (),
|
||||
[=] (windows_thread_info *th)
|
||||
{
|
||||
return th->id == id;
|
||||
});
|
||||
|
||||
if (th->next != NULL)
|
||||
if (iter != thread_list.end ())
|
||||
{
|
||||
windows_thread_info *here = th->next;
|
||||
th->next = here->next;
|
||||
xfree (here->name);
|
||||
xfree (here);
|
||||
xfree ((*iter)->name);
|
||||
xfree (*iter);
|
||||
thread_list.erase (iter);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1477,7 +1468,6 @@ handle_exception (struct target_waitstatus *ourstatus)
|
||||
static BOOL
|
||||
windows_continue (DWORD continue_status, int id, int killed)
|
||||
{
|
||||
windows_thread_info *th;
|
||||
BOOL res;
|
||||
|
||||
DEBUG_EVENTS (("ContinueDebugEvent (cpid=%d, ctid=0x%x, %s);\n",
|
||||
@ -1486,7 +1476,7 @@ windows_continue (DWORD continue_status, int id, int killed)
|
||||
continue_status == DBG_CONTINUE ?
|
||||
"DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
|
||||
|
||||
for (th = &thread_head; (th = th->next) != NULL;)
|
||||
for (windows_thread_info *th : thread_list)
|
||||
if ((id == -1 || id == (int) th->id)
|
||||
&& th->suspended)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user