* aix-thread.c (ptrace_check): Eliminate goto.

(sync_threadlists): Eliminate gotos.  Also, fix array overrun
	problem.
This commit is contained in:
Kevin Buettner
2002-07-15 20:06:12 +00:00
parent 8e2c28d425
commit 42cc437fb0
2 changed files with 50 additions and 32 deletions

View File

@ -1,3 +1,9 @@
2002-07-15 Kevin Buettner <kevinb@redhat.com>
* aix-thread.c (ptrace_check): Eliminate goto.
(sync_threadlists): Eliminate gotos. Also, fix array overrun
problem.
2002-07-15 Kevin Buettner <kevinb@redhat.com> 2002-07-15 Kevin Buettner <kevinb@redhat.com>
* aix-thread.c (gdbcmd.h): Include. * aix-thread.c (gdbcmd.h): Include.

View File

@ -249,17 +249,17 @@ ptrace_check (int req, int id, int ret)
case PTT_READ_FPRS: case PTT_READ_FPRS:
case PTT_READ_SPRS: case PTT_READ_SPRS:
if (ret == -1 && errno == EPERM) if (ret == -1 && errno == EPERM)
goto strange; {
if (debug_aix_thread)
fprintf_unfiltered (gdb_stdlog, "ptrace (%d, %d) = %d (errno = %d)",
req, id, ret, errno);
return ret == -1 ? 0 : 1;
}
break; break;
} }
error ("aix-thread: ptrace (%d, %d) returned %d (errno = %d %s)", error ("aix-thread: ptrace (%d, %d) returned %d (errno = %d %s)",
req, id, ret, errno, strerror (errno)); req, id, ret, errno, strerror (errno));
return 0; /* not reached. */
strange:
if (debug_aix_thread)
fprintf_unfiltered (gdb_stdlog, "ptrace (%d, %d) = %d (errno = %d)",
req, id, ret, errno);
return ret == -1 ? 0 : 1;
} }
/* Call ptracex(REQ, ID, ADDR, DATA, BUF). Return success. */ /* Call ptracex(REQ, ID, ADDR, DATA, BUF). Return success. */
@ -643,7 +643,6 @@ sync_threadlists (void)
pthdb_pthread_t pdtid; pthdb_pthread_t pdtid;
pthread_t pthid; pthread_t pthid;
pthdb_tid_t tid; pthdb_tid_t tid;
ptid_t pptid, gptid;
/* Accumulate an array of libpthdebug threads sorted by pthread id. */ /* Accumulate an array of libpthdebug threads sorted by pthread id. */
@ -694,39 +693,52 @@ sync_threadlists (void)
infpid = PIDGET (inferior_ptid); infpid = PIDGET (inferior_ptid);
for (pi = gi = 0; pi < pcount || gi < gcount;) for (pi = gi = 0; pi < pcount || gi < gcount;)
{ {
pptid = BUILD_THREAD (pbuf[pi].pthid, infpid);
gptid = gbuf[gi]->ptid;
pdtid = pbuf[pi].pdtid;
tid = pbuf[pi].tid;
if (pi == pcount) if (pi == pcount)
goto del;
if (gi == gcount)
goto add;
if (ptid_equal (pptid, gptid))
{ {
gbuf[gi]->private->pdtid = pdtid; delete_thread (gbuf[gi]->ptid);
gbuf[gi]->private->tid = tid;
pi++;
gi++; gi++;
} }
else if (ptid_cmp (pptid, gptid) > 0) else if (gi == gcount)
{ {
del: thread = add_thread (BUILD_THREAD (pbuf[pi].pthid, infpid));
delete_thread (gptid); thread->private = xmalloc (sizeof (struct private_thread_info));
gi++; thread->private->pdtid = pbuf[pi].pdtid;
thread->private->tid = pbuf[pi].tid;
pi++;
} }
else else
{ {
add: ptid_t pptid, gptid;
thread = add_thread (pptid); int cmp_result;
thread->private = xmalloc (sizeof (struct private_thread_info));
thread->private->pdtid = pdtid;
thread->private->tid = tid;
pi++;
}
pptid = BUILD_THREAD (pbuf[pi].pthid, infpid);
gptid = gbuf[gi]->ptid;
pdtid = pbuf[pi].pdtid;
tid = pbuf[pi].tid;
cmp_result = ptid_cmp (pptid, gptid);
if (cmp_result == 0)
{
gbuf[gi]->private->pdtid = pdtid;
gbuf[gi]->private->tid = tid;
pi++;
gi++;
}
else if (cmp_result > 0)
{
delete_thread (gptid);
gi++;
}
else
{
thread = add_thread (pptid);
thread->private = xmalloc (sizeof (struct private_thread_info));
thread->private->pdtid = pdtid;
thread->private->tid = tid;
pi++;
}
}
} }
xfree (pbuf); xfree (pbuf);