summaryrefslogtreecommitdiffstats
path: root/lib/libthread_db/libthr_db.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libthread_db/libthr_db.c')
-rw-r--r--lib/libthread_db/libthr_db.c90
1 files changed, 38 insertions, 52 deletions
diff --git a/lib/libthread_db/libthr_db.c b/lib/libthread_db/libthr_db.c
index cdf2257..7c6aa2d 100644
--- a/lib/libthread_db/libthr_db.c
+++ b/lib/libthread_db/libthr_db.c
@@ -201,34 +201,28 @@ pt_ta_delete(td_thragent_t *ta)
static td_err_e
pt_ta_map_id2thr(const td_thragent_t *ta, thread_t id, td_thrhandle_t *th)
{
- TAILQ_HEAD(, pthread) thread_list;
psaddr_t pt;
- long lwp;
+ int32_t lwp;
int ret;
TDBG_FUNC();
if (id == 0)
return (TD_NOTHR);
- ret = ps_pread(ta->ph, ta->thread_list_addr, &thread_list,
- sizeof(thread_list));
+ ret = thr_pread_ptr(ta, ta->thread_list_addr, &pt);
if (ret != 0)
- return (P2T(ret));
+ return (TD_ERR);
/* Iterate through thread list to find pthread */
- pt = (psaddr_t)thread_list.tqh_first;
while (pt != 0) {
- ret = ps_pread(ta->ph, pt + ta->thread_off_tid,
- &lwp, sizeof(lwp));
+ ret = thr_pread_int(ta, pt + ta->thread_off_tid, &lwp);
if (ret != 0)
- return (P2T(ret));
+ return (TD_ERR);
if (lwp == id)
break;
/* get next thread */
- ret = ps_pread(ta->ph,
- pt + ta->thread_off_next,
- &pt, sizeof(pt));
+ ret = thr_pread_ptr(ta, pt + ta->thread_off_next, &pt);
if (ret != 0)
- return (P2T(ret));
+ return (TD_ERR);
}
if (pt == 0)
return (TD_NOTHR);
@@ -249,24 +243,20 @@ pt_ta_thr_iter(const td_thragent_t *ta, td_thr_iter_f *callback,
void *cbdata_p, td_thr_state_e state __unused, int ti_pri __unused,
sigset_t *ti_sigmask_p __unused, unsigned int ti_user_flags __unused)
{
- TAILQ_HEAD(, pthread) thread_list;
td_thrhandle_t th;
psaddr_t pt;
- long lwp;
+ int32_t lwp;
int ret;
TDBG_FUNC();
- ret = ps_pread(ta->ph, ta->thread_list_addr, &thread_list,
- sizeof(thread_list));
+ ret = thr_pread_ptr(ta, ta->thread_list_addr, &pt);
if (ret != 0)
- return (P2T(ret));
- pt = (psaddr_t)thread_list.tqh_first;
+ return (TD_ERR);
while (pt != 0) {
- ret = ps_pread(ta->ph, pt + ta->thread_off_tid, &lwp,
- sizeof(lwp));
+ ret = thr_pread_int(ta, pt + ta->thread_off_tid, &lwp);
if (ret != 0)
- return (P2T(ret));
+ return (TD_ERR);
if (lwp != 0 && lwp != TERMINATED) {
th.th_ta = ta;
th.th_tid = (thread_t)lwp;
@@ -275,10 +265,9 @@ pt_ta_thr_iter(const td_thragent_t *ta, td_thr_iter_f *callback,
return (TD_DBERR);
}
/* get next thread */
- ret = ps_pread(ta->ph, pt + ta->thread_off_next, &pt,
- sizeof(pt));
+ ret = thr_pread_ptr(ta, pt + ta->thread_off_next, &pt);
if (ret != 0)
- return (P2T(ret));
+ return (TD_ERR);
}
return (TD_OK);
}
@@ -377,24 +366,23 @@ pt_ta_event_getmsg(const td_thragent_t *ta, td_event_msg_t *msg)
{
static td_thrhandle_t handle;
- psaddr_t pt, pt_temp;
+ psaddr_t pt;
td_thr_events_e tmp;
- long lwp;
+ int32_t lwp;
int ret;
TDBG_FUNC();
- ret = ps_pread(ta->ph, ta->thread_last_event_addr, &pt, sizeof(pt));
+ ret = thr_pread_ptr(ta, ta->thread_last_event_addr, &pt);
if (ret != 0)
- return (P2T(ret));
+ return (TD_ERR);
if (pt == 0)
return (TD_NOMSG);
/*
* Take the event pointer, at the time, libthr only reports event
* once a time, so it is not a link list.
*/
- pt_temp = 0;
- ps_pwrite(ta->ph, ta->thread_last_event_addr, &pt_temp, sizeof(pt_temp));
+ thr_pwrite_ptr(ta, ta->thread_last_event_addr, 0);
/* Read event info */
ret = ps_pread(ta->ph, pt + ta->thread_off_event_buf, msg, sizeof(*msg));
@@ -406,14 +394,14 @@ pt_ta_event_getmsg(const td_thragent_t *ta, td_event_msg_t *msg)
tmp = 0;
ps_pwrite(ta->ph, pt + ta->thread_off_event_buf, &tmp, sizeof(tmp));
/* Convert event */
- pt = (psaddr_t)msg->th_p;
- ret = ps_pread(ta->ph, pt + ta->thread_off_tid, &lwp, sizeof(lwp));
+ pt = msg->th_p;
+ ret = thr_pread_int(ta, pt + ta->thread_off_tid, &lwp);
if (ret != 0)
- return (P2T(ret));
+ return (TD_ERR);
handle.th_ta = ta;
handle.th_tid = lwp;
handle.th_thread = pt;
- msg->th_p = &handle;
+ msg->th_p = (uintptr_t)&handle;
return (0);
}
@@ -478,14 +466,13 @@ pt_thr_get_info(const td_thrhandle_t *th, td_thrinfo_t *info)
ret = pt_validate(th);
if (ret)
return (ret);
- ret = ps_pread(ta->ph, th->th_thread + ta->thread_off_state,
- &state, sizeof(state));
+ ret = thr_pread_int(ta, th->th_thread + ta->thread_off_state, &state);
if (ret != 0)
- return (P2T(ret));
- ret = ps_pread(ta->ph, th->th_thread + ta->thread_off_report_events,
- &info->ti_traceme, sizeof(int));
+ return (TD_ERR);
+ ret = thr_pread_int(ta, th->th_thread + ta->thread_off_report_events,
+ &info->ti_traceme);
if (ret != 0)
- return (P2T(ret));
+ return (TD_ERR);
ret = ps_pread(ta->ph, th->th_thread + ta->thread_off_event_mask,
&info->ti_events, sizeof(td_thr_events_t));
if (ret != 0)
@@ -662,15 +649,15 @@ pt_thr_event_getmsg(const td_thrhandle_t *th, td_event_msg_t *msg)
static td_thrhandle_t handle;
const td_thragent_t *ta = th->th_ta;
psaddr_t pt, pt_temp;
- long lwp;
+ int32_t lwp;
int ret;
td_thr_events_e tmp;
TDBG_FUNC();
pt = th->th_thread;
- ret = ps_pread(ta->ph, ta->thread_last_event_addr, &pt_temp, sizeof(pt_temp));
+ ret = thr_pread_ptr(ta, ta->thread_last_event_addr, &pt_temp);
if (ret != 0)
- return (P2T(ret));
+ return (TD_ERR);
/* Get event */
ret = ps_pread(ta->ph, pt + ta->thread_off_event_buf, msg, sizeof(*msg));
if (ret != 0)
@@ -681,22 +668,21 @@ pt_thr_event_getmsg(const td_thrhandle_t *th, td_event_msg_t *msg)
* Take the event pointer, at the time, libthr only reports event
* once a time, so it is not a link list.
*/
- if (pt == pt_temp) {
- pt_temp = 0;
- ps_pwrite(ta->ph, ta->thread_last_event_addr, &pt_temp, sizeof(pt_temp));
- }
+ if (pt == pt_temp)
+ thr_pwrite_ptr(ta, ta->thread_last_event_addr, 0);
+
/* Clear event */
tmp = 0;
ps_pwrite(ta->ph, pt + ta->thread_off_event_buf, &tmp, sizeof(tmp));
/* Convert event */
- pt = (psaddr_t)msg->th_p;
- ret = ps_pread(ta->ph, pt + ta->thread_off_tid, &lwp, sizeof(lwp));
+ pt = msg->th_p;
+ ret = thr_pread_int(ta, pt + ta->thread_off_tid, &lwp);
if (ret != 0)
- return (P2T(ret));
+ return (TD_ERR);
handle.th_ta = ta;
handle.th_tid = lwp;
handle.th_thread = pt;
- msg->th_p = &handle;
+ msg->th_p = (uintptr_t)&handle;
return (0);
}
OpenPOWER on IntegriCloud