Add backlink from lwp_info to thread_info.
authorDoug Evans <dje@google.com>
Thu, 20 Feb 2014 00:38:44 +0000 (16:38 -0800)
committerDoug Evans <dje@google.com>
Thu, 20 Feb 2014 00:38:44 +0000 (16:38 -0800)
* 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".

This speeds up gdbserver attach in non-stop mode because now get_lwp_thread
doesn't do a linear search for the corresponding thread_info object.

gdb/gdbserver/ChangeLog
gdb/gdbserver/gdbthread.h
gdb/gdbserver/inferiors.c
gdb/gdbserver/linux-low.c
gdb/gdbserver/linux-low.h

index 16717727196557739214d4e6752a2d674397d4eb..41052247610f08075078685d43d519e3d9becf26 100644 (file)
@@ -1,3 +1,13 @@
+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".
+
 2014-02-19  Doug Evans  <dje@google.com>
 
        * linux-low.c (add_lwp): Change result to struct lwp_info *.
index 0eac5a47d255223d4c16a12070101b6fdfaa4b9e..9785d67a52ca86d75e3da1c8be28778f59a7114b 100644 (file)
@@ -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);
 
index fd7c9221a258858d92da2fdf747675d4fb574c38..f83ee22b61358cd44d6d97f5566f69688955c6d0 100644 (file)
@@ -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
index 910d96d34fa04b1d34223b781f84537a84e90939..d4c113a2266e8ec7bc3eec849e9e98f4415b3664 100644 (file)
@@ -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.  */
index 3b7ec21d7cedd1121240ae16dfd8cae2fe3711f5..b3e75dbd7ce14000c3ddcb26df44c5c1be7c8594 100644 (file)
@@ -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