Implement task switching on solaris targets.
authorJoel Brobecker <brobecker@gnat.com>
Fri, 7 May 2010 15:24:16 +0000 (15:24 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Fri, 7 May 2010 15:24:16 +0000 (15:24 +0000)
        * sol-thread.c (thread_db_find_thread_from_tid)
        (sol_get_ada_task_ptid): New functions.
        (init_sol_thread_ops): Set sol_thread_ops.to_get_ada_task_ptid.

gdb/ChangeLog
gdb/sol-thread.c

index d5a9fb61d3ed0547d517c88640de1af7568f5c5c..8b70893c1bdd0fd71fda6f82b871dbc23d888c61 100644 (file)
        * fbsd-nat.c (fbsd_make_corefile_notes): Add cast to NULL used as
        sentinel.
 
+2010-05-07  Joel Brobecker  <brobecker@adacore.com>
+
+       Implement task switching on solaris targets.
+       * sol-thread.c (thread_db_find_thread_from_tid)
+       (sol_get_ada_task_ptid): New functions.
+       (init_sol_thread_ops): Set sol_thread_ops.to_get_ada_task_ptid.
+
 2010-05-07  Pedro Alves  <pedro@codesourcery.com>
 
        * remote.c (remote_query_supported_append): Use reconcat.
index 3e7183f8ce41dc3891ec44992e3640235d44183f..d18ae44ca3ce4e8dfc63e808e5699eab154e9d3d 100644 (file)
@@ -1288,6 +1288,40 @@ info_solthreads (char *args, int from_tty)
                    TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);
 }
 
+/* Callback routine used to find a thread based on the TID part of
+   its PTID.  */
+
+static int
+thread_db_find_thread_from_tid (struct thread_info *thread, void *data)
+{
+  long *tid = (long *) data;
+
+  if (ptid_get_tid (thread->ptid) == *tid)
+    return 1;
+
+  return 0;
+}
+
+static ptid_t
+sol_get_ada_task_ptid (long lwp, long thread)
+{
+  struct thread_info *thread_info =
+    iterate_over_threads (thread_db_find_thread_from_tid, &thread);
+
+  if (thread_info == NULL)
+    {
+      /* The list of threads is probably not up to date.  Find any
+         thread that is missing from the list, and try again.  */
+      sol_find_new_threads (&current_target);
+      thread_info = iterate_over_threads (thread_db_find_thread_from_tid,
+                                          &thread);
+    }
+
+  gdb_assert (thread_info != NULL);
+
+  return (thread_info->ptid);
+}
+
 static void
 init_sol_thread_ops (void)
 {
@@ -1305,6 +1339,7 @@ init_sol_thread_ops (void)
   sol_thread_ops.to_pid_to_str = solaris_pid_to_str;
   sol_thread_ops.to_find_new_threads = sol_find_new_threads;
   sol_thread_ops.to_stratum = thread_stratum;
+  sol_thread_ops.to_get_ada_task_ptid = sol_get_ada_task_ptid;
   sol_thread_ops.to_magic = OPS_MAGIC;
 }