This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[commit] Add backlink from lwp_info to thread_info.


Doug Evans writes:
 > Hi.
 > This is the main patch.
 > The concept is very simple: remove all_lwps.
 > I think it's the right thing to do, I can't think of a good reason
 > to maintain two separate lists of threads, each containing a subset
 > of the data needed.
 > 
 > Alas implementing this involves a lot of work.

We wouldn't in this situation if there weren't two separate but related
lists in the first place.

Committed.

2014-02-19  Doug Evans  <dje@google.com>

	* gdbthread.h (add_thread): Change result type to struct thread_info *.
	* inferiors.c (add_thread): Change result type to struct thread_info *.
	All callers updated.
	(add_lwp): Call add_thread here instead of in callers.
	All callers updated.
	* linux-low.h (get_lwp_thread): Rewrite.
	(struct lwp_info): New member "thread".

diff --git a/gdb/gdbserver/gdbthread.h b/gdb/gdbserver/gdbthread.h
index 0eac5a4..9785d67 100644
--- a/gdb/gdbserver/gdbthread.h
+++ b/gdb/gdbserver/gdbthread.h
@@ -74,7 +74,7 @@ struct thread_info
 extern struct inferior_list all_threads;
 
 void remove_thread (struct thread_info *thread);
-void add_thread (ptid_t ptid, void *target_data);
+struct thread_info *add_thread (ptid_t ptid, void *target_data);
 
 struct thread_info *get_first_thread (void);
 
diff --git a/gdb/gdbserver/inferiors.c b/gdb/gdbserver/inferiors.c
index fd7c922..f83ee22 100644
--- a/gdb/gdbserver/inferiors.c
+++ b/gdb/gdbserver/inferiors.c
@@ -104,7 +104,7 @@ remove_inferior (struct inferior_list *list,
     list->tail = *cur;
 }
 
-void
+struct thread_info *
 add_thread (ptid_t thread_id, void *target_data)
 {
   struct thread_info *new_thread = xmalloc (sizeof (*new_thread));
@@ -121,6 +121,8 @@ add_thread (ptid_t thread_id, void *target_data)
     current_inferior = new_thread;
 
   new_thread->target_data = target_data;
+
+  return new_thread;
 }
 
 ptid_t
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 910d96d..d4c113a 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -409,7 +409,6 @@ handle_extended_wait (struct lwp_info *event_child, int wstat)
 
       ptid = ptid_build (pid_of (event_child), new_pid, 0);
       new_lwp = add_lwp (ptid);
-      add_thread (ptid, new_lwp);
 
       /* Either we're going to immediately resume the new thread
 	 or leave it stopped.  linux_resume_one_lwp is a nop if it
@@ -539,6 +538,7 @@ add_lwp (ptid_t ptid)
     lwp->arch_private = the_low_target.new_thread ();
 
   add_inferior_to_list (&all_lwps, &lwp->entry);
+  lwp->thread = add_thread (ptid, lwp);
 
   return lwp;
 }
@@ -632,7 +632,6 @@ linux_create_inferior (char *program, char **allargs)
 
   ptid = ptid_build (pid, pid, 0);
   new_lwp = add_lwp (ptid);
-  add_thread (ptid, new_lwp);
   new_lwp->must_set_ptrace_flags = 1;
 
   return pid;
@@ -683,7 +682,6 @@ linux_attach_lwp_1 (unsigned long lwpid, int initial)
     }
 
   new_lwp = add_lwp (ptid);
-  add_thread (ptid, new_lwp);
 
   /* We need to wait for SIGSTOP before being able to make the next
      ptrace call on this LWP.  */
diff --git a/gdb/gdbserver/linux-low.h b/gdb/gdbserver/linux-low.h
index 3b7ec21..b3e75db 100644
--- a/gdb/gdbserver/linux-low.h
+++ b/gdb/gdbserver/linux-low.h
@@ -229,14 +229,17 @@ extern struct linux_target_ops the_low_target;
 
 #define get_lwp(inf) ((struct lwp_info *)(inf))
 #define get_thread_lwp(thr) (get_lwp (inferior_target_data (thr)))
-#define get_lwp_thread(proc) ((struct thread_info *)			\
-			      find_inferior_id (&all_threads,		\
-						get_lwp (proc)->entry.id))
+#define get_lwp_thread(lwp) ((lwp)->thread)
 
 struct lwp_info
 {
   struct inferior_list_entry entry;
 
+  /* Backlink to the thread_info object.
+     It is the "main" representation of the thread, we just contain
+     linux-specific subordinate data.  */
+  struct thread_info *thread;
+
   /* If this flag is set, the next SIGSTOP will be ignored (the
      process will be immediately resumed).  This means that either we
      sent the SIGSTOP to it ourselves and got some other pending event


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]