PERFORCE change 74658 for review
David Xu
davidxu at FreeBSD.org
Thu Apr 7 02:32:20 PDT 2005
http://perforce.freebsd.org/chv.cgi?CH=74658
Change 74658 by davidxu at davidxu_celeron on 2005/04/07 09:31:42
rename _thread_off_per_thread_event_mask to _thread_off_enable_event.
Affected files ...
.. //depot/projects/davidxu_thread/src/lib/libthread_db/libthr_db.c#5 edit
Differences ...
==== //depot/projects/davidxu_thread/src/lib/libthread_db/libthr_db.c#5 (text+ko) ====
@@ -52,6 +52,10 @@
psaddr_t thread_listgen_addr;
psaddr_t thread_active_threads_addr;
psaddr_t thread_keytable_addr;
+ psaddr_t thread_event_addr;
+ psaddr_t thread_event_mask_addr;
+ psaddr_t thread_create_bp_addr;
+ psaddr_t thread_death_bp_addr;
int thread_inited;
int thread_off_dtv;
int thread_off_tlsindex;
@@ -69,6 +73,7 @@
int thread_off_key_destructor;
int thread_state_zoombie;
int thread_state_running;
+ int thread_off_enable_event;
struct pt_map *map;
int map_len;
};
@@ -195,6 +200,10 @@
LOOKUP_SYM(ph, "_thread_list", &ta->thread_list_addr);
LOOKUP_SYM(ph, "_thread_active_threads",&ta->thread_active_threads_addr);
LOOKUP_SYM(ph, "_thread_keytable", &ta->thread_keytable_addr);
+ LOOKUP_SYM(ph, "_thread_event", &ta->thread_event_addr);
+ LOOKUP_SYM(ph, "_thread_event_mask", &ta->thread_event_mask_addr);
+ LOOKUP_SYM(ph, "_thread_create_bp", &ta->thread_create_bp_addr);
+ LOOKUP_SYM(ph, "_thread_death_bp", &ta->thread_death_bp_addr);
LOOKUP_VAL(ph, "_thread_off_dtv", &ta->thread_off_dtv);
LOOKUP_VAL(ph, "_thread_off_tlsindex", &ta->thread_off_tlsindex);
LOOKUP_VAL(ph, "_thread_off_attr_flags", &ta->thread_off_attr_flags);
@@ -211,6 +220,7 @@
LOOKUP_VAL(ph, "_thread_off_key_destructor", &ta->thread_off_key_destructor);
LOOKUP_VAL(ph, "_thread_state_running", &ta->thread_state_running);
LOOKUP_VAL(ph, "_thread_state_zoombie", &ta->thread_state_zoombie);
+ LOOKUP_VAL(ph, "_thread_off_enable_event", &ta->thread_off_enable_event);
dbg = getpid();
/*
* If this fails it probably means we're debugging a core file and
@@ -429,28 +439,78 @@
pt_ta_event_addr(const td_thragent_t *ta, td_event_e event, td_notify_t *ptr)
{
TDBG_FUNC();
- return (TD_NOEVENT);
+
+ switch (event) {
+ case TD_CREATE:
+ ptr->type = NOTIFY_BPT;
+ ptr->u.bptaddr = ta->thread_create_bp_addr;
+ return (0);
+ case TD_DEATH:
+ ptr->type = NOTIFY_BPT;
+ ptr->u.bptaddr = ta->thread_death_bp_addr;
+ return (0);
+ default:
+ return (TD_NOEVENT);
+ }
}
static td_err_e
pt_ta_set_event(const td_thragent_t *ta, td_thr_events_t *events)
{
+ int ret;
+ int mask;
+
TDBG_FUNC();
- return (TD_ERR);
+ ret = ps_pread(ta->ph, ta->thread_event_mask_addr, &mask,
+ sizeof(int));
+ if (ret != 0)
+ return (P2T(ret));
+ mask |= *events;
+ ret = ps_pwrite(ta->ph, ta->thread_event_mask_addr, &mask,
+ sizeof(int));
+ return (P2T(ret));
}
static td_err_e
pt_ta_clear_event(const td_thragent_t *ta, td_thr_events_t *events)
{
+ int ret;
+ int mask;
+
TDBG_FUNC();
- return (TD_ERR);
+ ret = ps_pread(ta->ph, ta->thread_event_mask_addr, &mask,
+ sizeof(int));
+ if (ret != 0)
+ return (P2T(ret));
+ mask &= ~*events;
+ ret = ps_pwrite(ta->ph, ta->thread_event_mask_addr, &mask,
+ sizeof(int));
+ return (P2T(ret));
}
static td_err_e
pt_ta_event_getmsg(const td_thragent_t *ta, td_event_msg_t *msg)
{
+ static td_thrhandle_t handle;
+
+ psaddr_t pt;
+ long lwp;
+ int ret;
+
TDBG_FUNC();
- return (TD_NOMSG);
+
+ ret = ps_pread(ta->ph, ta->thread_event_addr, msg, sizeof(*msg));
+ if (ret != 0)
+ return (P2T(ret));
+ pt = (psaddr_t)msg->th_p;
+ ret = ps_pread(ta->ph, pt + ta->thread_off_tid, &lwp, sizeof(lwp));
+ if (ret != 0)
+ return (P2T(ret));
+ handle.th_ta = ta;
+ handle.th_tid = pt_map_thread(ta, lwp, pt);
+ handle.th_thread = pt;
+ msg->th_p = &handle;
+ return (0);
}
static td_err_e
@@ -610,8 +670,13 @@
static td_err_e
pt_thr_event_enable(const td_thrhandle_t *th, int en)
{
+ const td_thragent_t *ta = th->th_ta;
+ int ret;
+
TDBG_FUNC();
- return (TD_ERR);
+ ret = ps_pwrite(ta->ph, th->th_thread + ta->thread_off_enable_event,
+ &en, sizeof(int));
+ return (P2T(ret));
}
static td_err_e
More information about the p4-projects
mailing list