[review] Remove the "next" field from windows_thread_info

Message ID gerrit.1572371871000.Ib93c54e529a5d82515883f44a478eeb0ff0dbae9@gnutoolchain-gerrit.osci.io
State New, archived
Headers

Commit Message

Simon Marchi (Code Review) Oct. 29, 2019, 5:57 p.m. UTC
  Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/404
......................................................................

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 is structure with gdbserver, which manages threads
differently.

gdb/ChangeLog
2019-10-29  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.

Change-Id: Ib93c54e529a5d82515883f44a478eeb0ff0dbae9
---
M gdb/ChangeLog
M gdb/windows-nat.c
2 files changed, 29 insertions(+), 31 deletions(-)
  

Comments

Simon Marchi (Code Review) Oct. 31, 2019, 3:18 a.m. UTC | #1
Luis Machado has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/404
......................................................................


Patch Set 1: Code-Review+1

Looks sane to me.
  
Simon Marchi (Code Review) Oct. 31, 2019, 2:20 p.m. UTC | #2
Simon Marchi has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/404
......................................................................


Patch Set 1: Code-Review+1

(1 comment)

https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/404/1//COMMIT_MSG 
Commit Message:

https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/404/1//COMMIT_MSG@11 
PS1, Line 11: 
 6 | 
 7 | Remove the "next" field from windows_thread_info
 8 | 
 9 | This changes windows_thread_info to remove the "next" field, replacing
10 | the linked list of threads with a vector.  This is a prerequisite to
11 > sharing is structure with gdbserver, which manages threads
12 | differently.
13 | 
14 | gdb/ChangeLog
15 | 2019-10-29  Tom Tromey  <tromey@adacore.com>
16 | 

"this"?
  
Simon Marchi (Code Review) Nov. 12, 2019, 7:42 p.m. UTC | #3
Tom Tromey has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/404
......................................................................


Patch Set 1:

(1 comment)

| --- /dev/null
| +++ /COMMIT_MSG
| @@ -1,0 +2,19 @@ Parent:     12c3e917 (Automatic date update in version.in)
| +Author:     Tom Tromey <tromey@adacore.com>
| +AuthorDate: 2019-10-07 13:45:15 -0600
| +Commit:     Tom Tromey <tromey@adacore.com>
| +CommitDate: 2019-10-29 10:08:34 -0600
| +
| +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 is structure with gdbserver, which manages threads

PS1, Line 11:

> "this"?

Yep, thanks.  I've fixed this.  I'm going to push this
and the other patches from this series that have been
reviewed.

| +differently.
| +
| +gdb/ChangeLog
| +2019-10-29  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)
  
Simon Marchi (Code Review) Nov. 12, 2019, 7:58 p.m. UTC | #4
Tom Tromey has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/404
......................................................................


Patch Set 1:

(1 comment)

| --- /dev/null
| +++ /COMMIT_MSG
| @@ -1,0 +2,19 @@ Parent:     12c3e917 (Automatic date update in version.in)
| +Author:     Tom Tromey <tromey@adacore.com>
| +AuthorDate: 2019-10-07 13:45:15 -0600
| +Commit:     Tom Tromey <tromey@adacore.com>
| +CommitDate: 2019-10-29 10:08:34 -0600
| +
| +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 is structure with gdbserver, which manages threads

PS1, Line 11:

> > "this"?
> 
> Yep, thanks.  I've fixed this.  I'm going to push this
> and the other patches from this series that have been
> reviewed.

Well ... I will after we agree about the symbol assert patch,
so I don't check in patches that can't be built.

| +differently.
| +
| +gdb/ChangeLog
| +2019-10-29  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)
  
Simon Marchi (Code Review) Nov. 29, 2019, 5:47 p.m. UTC | #5
Pedro Alves has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/404
......................................................................


Patch Set 2: Code-Review+2
  

Patch

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index edf7c34..d255440 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@ 
+2019-10-29  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.
+
 2019-10-26  Tom de Vries  <tdevries@suse.de>
 
 	* aarch64-linux-tdep.c: Fix typos in comments.
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 5901f63..3bd8c0f 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -43,6 +43,7 @@ 
 #include <cygwin/version.h>
 #endif
 #include <algorithm>
+#include <vector>
 
 #include "filenames.h"
 #include "symfile.h"
@@ -214,9 +215,8 @@ 
 
 /* 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;
@@ -224,10 +224,9 @@ 
     int suspended;
     int reload_context;
     CONTEXT context;
-  }
-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.  */
 
@@ -384,9 +383,7 @@ 
 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)
@@ -448,8 +445,7 @@ 
   th->id = id;
   th->h = h;
   th->thread_local_base = (CORE_ADDR) (uintptr_t) tlb;
-  th->next = thread_head.next;
-  thread_head.next = th;
+  thread_list.push_back (th);
 
   /* Add this new thread to the list of threads.
 
@@ -484,17 +480,13 @@ 
 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.
@@ -507,7 +499,6 @@ 
 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);
@@ -530,17 +521,17 @@ 
 
   delete_thread (find_thread_ptid (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);
     }
 }
 
@@ -1319,7 +1310,6 @@ 
 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",
@@ -1328,7 +1318,7 @@ 
 		  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)
       {