For terminated threads return empty structure.
authordrepper <drepper>
Tue, 2 Nov 1999 23:40:25 +0000 (23:40 +0000)
committerdrepper <drepper>
Tue, 2 Nov 1999 23:40:25 +0000 (23:40 +0000)
linuxthreads_db/td_thr_getfpregs.c
linuxthreads_db/td_thr_getgregs.c
linuxthreads_db/td_thr_setfpregs.c
linuxthreads_db/td_thr_setgregs.c

index 33bd95e..e6635d2 100644 (file)
@@ -28,12 +28,16 @@ td_thr_getfpregs (const td_thrhandle_t *th, prfpregset_t *regset)
 
   LOG (__FUNCTION__);
 
-  /* We have to get the PID for this thread.  */
+  /* We have to get the state and the PID for this thread.  */
   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
                 sizeof (struct _pthread_descr_struct)) != PS_OK)
     return TD_ERR;
 
-  if (ps_lgetfpregs (th->th_ta_p->ph, pds.p_pid, regset) != PS_OK)
+  /* If the thread already terminated we return all zeroes.  */
+  if (pds.p_terminated)
+    memset (regset, '\0', sizeof (*regset));
+  /* Otherwise get the register content through the callback.  */
+  else if (ps_lgetfpregs (th->th_ta_p->ph, pds.p_pid, regset) != PS_OK)
     return TD_ERR;
 
   return TD_OK;
index e8a87b1..549c7d8 100644 (file)
@@ -28,12 +28,16 @@ td_thr_getgregs (const td_thrhandle_t *th, prgregset_t gregs)
 
   LOG (__FUNCTION__);
 
-  /* We have to get the PID for this thread.  */
+  /* We have to get the state and the PID for this thread.  */
   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
                 sizeof (struct _pthread_descr_struct)) != PS_OK)
     return TD_ERR;
 
-  if (ps_lgetregs (th->th_ta_p->ph, pds.p_pid, gregs) != PS_OK)
+  /* If the thread already terminated we return all zeroes.  */
+  if (pds.p_terminated)
+    memset (gregs, '\0', sizeof (gregs));
+  /* Otherwise get the register content through the callback.  */
+  else if (ps_lgetregs (th->th_ta_p->ph, pds.p_pid, gregs) != PS_OK)
     return TD_ERR;
 
   return TD_OK;
index a18e1ed..0c426b3 100644 (file)
@@ -28,12 +28,14 @@ td_thr_setfpregs (const td_thrhandle_t *th, const prfpregset_t *fpregs)
 
   LOG (__FUNCTION__);
 
-  /* We have to get the PID for this thread.  */
+  /* We have to get the state and the PID for this thread.  */
   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
                  sizeof (struct _pthread_descr_struct)) != PS_OK)
     return TD_ERR;
 
-  if (ps_lsetfpregs (th->th_ta_p->ph, pds.p_pid, fpregs) != PS_OK)
+  /* Only set the registers if the thread hasn't yet terminated.  */
+  if (pds.p_terminated == 0
+      && ps_lsetfpregs (th->th_ta_p->ph, pds.p_pid, fpregs) != PS_OK)
     return TD_ERR;
 
   return TD_OK;
index 1de2d3c..72f95b1 100644 (file)
@@ -28,12 +28,14 @@ td_thr_setgregs (const td_thrhandle_t *th, prgregset_t gregs)
 
   LOG (__FUNCTION__);
 
-  /* We have to get the PID for this thread.  */
+  /* We have to get the state and the PID for this thread.  */
   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
                  sizeof (struct _pthread_descr_struct)) != PS_OK)
     return TD_ERR;
 
-  if (ps_lsetregs (th->th_ta_p->ph, pds.p_pid, gregs) != PS_OK)
+  /* Only set the registers if the thread hasn't yet terminated.  */
+  if (pds.p_terminated == 0
+      && ps_lsetregs (th->th_ta_p->ph, pds.p_pid, gregs) != PS_OK)
     return TD_ERR;
 
   return TD_OK;