Date: Thu, 7 Apr 2005 09:32:18 GMT From: David Xu <davidxu@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 74658 for review Message-ID: <200504070932.j379WItj033048@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=74658 Change 74658 by davidxu@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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200504070932.j379WItj033048>