PERFORCE change 57663 for review
Marcel Moolenaar
marcel at FreeBSD.org
Sun Jul 18 17:17:40 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=57663
Change 57663 by marcel at marcel_nfs on 2004/07/19 00:17:28
Resolve merge conflicts by making these files identical to
CVS.
Affected files ...
.. //depot/projects/gdb/lib/libthread_db/arch/i386/libc_r_md.c#3 edit
.. //depot/projects/gdb/lib/libthread_db/libc_r_db.c#5 edit
.. //depot/projects/gdb/lib/libthread_db/libpthread_db.c#3 edit
.. //depot/projects/gdb/lib/libthread_db/libthr_db.c#4 edit
.. //depot/projects/gdb/lib/libthread_db/thread_db.c#3 edit
.. //depot/projects/gdb/lib/libthread_db/thread_db_int.h#5 edit
Differences ...
==== //depot/projects/gdb/lib/libthread_db/arch/i386/libc_r_md.c#3 (text+ko) ====
@@ -25,13 +25,13 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: src/lib/libthread_db/arch/i386/libc_r_md.c,v 1.1 2004/07/18 04:17:14 marcel Exp $");
#include <sys/procfs.h>
#include <machine/setjmp.h>
void
-libc_r_md_getgregs(jmp_buf jb, prgregset_t *r)
+libc_r_md_getgregs(jmp_buf jb, prgregset_t r)
{
r->r_eip = jb->_jb[0];
r->r_ebx = jb->_jb[1];
==== //depot/projects/gdb/lib/libthread_db/libc_r_db.c#5 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: src/lib/libthread_db/libc_r_db.c,v 1.1 2004/07/18 04:17:13 marcel Exp $");
#include <machine/setjmp.h>
#include <proc_service.h>
@@ -36,7 +36,7 @@
#include "thread_db_int.h"
void libc_r_md_getfpregs(jmp_buf jb, prfpregset_t *);
-void libc_r_md_getgregs(jmp_buf jb, prgregset_t *);
+void libc_r_md_getgregs(jmp_buf jb, prgregset_t);
struct td_thragent {
TD_THRAGENT_FIELDS;
@@ -215,7 +215,7 @@
ps_err_e err;
ta = th->th_ta;
- ti->ti_ta = ta;
+ ti->ti_ta_p = ta;
err = ps_pread(ta->ta_ph, ta->ta_thread_run, ¤t,
sizeof(psaddr_t));
if (err != PS_OK)
@@ -254,7 +254,7 @@
}
static td_err_e
-libc_r_db_thr_getgregs(const td_thrhandle_t *th, prgregset_t *r)
+libc_r_db_thr_getgregs(const td_thrhandle_t *th, prgregset_t r)
{
jmp_buf jb;
const td_thragent_t *ta;
@@ -291,7 +291,7 @@
}
static td_err_e
-libc_r_db_thr_setgregs(const td_thrhandle_t *th, const prgregset_t *r)
+libc_r_db_thr_setgregs(const td_thrhandle_t *th, const prgregset_t r)
{
return (TD_ERR);
}
==== //depot/projects/gdb/lib/libthread_db/libpthread_db.c#3 (text+ko) ====
@@ -25,41 +25,25 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: src/lib/libthread_db/libpthread_db.c,v 1.1 2004/07/18 04:17:13 marcel Exp $");
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
-#include <thr_private.h>
#include <sys/types.h>
#include <sys/kse.h>
#include <sys/ptrace.h>
#include <proc_service.h>
#include <thread_db.h>
-#include "pthread_db.h"
+#include "libpthread.h"
+#include "libpthread_db.h"
-struct pt_map {
- enum {
- PT_NONE,
- PT_USER,
- PT_LWP
- } type;
-
- union {
- lwpid_t lwp;
- psaddr_t thr;
- };
-};
-
#define P2T(c) ps2td(c)
-static td_err_e pt_ta_activated(pt_thragent_t *ta, int *a);
-static long pt_map_thread(const pt_thragent_t *ta, psaddr_t pt);
-static long pt_map_lwp(const pt_thragent_t *ta, lwpid_t lwp);
-static void pt_unmap_lwp(const pt_thragent_t *ta, lwpid_t lwp);
+static void pt_unmap_lwp(const td_thragent_t *ta, lwpid_t lwp);
static int pt_validate(const td_thrhandle_t *th);
static int
@@ -85,6 +69,48 @@
}
}
+static long
+pt_map_thread(const td_thragent_t *const_ta, psaddr_t pt, int type)
+{
+ td_thragent_t *ta = __DECONST(td_thragent_t *, const_ta);
+ struct pt_map *new;
+ int i, first = -1;
+
+ /* leave zero out */
+ for (i = 1; i < ta->map_len; ++i) {
+ if (ta->map[i].type == PT_NONE) {
+ if (first == -1)
+ first = i;
+ } else if (ta->map[i].type == type && ta->map[i].thr == pt) {
+ return (i);
+ }
+ }
+
+ if (first == -1) {
+ if (ta->map_len == 0) {
+ ta->map = calloc(20, sizeof(struct pt_map));
+ if (ta->map == NULL)
+ return (-1);
+ ta->map_len = 20;
+ first = 1;
+ } else {
+ new = realloc(ta->map,
+ sizeof(struct pt_map) * ta->map_len * 2);
+ if (new == NULL)
+ return (-1);
+ memset(new + ta->map_len, '\0', sizeof(struct pt_map) *
+ ta->map_len);
+ first = ta->map_len;
+ ta->map = new;
+ ta->map_len *= 2;
+ }
+ }
+
+ ta->map[first].type = type;
+ ta->map[first].thr = pt;
+ return (first);
+}
+
static td_err_e
pt_init(void)
{
@@ -93,7 +119,7 @@
}
static td_err_e
-pt_ta_new(struct ps_prochandle *ph, pt_thragent_t **pta)
+pt_ta_new(struct ps_prochandle *ph, td_thragent_t **pta)
{
#define LOOKUP_SYM(proc, sym, addr) \
ret = ps_pglobal_lookup(proc, NULL, sym, addr); \
@@ -103,13 +129,13 @@
goto error; \
}
- pt_thragent_t *ta;
+ td_thragent_t *ta;
int dbg;
int ret;
TDBG_FUNC();
- ta = malloc(sizeof(pt_thragent_t));
+ ta = malloc(sizeof(td_thragent_t));
if (ta == NULL)
return (TD_MALLOC);
@@ -139,7 +165,7 @@
}
static td_err_e
-pt_ta_delete(pt_thragent_t *ta)
+pt_ta_delete(td_thragent_t *ta)
{
int dbg;
@@ -158,28 +184,7 @@
}
static td_err_e
-pt_ta_get_nthreads (const pt_thragent_t *ta, int *np)
-{
- int ret;
-
- TDBG_FUNC();
-
- ret = ps_pread(ta->ph, ta->thread_active_threads_addr, np,
- sizeof(int));
- return (P2T(ret));
-}
-
-static td_err_e
-pt_ta_get_ph(const pt_thragent_t *ta, struct ps_prochandle **ph)
-{
- TDBG_FUNC();
-
- *ph = ta->ph;
- return (TD_OK);
-}
-
-static td_err_e
-pt_ta_map_id2thr(const pt_thragent_t *ta, thread_t id, td_thrhandle_t *th)
+pt_ta_map_id2thr(const td_thragent_t *ta, thread_t id, td_thrhandle_t *th)
{
prgregset_t gregs;
TAILQ_HEAD(, pthread) thread_list;
@@ -256,13 +261,13 @@
return (TD_NOTHR);
}
}
- th->th_ta_p = (td_thragent_t *)ta;
- th->th_unique = id;
+ th->th_ta = ta;
+ th->th_tid = id;
return (TD_OK);
}
static td_err_e
-pt_ta_map_lwp2thr(const pt_thragent_t *ta, lwpid_t lwp, td_thrhandle_t *th)
+pt_ta_map_lwp2thr(const td_thragent_t *ta, lwpid_t lwp, td_thrhandle_t *th)
{
TAILQ_HEAD(, pthread) thread_list;
psaddr_t pt, ptr;
@@ -286,9 +291,9 @@
if (ret != 0)
return (P2T(ret));
if (tmp_lwp == lwp) {
- th->th_ta_p = (td_thragent_t *)ta;
- th->th_unique = pt_map_thread(ta, pt);
- if (th->th_unique == -1)
+ th->th_ta = ta;
+ th->th_tid = pt_map_thread(ta, pt, PT_USER);
+ if (th->th_tid == -1)
return (TD_MALLOC);
pt_unmap_lwp(ta, lwp);
return (TD_OK);
@@ -306,7 +311,7 @@
}
static td_err_e
-pt_ta_thr_iter(const pt_thragent_t *ta,
+pt_ta_thr_iter(const td_thragent_t *ta,
td_thr_iter_f *callback, void *cbdata_p,
td_thr_state_e state, int ti_pri,
sigset_t *ti_sigmask_p,
@@ -315,40 +320,43 @@
TAILQ_HEAD(, pthread) thread_list;
td_thrhandle_t th;
psaddr_t pt;
- int ret, activated;
-
+ ps_err_e pserr;
+ int activated;
+
TDBG_FUNC();
- ret = pt_ta_activated((pt_thragent_t *)ta, &activated);
- if (ret != 0)
- return (P2T(ret));
+ pserr = ps_pread(ta->ph, ta->thread_activated_addr, &activated,
+ sizeof(int));
+ if (pserr != PS_OK)
+ return (P2T(pserr));
if (!activated)
- return (0);
- ret = ps_pread(ta->ph, ta->thread_list_addr, &thread_list,
- sizeof(thread_list));
- if (ret != 0)
- return (P2T(ret));
+ return (TD_OK);
+
+ pserr = ps_pread(ta->ph, ta->thread_list_addr, &thread_list,
+ sizeof(thread_list));
+ if (pserr != 0)
+ return (P2T(pserr));
pt = (psaddr_t)thread_list.tqh_first;
while (pt != 0) {
- th.th_ta_p = (td_thragent_t *)ta;
- th.th_unique = pt_map_thread(ta, pt);
+ th.th_ta = ta;
+ th.th_tid = pt_map_thread(ta, pt, PT_USER);
/* should we unmap lwp here ? */
- if (th.th_unique == -1)
+ if (th.th_tid == -1)
return (TD_MALLOC);
if ((*callback)(&th, cbdata_p))
return (TD_DBERR);
/* get next thread */
- ret = ps_pread(ta->ph,
- pt + offsetof(struct pthread, tle.tqe_next),
- &pt, sizeof(pt));
- if (ret != 0)
- return (P2T(ret));
+ pserr = ps_pread(ta->ph,
+ pt + offsetof(struct pthread, tle.tqe_next), &pt,
+ sizeof(pt));
+ if (pserr != PS_OK)
+ return (P2T(pserr));
}
return (TD_OK);
}
static td_err_e
-pt_ta_tsd_iter(const pt_thragent_t *ta, td_key_iter_f *ki, void *arg)
+pt_ta_tsd_iter(const td_thragent_t *ta, td_key_iter_f *ki, void *arg)
{
struct pthread_key keytable[PTHREAD_KEYS_MAX];
int i, ret;
@@ -371,59 +379,45 @@
}
static td_err_e
-pt_ta_event_addr(const pt_thragent_t *ta, td_event_e event, td_notify_t *ptr)
+pt_ta_event_addr(const td_thragent_t *ta, td_event_e event, td_notify_t *ptr)
{
TDBG_FUNC();
return (TD_NOEVENT);
}
static td_err_e
-pt_ta_set_event(const pt_thragent_t *ta, td_thr_events_t *events)
+pt_ta_set_event(const td_thragent_t *ta, td_thr_events_t *events)
{
TDBG_FUNC();
return (TD_ERR);
}
static td_err_e
-pt_ta_clear_event(const pt_thragent_t *ta, td_thr_events_t *events)
+pt_ta_clear_event(const td_thragent_t *ta, td_thr_events_t *events)
{
TDBG_FUNC();
return (TD_ERR);
}
static td_err_e
-pt_ta_event_getmsg(const pt_thragent_t *ta, td_event_msg_t *msg)
+pt_ta_event_getmsg(const td_thragent_t *ta, td_event_msg_t *msg)
{
TDBG_FUNC();
return (TD_NOMSG);
}
static td_err_e
-pt_ta_setconcurrency(const pt_thragent_t *ta, int level)
+pt_thr_dbresume(const td_thrhandle_t *th)
{
TDBG_FUNC();
- return (TD_OK);
+ return (TD_ERR);
}
static td_err_e
-pt_ta_enable_stats(const pt_thragent_t *ta, int enable)
+pt_thr_dbsuspend(const td_thrhandle_t *th)
{
TDBG_FUNC();
- return (TD_OK);
-}
-
-static td_err_e
-pt_ta_reset_stats(const pt_thragent_t *ta)
-{
- TDBG_FUNC();
- return (TD_OK);
-}
-
-static td_err_e
-pt_ta_get_stats(const pt_thragent_t *ta, td_ta_stats_t *statsp)
-{
- TDBG_FUNC();
- return (TD_OK);
+ return (TD_ERR);
}
static td_err_e
@@ -434,7 +428,7 @@
TDBG_FUNC();
- ret = pt_ta_map_id2thr((pt_thragent_t *)th->th_ta_p, th->th_unique,
+ ret = pt_ta_map_id2thr(th->th_ta, th->th_tid,
&temp);
return (P2T(ret));
}
@@ -442,8 +436,8 @@
static td_err_e
pt_thr_get_info(const td_thrhandle_t *th, td_thrinfo_t *info)
{
+ const td_thragent_t *ta = th->th_ta;
struct pthread pt;
- pt_thragent_t *ta = (pt_thragent_t *)th->th_ta_p;
int ret;
TDBG_FUNC();
@@ -453,16 +447,16 @@
return (ret);
memset(info, 0, sizeof(*info));
- if (ta->map[th->th_unique].type == PT_LWP) {
+ if (ta->map[th->th_tid].type == PT_LWP) {
info->ti_type = TD_THR_SYSTEM;
- info->ti_lid = ta->map[th->th_unique].lwp;
- info->ti_tid = th->th_unique;
+ info->ti_lid = ta->map[th->th_tid].lwp;
+ info->ti_tid = th->th_tid;
info->ti_state = TD_THR_RUN;
info->ti_type = TD_THR_SYSTEM;
return (TD_OK);
}
- ret = ps_pread(ta->ph, (psaddr_t)(ta->map[th->th_unique].thr),
+ ret = ps_pread(ta->ph, (psaddr_t)(ta->map[th->th_tid].thr),
&pt, sizeof(pt));
if (ret != 0)
return (P2T(ret));
@@ -474,8 +468,8 @@
if (ret != 0)
return (P2T(ret));
- info->ti_ta_p = th->th_ta_p;
- info->ti_tid = th->th_unique;
+ info->ti_ta_p = th->th_ta;
+ info->ti_tid = th->th_tid;
info->ti_tls = (char *)pt.specific;
info->ti_startfunc = (psaddr_t)pt.start_routine;
info->ti_stkbase = (psaddr_t) pt.attr.stackaddr_attr;
@@ -516,8 +510,8 @@
static td_err_e
pt_thr_getfpregs(const td_thrhandle_t *th, prfpregset_t *fpregs)
{
+ const td_thragent_t *ta = th->th_ta;
struct kse_thr_mailbox tmbx;
- pt_thragent_t *ta = (pt_thragent_t *)th->th_ta_p;
psaddr_t tcb_addr, tmbx_addr, ptr;
lwpid_t lwp;
int ret;
@@ -528,12 +522,12 @@
if (ret)
return (ret);
- if (ta->map[th->th_unique].type == PT_LWP) {
- ret = ps_lgetfpregs(ta->ph, ta->map[th->th_unique].lwp, fpregs);
+ if (ta->map[th->th_tid].type == PT_LWP) {
+ ret = ps_lgetfpregs(ta->ph, ta->map[th->th_tid].lwp, fpregs);
return (P2T(ret));
}
- ret = ps_pread(ta->ph, ta->map[th->th_unique].thr +
+ ret = ps_pread(ta->ph, ta->map[th->th_tid].thr +
offsetof(struct pthread, tcb),
&tcb_addr, sizeof(tcb_addr));
if (ret != 0)
@@ -558,8 +552,8 @@
static td_err_e
pt_thr_getgregs(const td_thrhandle_t *th, prgregset_t gregs)
{
+ const td_thragent_t *ta = th->th_ta;
struct kse_thr_mailbox tmbx;
- pt_thragent_t *ta = (pt_thragent_t *)th->th_ta_p;
psaddr_t tcb_addr, tmbx_addr, ptr;
lwpid_t lwp;
int ret;
@@ -570,13 +564,13 @@
if (ret)
return (ret);
- if (ta->map[th->th_unique].type == PT_LWP) {
+ if (ta->map[th->th_tid].type == PT_LWP) {
ret = ps_lgetregs(ta->ph,
- ta->map[th->th_unique].lwp, gregs);
+ ta->map[th->th_tid].lwp, gregs);
return (P2T(ret));
}
- ret = ps_pread(ta->ph, ta->map[th->th_unique].thr +
+ ret = ps_pread(ta->ph, ta->map[th->th_tid].thr +
offsetof(struct pthread, tcb),
&tcb_addr, sizeof(tcb_addr));
if (ret != 0)
@@ -598,22 +592,10 @@
}
static td_err_e
-pt_thr_getxregs (const td_thrhandle_t *th, void *xregs)
-{
- return (TD_NOXREGS);
-}
-
-static td_err_e
-pt_thr_getxregsize (const td_thrhandle_t *th, int *sizep)
-{
- return (TD_NOXREGS);
-}
-
-static td_err_e
pt_thr_setfpregs(const td_thrhandle_t *th, const prfpregset_t *fpregs)
{
+ const td_thragent_t *ta = th->th_ta;
struct kse_thr_mailbox tmbx;
- pt_thragent_t *ta = (pt_thragent_t *)th->th_ta_p;
psaddr_t tcb_addr, tmbx_addr, ptr;
lwpid_t lwp;
int ret;
@@ -624,12 +606,12 @@
if (ret)
return (ret);
- if (ta->map[th->th_unique].type == PT_LWP) {
- ret = ps_lsetfpregs(ta->ph, ta->map[th->th_unique].lwp, fpregs);
+ if (ta->map[th->th_tid].type == PT_LWP) {
+ ret = ps_lsetfpregs(ta->ph, ta->map[th->th_tid].lwp, fpregs);
return (P2T(ret));
}
- ret = ps_pread(ta->ph, ta->map[th->th_unique].thr +
+ ret = ps_pread(ta->ph, ta->map[th->th_tid].thr +
offsetof(struct pthread, tcb),
&tcb_addr, sizeof(tcb_addr));
if (ret != 0)
@@ -657,10 +639,10 @@
}
static td_err_e
-pt_thr_setgregs(const td_thrhandle_t *th, prgregset_t gregs)
+pt_thr_setgregs(const td_thrhandle_t *th, const prgregset_t gregs)
{
+ const td_thragent_t *ta = th->th_ta;
struct kse_thr_mailbox tmbx;
- pt_thragent_t *ta = (pt_thragent_t *)th->th_ta_p;
psaddr_t tcb_addr, tmbx_addr, ptr;
lwpid_t lwp;
int ret;
@@ -671,12 +653,12 @@
if (ret)
return (ret);
- if (ta->map[th->th_unique].type == PT_LWP) {
- ret = ps_lsetregs(ta->ph, ta->map[th->th_unique].lwp, gregs);
+ if (ta->map[th->th_tid].type == PT_LWP) {
+ ret = ps_lsetregs(ta->ph, ta->map[th->th_tid].lwp, gregs);
return (P2T(ret));
}
- ret = ps_pread(ta->ph, ta->map[th->th_unique].thr +
+ ret = ps_pread(ta->ph, ta->map[th->th_tid].thr +
offsetof(struct pthread, tcb),
&tcb_addr, sizeof(tcb_addr));
if (ret != 0)
@@ -704,13 +686,6 @@
}
static td_err_e
-pt_thr_setxregs(const td_thrhandle_t *th, const void *addr)
-{
- TDBG_FUNC();
- return (TD_NOXREGS);
-}
-
-static td_err_e
pt_thr_event_enable(const td_thrhandle_t *th, int en)
{
TDBG_FUNC();
@@ -739,103 +714,11 @@
}
static td_err_e
-pt_thr_setprio(const td_thrhandle_t *th, int pri)
+pt_thr_sstep(const td_thrhandle_t *th, int step)
{
- TDBG_FUNC();
- return (TD_OK);
-}
-
-static td_err_e
-pt_thr_setsigpending(const td_thrhandle_t *th, unsigned char n,
- const sigset_t *set)
-{
- TDBG_FUNC();
- return (TD_OK);
-}
-
-static td_err_e
-pt_thr_sigsetmask(const td_thrhandle_t *th, const sigset_t *set)
-{
- TDBG_FUNC();
- return (TD_OK);
-}
-
-static td_err_e
-pt_thr_tsd(const td_thrhandle_t *th, const thread_key_t key, void **data)
-{
- pt_thragent_t *ta = (pt_thragent_t *)th->th_ta_p;
- struct pthread_specific_elem *spec, elem;
- int ret;
-
- TDBG_FUNC();
-
- ret = pt_validate(th);
- if (ret)
- return (ret);
-
- if (key < 0 || key >= PTHREAD_KEYS_MAX)
- return (TD_BADKEY);
-
- if (ta->map[th->th_unique].type == PT_LWP) {
- *data = NULL;
- return (TD_OK);
- }
-
- ret = ps_pread(ta->ph,
- ta->map[th->th_unique].thr +
- offsetof(struct pthread, specific),
- &spec, sizeof(spec));
- if (ret == 0) {
- if (spec == NULL) {
- *data = NULL;
- return (0);
- }
- ret = ps_pread(ta->ph, (psaddr_t)&spec[key],
- &elem, sizeof(elem));
- if (ret == 0)
- *data = (void *)elem.data;
- }
- return (P2T(ret));
-}
-
-static td_err_e
-pt_thr_dbsuspend(const td_thrhandle_t *th)
-{
- TDBG_FUNC();
- return (TD_ERR);
-}
-
-static td_err_e
-pt_thr_dbresume(const td_thrhandle_t *th)
-{
- TDBG_FUNC();
- return (TD_ERR);
-}
-
-static td_err_e
-pt_ta_activated(pt_thragent_t *ta, int *a)
-{
- int ret;
-
- TDBG_FUNC();
-
- if (ta->thread_activated) {
- *a = ta->thread_activated;
- return (TD_OK);
- }
- ret = ps_pread(ta->ph, ta->thread_activated_addr,
- &ta->thread_activated, sizeof(int));
- if (ret == 0)
- *a = ta->thread_activated;
- return (P2T(ret));
-}
-
-static td_err_e
-pt_thr_sstep(td_thrhandle_t *th, int step)
-{
+ const td_thragent_t *ta = th->th_ta;
struct kse_thr_mailbox tmbx;
struct reg regs;
- pt_thragent_t *ta = (pt_thragent_t *)th->th_ta_p;
psaddr_t tcb_addr, tmbx_addr;
uint32_t tmp;
lwpid_t lwp;
@@ -847,12 +730,10 @@
if (ret)
return (ret);
- if (ta->map[th->th_unique].type == PT_LWP) {
- ret = ps_lsetstep(ta->ph, ta->map[th->th_unique].lwp, step);
- return (P2T(ret));
- }
+ if (ta->map[th->th_tid].type == PT_LWP)
+ return (TD_BADTH);
- ret = ps_pread(ta->ph, ta->map[th->th_unique].thr +
+ ret = ps_pread(ta->ph, ta->map[th->th_tid].thr +
offsetof(struct pthread, tcb),
&tcb_addr, sizeof(tcb_addr));
if (ret != 0)
@@ -869,10 +750,8 @@
tcb_tmbx.tm_lwp), &lwp, sizeof(lwpid_t));
if (ret != 0)
return (P2T(ret));
- if (lwp != 0) {
- ret = ps_lsetstep(ta->ph, lwp, step);
- return (P2T(ret));
- }
+ if (lwp != 0)
+ return (TD_BADTH);
tmbx_addr = tcb_addr + offsetof(struct tcb, tcb_tmbx);
/*
@@ -893,61 +772,8 @@
return (P2T(ret));
}
-static long
-_map_thread(pt_thragent_t *ta, psaddr_t pt, int type)
-{
- struct pt_map *new;
- int i, first = -1;
-
- /* leave zero out */
- for (i = 1; i < ta->map_len; ++i) {
- if (ta->map[i].type == PT_NONE) {
- if (first == -1)
- first = i;
- } else if (ta->map[i].type == type && ta->map[i].thr == pt) {
- return (i);
- }
- }
-
- if (first == -1) {
- if (ta->map_len == 0) {
- ta->map = calloc(20, sizeof(struct pt_map));
- if (ta->map == NULL)
- return (-1);
- ta->map_len = 20;
- first = 1;
- } else {
- new = realloc(ta->map,
- sizeof(struct pt_map) * ta->map_len * 2);
- if (new == NULL)
- return (-1);
- memset(new + ta->map_len, '\0', sizeof(struct pt_map) *
- ta->map_len);
- first = ta->map_len;
- ta->map = new;
- ta->map_len *= 2;
- }
- }
-
- ta->map[first].type = type;
- ta->map[first].thr = pt;
- return (first);
-}
-
-static long
-pt_map_thread(const pt_thragent_t *ta, psaddr_t pt)
-{
- return _map_thread((pt_thragent_t *)ta, pt, PT_USER);
-}
-
-static long
-pt_map_lwp(const pt_thragent_t *ta, lwpid_t lwp)
-{
- return _map_thread((pt_thragent_t *)ta, (psaddr_t)lwp, PT_LWP);
-}
-
static void
-pt_unmap_lwp(const pt_thragent_t *ta, lwpid_t lwp)
+pt_unmap_lwp(const td_thragent_t *ta, lwpid_t lwp)
{
int i;
@@ -962,33 +788,38 @@
static int
pt_validate(const td_thrhandle_t *th)
{
- pt_thragent_t *ta = (pt_thragent_t *)th->th_ta_p;
- if (th->th_unique < 0 || th->th_unique >= ta->map_len ||
- ta->map[th->th_unique].type == PT_NONE)
+ if (th->th_tid < 0 || th->th_tid >= th->th_ta->map_len ||
+ th->th_ta->map[th->th_tid].type == PT_NONE)
return (TD_NOTHR);
return (TD_OK);
}
-struct ta_ops pthread_ops = {
+struct ta_ops libpthread_db_ops = {
.to_init = pt_init,
- .to_ta_new = pt_ta_new,
+ .to_ta_clear_event = pt_ta_clear_event,
.to_ta_delete = pt_ta_delete,
+ .to_ta_event_addr = pt_ta_event_addr,
+ .to_ta_event_getmsg = pt_ta_event_getmsg,
.to_ta_map_id2thr = pt_ta_map_id2thr,
.to_ta_map_lwp2thr = pt_ta_map_lwp2thr,
+ .to_ta_new = pt_ta_new,
+ .to_ta_set_event = pt_ta_set_event,
.to_ta_thr_iter = pt_ta_thr_iter,
- .to_ta_event_addr = pt_ta_event_addr,
- .to_ta_set_event = pt_ta_set_event,
- .to_ta_clear_event = pt_ta_clear_event,
- .to_ta_event_getmsg = pt_ta_event_getmsg,
- .to_thr_validate = pt_thr_validate,
+ .to_ta_tsd_iter = pt_ta_tsd_iter,
+ .to_thr_clear_event = pt_thr_clear_event,
+ .to_thr_dbresume = pt_thr_dbresume,
+ .to_thr_dbsuspend = pt_thr_dbsuspend,
+ .to_thr_event_enable = pt_thr_event_enable,
+ .to_thr_event_getmsg = pt_thr_event_getmsg,
.to_thr_get_info = pt_thr_get_info,
.to_thr_getfpregs = pt_thr_getfpregs,
.to_thr_getgregs = pt_thr_getgregs,
+ .to_thr_set_event = pt_thr_set_event,
.to_thr_setfpregs = pt_thr_setfpregs,
.to_thr_setgregs = pt_thr_setgregs,
- .to_thr_event_enable = pt_thr_event_enable,
- .to_thr_set_event = pt_thr_set_event,
- .to_thr_clear_event = pt_thr_clear_event,
- .to_thr_event_getmsg = pt_thr_event_getmsg,
+ .to_thr_validate = pt_thr_validate,
+
+ /* FreeBSD specific extensions. */
+ .to_thr_sstep = pt_thr_sstep,
};
==== //depot/projects/gdb/lib/libthread_db/libthr_db.c#4 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: src/lib/libthread_db/libthr_db.c,v 1.1 2004/07/18 04:17:13 marcel Exp $");
#include <proc_service.h>
#include <stdlib.h>
@@ -85,7 +85,31 @@
libthr_db_ta_map_lwp2thr(const td_thragent_t *ta, lwpid_t lwpid,
td_thrhandle_t *th)
{
- return (TD_ERR);
+ psaddr_t addr;
+ thread_t tid;
+ ps_err_e err;
+
+ th->th_ta = ta;
+
+ err = ps_pread(ta->ta_ph, ta->ta_thread_list, &th->th_thread,
+ sizeof(th->th_thread));
+ if (err != PS_OK)
+ return (TD_ERR);
+ while (th->th_thread != NULL) {
+ addr = (psaddr_t)((uintptr_t)th->th_thread +
+ ta->ta_ofs_thr_id);
+ err = ps_pread(ta->ta_ph, addr, &tid, sizeof(thread_t));
+ if (err != PS_OK)
+ return (TD_ERR);
+ if (tid == lwpid)
+ return (TD_OK);
+ addr = (psaddr_t)((uintptr_t)th->th_thread + ta->ta_ofs_next);
+ err = ps_pread(ta->ta_ph, addr, &th->th_thread,
+ sizeof(th->th_thread));
+ if (err != PS_OK)
+ return (TD_ERR);
+ }
+ return (TD_NOLWP);
}
static td_err_e
@@ -195,7 +219,7 @@
ps_err_e err;
ta = th->th_ta;
- ti->ti_ta = ta;
+ ti->ti_ta_p = ta;
addr = (psaddr_t)((uintptr_t)th->th_thread + ta->ta_ofs_thr_id);
err = ps_pread(ta->ta_ph, addr, &tid, sizeof(thread_t));
ti->ti_lid = tid;
@@ -221,7 +245,7 @@
}
static td_err_e
-libthr_db_thr_getgregs(const td_thrhandle_t *th, prgregset_t *r)
+libthr_db_thr_getgregs(const td_thrhandle_t *th, prgregset_t r)
{
const td_thragent_t *ta;
psaddr_t addr;
@@ -250,7 +274,7 @@
}
static td_err_e
-libthr_db_thr_setgregs(const td_thrhandle_t *th, const prgregset_t *r)
+libthr_db_thr_setgregs(const td_thrhandle_t *th, const prgregset_t r)
{
return (TD_ERR);
}
==== //depot/projects/gdb/lib/libthread_db/thread_db.c#3 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: src/lib/libthread_db/thread_db.c,v 1.1 2004/07/18 04:17:13 marcel Exp $");
#include <proc_service.h>
#include <stddef.h>
@@ -34,20 +34,23 @@
#include "thread_db_int.h"
+struct td_thragent
+{
+ TD_THRAGENT_FIELDS;
+};
+
static TAILQ_HEAD(, td_thragent) proclist = TAILQ_HEAD_INITIALIZER(proclist);
extern struct ta_ops libc_r_db_ops;
+extern struct ta_ops libpthread_db_ops;
extern struct ta_ops libthr_db_ops;
static struct ta_ops *ops[] = {
+ &libpthread_db_ops,
&libthr_db_ops,
&libc_r_db_ops
};
-struct td_thragent {
- TD_THRAGENT_FIELDS;
-};
-
td_err_e
td_init(void)
{
@@ -133,6 +136,13 @@
}
td_err_e
+td_ta_tsd_iter(const td_thragent_t *ta, td_key_iter_f *callback,
+ void *cbdata_p)
+{
+ return (ta->ta_ops->to_ta_tsd_iter(ta, callback, cbdata_p));
+}
+
+td_err_e
td_thr_clear_event(const td_thrhandle_t *th, td_thr_events_t *events)
{
const td_thragent_t *ta = th->th_ta;
@@ -140,6 +150,20 @@
}
td_err_e
+td_thr_dbresume(const td_thrhandle_t *th)
+{
+ const td_thragent_t *ta = th->th_ta;
+ return (ta->ta_ops->to_thr_dbresume(th));
+}
+
+td_err_e
+td_thr_dbsuspend(const td_thrhandle_t *th)
+{
+ const td_thragent_t *ta = th->th_ta;
+ return (ta->ta_ops->to_thr_dbsuspend(th));
+}
+
+td_err_e
td_thr_event_enable(const td_thrhandle_t *th, int en)
{
const td_thragent_t *ta = th->th_ta;
@@ -168,7 +192,7 @@
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list