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