From owner-p4-projects@FreeBSD.ORG Thu Apr 7 09:32:19 2005 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6191A16A4D0; Thu, 7 Apr 2005 09:32:19 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 271D316A4CE for ; Thu, 7 Apr 2005 09:32:19 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id F1EBA43D41 for ; Thu, 7 Apr 2005 09:32:18 +0000 (GMT) (envelope-from davidxu@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j379WI8b033051 for ; Thu, 7 Apr 2005 09:32:18 GMT (envelope-from davidxu@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j379WItj033048 for perforce@freebsd.org; Thu, 7 Apr 2005 09:32:18 GMT (envelope-from davidxu@freebsd.org) Date: Thu, 7 Apr 2005 09:32:18 GMT Message-Id: <200504070932.j379WItj033048@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to davidxu@freebsd.org using -f From: David Xu To: Perforce Change Reviews Subject: PERFORCE change 74658 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 07 Apr 2005 09:32:20 -0000 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