Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Apr 2005 18:54:00 GMT
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 75000 for review
Message-ID:  <200504121854.j3CIs09K059054@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=75000

Change 75000 by sam@sam_ebb on 2005/04/12 18:53:15

	IFC @ 74999

Affected files ...

.. //depot/projects/wifi/contrib/traceroute/traceroute.8#2 integrate
.. //depot/projects/wifi/etc/defaults/rc.conf#13 integrate
.. //depot/projects/wifi/gnu/usr.bin/gdb/libgdb/fbsd-threads.c#5 integrate
.. //depot/projects/wifi/lib/libthr/Makefile#4 integrate
.. //depot/projects/wifi/lib/libthr/pthread.map#2 integrate
.. //depot/projects/wifi/lib/libthr/thread/Makefile.inc#3 integrate
.. //depot/projects/wifi/lib/libthr/thread/thr_create.c#3 integrate
.. //depot/projects/wifi/lib/libthr/thread/thr_event.c#1 branch
.. //depot/projects/wifi/lib/libthr/thread/thr_exit.c#3 integrate
.. //depot/projects/wifi/lib/libthr/thread/thr_init.c#5 integrate
.. //depot/projects/wifi/lib/libthr/thread/thr_list.c#2 integrate
.. //depot/projects/wifi/lib/libthr/thread/thr_private.h#5 integrate
.. //depot/projects/wifi/lib/libthr/thread/thr_symbols.c#2 integrate
.. //depot/projects/wifi/lib/libthread_db/libc_r_db.c#2 integrate
.. //depot/projects/wifi/lib/libthread_db/libpthread_db.c#3 integrate
.. //depot/projects/wifi/lib/libthread_db/libthr_db.c#3 integrate
.. //depot/projects/wifi/lib/libthread_db/thread_db.h#3 integrate
.. //depot/projects/wifi/release/doc/en_US.ISO8859-1/hardware/common/dev.sgml#13 integrate
.. //depot/projects/wifi/release/doc/share/misc/dev.archlist.txt#12 integrate
.. //depot/projects/wifi/share/misc/pci_vendors#2 integrate
.. //depot/projects/wifi/sys/dev/ata/ata-raid.c#4 integrate
.. //depot/projects/wifi/sys/dev/ata/ata-raid.h#3 integrate
.. //depot/projects/wifi/sys/dev/ath/if_ath.c#83 integrate
.. //depot/projects/wifi/sys/dev/ath/if_athvar.h#33 integrate
.. //depot/projects/wifi/sys/dev/pccard/pccard.c#7 integrate
.. //depot/projects/wifi/sys/dev/pccard/pccardvar.h#3 integrate
.. //depot/projects/wifi/sys/dev/usb/ucom.c#4 integrate
.. //depot/projects/wifi/sys/geom/geom_sunlabel.c#2 integrate
.. //depot/projects/wifi/sys/kern/kern_lock.c#10 integrate
.. //depot/projects/wifi/sys/kern/kern_shutdown.c#4 integrate
.. //depot/projects/wifi/sys/kern/subr_bus.c#13 integrate
.. //depot/projects/wifi/sys/kern/subr_rman.c#4 integrate
.. //depot/projects/wifi/sys/net80211/ieee80211_crypto.c#11 integrate
.. //depot/projects/wifi/sys/net80211/ieee80211_crypto.h#9 integrate
.. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#37 integrate
.. //depot/projects/wifi/sys/powerpc/psim/ata_iobus.c#6 integrate
.. //depot/projects/wifi/sys/sys/bus.h#8 integrate
.. //depot/projects/wifi/sys/sys/rman.h#4 integrate
.. //depot/projects/wifi/sys/sys/vnode.h#21 integrate
.. //depot/projects/wifi/tools/tools/README#4 integrate
.. //depot/projects/wifi/usr.bin/netstat/inet.c#4 integrate
.. //depot/projects/wifi/usr.sbin/sysinstall/config.c#5 integrate
.. //depot/projects/wifi/usr.sbin/yppush/yppush_main.c#2 integrate

Differences ...

==== //depot/projects/wifi/contrib/traceroute/traceroute.8#2 (text+ko) ====

@@ -14,7 +14,7 @@
 .\" WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 .\"
 .\"	$Id: traceroute.8,v 1.19 2000/09/21 08:44:19 leres Exp $
-.\"	$FreeBSD: src/contrib/traceroute/traceroute.8,v 1.10 2002/12/13 22:26:10 fenner Exp $
+.\"	$FreeBSD: src/contrib/traceroute/traceroute.8,v 1.11 2005/04/12 15:16:32 thomas Exp $
 .\"
 .TH TRACEROUTE 8 "21 September 2000"
 .UC 6
@@ -151,7 +151,7 @@
 Traceroute hopes that nothing is listening on UDP ports
 .I base
 to
-.I base + nhops - 1
+.I base + nhops * nprobes - 1
 at the destination host (so an ICMP PORT_UNREACHABLE message will
 be returned to terminate the route tracing).  If something is
 listening on a port in the default range, this option can be used

==== //depot/projects/wifi/etc/defaults/rc.conf#13 (text+ko) ====

@@ -15,7 +15,7 @@
 # For a more detailed explanation of all the rc.conf variables, please
 # refer to the rc.conf(5) manual page.
 #
-# $FreeBSD: src/etc/defaults/rc.conf,v 1.246 2005/04/11 02:45:05 dougb Exp $
+# $FreeBSD: src/etc/defaults/rc.conf,v 1.247 2005/04/12 15:21:51 thomas Exp $
 
 ##############################################################
 ###  Important initial Boot-time options  ####################
@@ -436,7 +436,7 @@
 chkprintcap_flags="-d"	# Create missing directories by default.
 usbd_enable="NO"	# Run the usbd daemon.
 usbd_flags=""		# Flags to usbd (if enabled).
-dumpdev="NO"		# Device name to crashdump to (or NO).
+dumpdev="NO"		# Device to crashdump to (device name, AUTO, or NO).
 dumpdir="/var/crash"	# Directory where crash dumps are to be stored
 savecore_flags=""	# Used if dumpdev is enabled above, and present.
 enable_quotas="NO"	# turn on quotas on startup (or NO).

==== //depot/projects/wifi/gnu/usr.bin/gdb/libgdb/fbsd-threads.c#5 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/gnu/usr.bin/gdb/libgdb/fbsd-threads.c,v 1.10 2005/04/05 11:40:58 davidxu Exp $ */
+/* $FreeBSD: src/gnu/usr.bin/gdb/libgdb/fbsd-threads.c,v 1.11 2005/04/12 03:04:04 davidxu Exp $ */
 /* FreeBSD libthread_db assisted debugging support.
    Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
 
@@ -130,9 +130,17 @@
 static td_err_e (*td_thr_dbsuspend_p) (const td_thrhandle_t *);
 static td_err_e (*td_thr_dbresume_p) (const td_thrhandle_t *);
 
+static CORE_ADDR td_create_bp_addr;
+
+/* Location of the thread death event breakpoint.  */
+static CORE_ADDR td_death_bp_addr;
+
 /* Prototypes for local functions.  */
 static void fbsd_thread_find_new_threads (void);
 static int fbsd_thread_alive (ptid_t ptid);
+static void attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
+               const td_thrinfo_t *ti_p, int verbose);
+static void fbsd_thread_detach (char *args, int from_tty);
 
 /* Building process ids.  */
 
@@ -228,23 +236,21 @@
 
 /* Convert LWP to user-level thread id. */
 static ptid_t
-thread_from_lwp (ptid_t ptid)
+thread_from_lwp (ptid_t ptid, td_thrhandle_t *th, td_thrinfo_t *ti)
 {
-  td_thrinfo_t ti;
-  td_thrhandle_t th;
   td_err_e err;
  
   gdb_assert (IS_LWP (ptid));
 
   if (fbsd_thread_active)
     {
-      err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), &th);
+      err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), th);
       if (err == TD_OK)
         {
-          err = td_thr_get_info_p (&th, &ti);
+          err = td_thr_get_info_p (th, ti);
           if (err != TD_OK)
             error ("Cannot get thread info: %s", thread_db_err_str (err));
-          return BUILD_THREAD (ti.ti_tid, GET_PID (ptid));
+          return BUILD_THREAD (ti->ti_tid, GET_PID (ptid));
         }
     }
 
@@ -285,24 +291,114 @@
 static void
 get_current_thread ()
 {
+  td_thrhandle_t th;
+  td_thrinfo_t ti;
   long lwp;
   ptid_t tmp, ptid;
 
   lwp = get_current_lwp (proc_handle.pid);
   tmp = BUILD_LWP (lwp, proc_handle.pid);
-  ptid = thread_from_lwp (tmp);
+  ptid = thread_from_lwp (tmp, &th, &ti);
   if (!in_thread_list (ptid))
     {
-      add_thread (ptid);
+      attach_thread (ptid, &th, &ti, 1);
     }
   inferior_ptid = ptid;
 }
 
+static td_err_e
+enable_thread_event (td_thragent_t *thread_agent, int event, CORE_ADDR *bp)
+{
+  td_notify_t notify;
+  td_err_e err;
+
+  /* Get the breakpoint address for thread EVENT.  */
+  err = td_ta_event_addr_p (thread_agent, event, &notify);
+  if (err != TD_OK)
+    return err;
+
+  /* Set up the breakpoint.  */
+  (*bp) = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
+				      (CORE_ADDR)notify.u.bptaddr,
+				      &current_target);
+  create_thread_event_breakpoint ((*bp));
+
+  return TD_OK;
+}
+
+static void
+enable_thread_event_reporting (void)
+{
+  td_thr_events_t events;
+  td_notify_t notify;
+  td_err_e err;
+
+  /* We cannot use the thread event reporting facility if these
+     functions aren't available.  */
+  if (td_ta_event_addr_p == NULL || td_ta_set_event_p == NULL
+      || td_ta_event_getmsg_p == NULL || td_thr_event_enable_p == NULL)
+    return;
+
+  /* Set the process wide mask saying which events we're interested in.  */
+  td_event_emptyset (&events);
+  td_event_addset (&events, TD_CREATE);
+  td_event_addset (&events, TD_DEATH);
+
+  err = td_ta_set_event_p (thread_agent, &events);
+  if (err != TD_OK)
+    {
+      warning ("Unable to set global thread event mask: %s",
+	       thread_db_err_str (err));
+      return;
+    }
+
+  /* Delete previous thread event breakpoints, if any.  */
+  remove_thread_event_breakpoints ();
+  td_create_bp_addr = 0;
+  td_death_bp_addr = 0;
+
+  /* Set up the thread creation event.  */
+  err = enable_thread_event (thread_agent, TD_CREATE, &td_create_bp_addr);
+  if (err != TD_OK)
+    {
+      warning ("Unable to get location for thread creation breakpoint: %s",
+	       thread_db_err_str (err));
+      return;
+    }
+
+  /* Set up the thread death event.  */
+  err = enable_thread_event (thread_agent, TD_DEATH, &td_death_bp_addr);
+  if (err != TD_OK)
+    {
+      warning ("Unable to get location for thread death breakpoint: %s",
+	       thread_db_err_str (err));
+      return;
+    }
+}
+
+static void
+disable_thread_event_reporting (void)
+{
+  td_thr_events_t events;
+
+  /* Set the process wide mask saying we aren't interested in any
+     events anymore.  */
+  td_event_emptyset (&events);
+  td_ta_set_event_p (thread_agent, &events);
+
+  /* Delete thread event breakpoints, if any.  */
+  remove_thread_event_breakpoints ();
+  td_create_bp_addr = 0;
+  td_death_bp_addr = 0;
+}
+
 static void
 fbsd_thread_activate (void)
 {
   fbsd_thread_active = 1;
   init_thread_list();
+  if (fbsd_thread_core == 0)
+    enable_thread_event_reporting ();
   fbsd_thread_find_new_threads ();
   get_current_thread ();
 }
@@ -310,6 +406,8 @@
 static void
 fbsd_thread_deactivate (void)
 {
+  if (fbsd_thread_core == 0)
+    disable_thread_event_reporting();
   td_ta_delete_p (thread_agent);
 
   inferior_ptid = pid_to_ptid (proc_handle.pid);
@@ -544,20 +642,111 @@
     perror_with_name ("PT_CONTINUE");
 }
 
+static void
+attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
+               const td_thrinfo_t *ti_p, int verbose)
+{
+  td_err_e err;
+
+  /* Add the thread to GDB's thread list.  */
+  if (!in_thread_list (ptid)) {
+    add_thread (ptid);
+    if (verbose)
+      printf_unfiltered ("[New %s]\n", target_pid_to_str (ptid));
+  }
+
+  if (ti_p->ti_state == TD_THR_UNKNOWN || ti_p->ti_state == TD_THR_ZOMBIE)
+    return;                     /* A zombie thread -- do not attach.  */
+
+  if (! IS_THREAD(ptid))
+    return;
+  /* Enable thread event reporting for this thread. */
+  err = td_thr_event_enable_p (th_p, 1);
+  if (err != TD_OK)
+    error ("Cannot enable thread event reporting for %s: %s",
+           target_pid_to_str (ptid), thread_db_err_str (err));
+}
+
+static void
+detach_thread (ptid_t ptid, int verbose)
+{
+  if (verbose)
+    printf_unfiltered ("[%s exited]\n", target_pid_to_str (ptid));
+}
+
+static void
+check_event (ptid_t ptid)
+{
+  td_event_msg_t msg;
+  td_thrinfo_t ti;
+  td_err_e err;
+  CORE_ADDR stop_pc;
+  int loop = 0;
+
+  /* Bail out early if we're not at a thread event breakpoint.  */
+  stop_pc = read_pc_pid (ptid) - DECR_PC_AFTER_BREAK;
+  if (stop_pc != td_create_bp_addr && stop_pc != td_death_bp_addr)
+    return;
+  loop = 1;
+
+  do
+    {
+      err = td_ta_event_getmsg_p (thread_agent, &msg);
+      if (err != TD_OK)
+        {
+	  if (err == TD_NOMSG)
+	    return;
+          error ("Cannot get thread event message: %s",
+		 thread_db_err_str (err));
+        }
+      err = td_thr_get_info_p (msg.th_p, &ti);
+      if (err != TD_OK)
+        error ("Cannot get thread info: %s", thread_db_err_str (err));
+      ptid = BUILD_THREAD (ti.ti_tid, GET_PID (ptid));
+      switch (msg.event)
+        {
+        case TD_CREATE:
+          /* We may already know about this thread, for instance when the
+             user has issued the `info threads' command before the SIGTRAP
+             for hitting the thread creation breakpoint was reported.  */
+          attach_thread (ptid, msg.th_p, &ti, 1);
+          break;
+       case TD_DEATH:
+         if (!in_thread_list (ptid))
+           error ("Spurious thread death event.");
+         detach_thread (ptid, 1);
+         break;
+       default:
+          error ("Spurious thread event.");
+       }
+    }
+  while (loop);
+}
+
 static ptid_t
 fbsd_thread_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   ptid_t ret;
   long lwp;
   CORE_ADDR stop_pc;
+  td_thrhandle_t th;
+  td_thrinfo_t ti;
 
   ret = child_ops.to_wait (ptid, ourstatus);
   if (GET_PID(ret) >= 0 && ourstatus->kind == TARGET_WAITKIND_STOPPED)
     {
       lwp = get_current_lwp (GET_PID(ret));
-      ret = thread_from_lwp (BUILD_LWP (lwp, GET_PID (ret)));
-      if (!in_thread_list (ret))
-        add_thread (ret);
+      ret = thread_from_lwp (BUILD_LWP(lwp, GET_PID(ret)),
+         &th, &ti);
+      if (!in_thread_list(ret)) {
+        /*
+         * We have to enable event reporting for initial thread
+         * which was not mapped before.
+	 */
+        attach_thread(ret, &th, &ti, 1);
+      }
+      if (ourstatus->value.sig == TARGET_SIGNAL_TRAP)
+        check_event(ret);
       /* this is a hack, if an event won't cause gdb to stop, for example,
          SIGARLM, gdb resumes the process immediatly without setting
          inferior_ptid to the new thread returned here, this is a bug
@@ -567,7 +756,7 @@
         {
           delete_thread (inferior_ptid);
           inferior_ptid = ret;
-       }
+        }
     }
 
   return (ret);
@@ -873,9 +1062,7 @@
     return 0;
 
   ptid = BUILD_THREAD (ti.ti_tid, proc_handle.pid);
-
-  if (!in_thread_list (ptid))
-      add_thread (ptid);
+  attach_thread (ptid, th_p, &ti, 1);
   return 0;
 }
 
@@ -968,7 +1155,7 @@
       ret = td_ta_map_id2thr_p (thread_agent, GET_THREAD(ptid), &th);
 
       /* get the address of the variable. */
-      ret = td_thr_tls_get_addr_p (&th, (void *) lm, offset, &address);
+      ret = td_thr_tls_get_addr_p (&th, (void *)lm, offset, &address);
 
       if (ret != TD_OK)
         {
@@ -1180,6 +1367,13 @@
       return 0;
     }
 
+  /* These are not essential.  */
+  td_ta_event_addr_p = dlsym (handle, "td_ta_event_addr");
+  td_ta_set_event_p = dlsym (handle, "td_ta_set_event");
+  td_ta_event_getmsg_p = dlsym (handle, "td_ta_event_getmsg");
+  td_thr_event_enable_p = dlsym (handle, "td_thr_event_enable");
+  td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr");
+  
   return 1;
 }
 

==== //depot/projects/wifi/lib/libthr/Makefile#4 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/lib/libthr/Makefile,v 1.10 2005/04/06 13:48:11 davidxu Exp $
+# $FreeBSD: src/lib/libthr/Makefile,v 1.11 2005/04/12 03:00:28 davidxu Exp $
 #
 # All library objects contain FreeBSD revision strings by default; they may be
 # excluded as a space-saving measure.  To produce a library that does
@@ -16,6 +16,7 @@
 CFLAGS+=-I${.CURDIR}/sys
 CFLAGS+=-I${.CURDIR}/../../libexec/rtld-elf
 CFLAGS+=-I${.CURDIR}/../../libexec/rtld-elf/${MACHINE_ARCH}
+CFLAGS+=-I${.CURDIR}/../libthread_db
 CFLAGS+=-Winline
 
 # CFLAGS+=-DSYSTEM_SCOPE_ONLY

==== //depot/projects/wifi/lib/libthr/pthread.map#2 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/lib/libthr/pthread.map,v 1.2 2005/04/03 23:52:29 davidxu Exp $
+# $FreeBSD: src/lib/libthr/pthread.map,v 1.3 2005/04/12 03:00:28 davidxu Exp $
 LIBPTHREAD_1_0 {
 global:
 	___creat;
@@ -344,21 +344,26 @@
 	# Debugger needs these.
 	_libthr_debug;
 	_thread_active_threads;
+	_thread_bp_create;
+	_thread_bp_death;
+	_thread_event_mask;
 	_thread_keytable;
+	_thread_last_event;
 	_thread_list;
 	_thread_max_keys;
 	_thread_off_attr_flags;
 	_thread_off_dtv;
+	_thread_off_event_buf;
+	_thread_off_event_mask;
+	_thread_off_key_allocated;
+	_thread_off_key_destructor;
 	_thread_off_linkmap;
 	_thread_off_next;
+	_thread_off_report_events;
+	_thread_off_state;
 	_thread_off_tcb;
 	_thread_off_tid;
-	_thread_off_key_allocated;
-	_thread_off_key_destructor;
-	_thread_off_state;
-	_thread_off_thr_locklevel;
 	_thread_off_tlsindex;
-	_thread_off_isdead;
 	_thread_size_key;
 	_thread_state_running;
 	_thread_state_zoombie;

==== //depot/projects/wifi/lib/libthr/thread/Makefile.inc#3 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/lib/libthr/thread/Makefile.inc,v 1.9 2005/04/02 01:20:00 davidxu Exp $
+# $FreeBSD: src/lib/libthr/thread/Makefile.inc,v 1.10 2005/04/12 03:00:28 davidxu Exp $
 
 # thr sources
 .PATH: ${.CURDIR}/thread
@@ -15,6 +15,7 @@
 	thr_create.c \
 	thr_detach.c \
 	thr_equal.c \
+	thr_event.c \
 	thr_exit.c \
 	thr_fork.c \
 	thr_getprio.c \

==== //depot/projects/wifi/lib/libthr/thread/thr_create.c#3 (text+ko) ====

@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/libthr/thread/thr_create.c,v 1.20 2005/04/02 01:20:00 davidxu Exp $
+ * $FreeBSD: src/lib/libthr/thread/thr_create.c,v 1.21 2005/04/12 03:00:28 davidxu Exp $
  */
 
 #include <errno.h>
@@ -56,7 +56,7 @@
 	ucontext_t uc;
 	sigset_t sigmask, oldsigmask;
 	struct pthread *curthread, *new_thread;
-	int ret = 0;
+	int ret = 0, locked;
 
 	_thr_check_init();
 
@@ -92,9 +92,10 @@
 	else if (_thr_scope_system < 0)
 		new_thread->attr.flags &= ~PTHREAD_SCOPE_SYSTEM;
 
+	new_thread->tid = TID_TERMINATED;
+
 	if (create_stack(&new_thread->attr) != 0) {
 		/* Insufficient memory to create a stack: */
-		new_thread->terminated = 1;
 		_thr_free(curthread, new_thread);
 		return (EAGAIN);
 	}
@@ -151,20 +152,31 @@
 	 * it can not handle signal, so we should masks all signals here.
 	 */
 	SIGFILLSET(sigmask);
+	SIGDELSET(sigmask, SIGTRAP);
 	__sys_sigprocmask(SIG_SETMASK, &sigmask, &oldsigmask);
 	new_thread->sigmask = oldsigmask;
 	/* Add the new thread. */
 	_thr_link(curthread, new_thread);
 	/* Return thread pointer eariler so that new thread can use it. */
 	(*thread) = new_thread;
+	if (SHOULD_REPORT_EVENT(curthread, TD_CREATE)) {
+		THR_THREAD_LOCK(curthread, new_thread);
+		locked = 1;
+	} else
+		locked = 0;
 	/* Schedule the new thread. */
 	ret = thr_create(&uc, &new_thread->tid, 0);
 	__sys_sigprocmask(SIG_SETMASK, &oldsigmask, NULL);
 	if (ret != 0) {
+		if (locked)
+			THR_THREAD_UNLOCK(curthread, new_thread);
 		_thr_unlink(curthread, new_thread);
 		free_thread(curthread, new_thread);
 		(*thread) = 0;
 		ret = EAGAIN;
+	} else if (locked) {
+		_thr_report_creation(curthread, new_thread);
+		THR_THREAD_UNLOCK(curthread, new_thread);
 	}
 	return (ret);
 }
@@ -173,7 +185,7 @@
 free_thread(struct pthread *curthread, struct pthread *thread)
 {
 	free_stack(curthread, &thread->attr);
-	curthread->terminated = 1;
+	curthread->tid = TID_TERMINATED;
 	_thr_free(curthread, thread);
 }
 
@@ -215,6 +227,9 @@
 	if (curthread->flags & THR_FLAGS_NEED_SUSPEND)
 		_thr_suspend_check(curthread);
 
+	THR_LOCK(curthread);
+	THR_UNLOCK(curthread);
+
 	/* Run the current thread's start routine with argument: */
 	pthread_exit(curthread->start_routine(curthread->arg));
 

==== //depot/projects/wifi/lib/libthr/thread/thr_exit.c#3 (text+ko) ====

@@ -29,7 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/libthr/thread/thr_exit.c,v 1.17 2005/04/02 01:20:00 davidxu Exp $
+ * $FreeBSD: src/lib/libthr/thread/thr_exit.c,v 1.18 2005/04/12 03:00:28 davidxu Exp $
  */
 
 #include <errno.h>
@@ -130,7 +130,9 @@
 	THREAD_LIST_UNLOCK(curthread);
 	if (curthread->joiner)
 		_thr_umtx_wake(&curthread->state, INT_MAX);
-	thr_exit(&curthread->terminated);
+	if (SHOULD_REPORT_EVENT(curthread, TD_DEATH))
+		_thr_report_death(curthread);
+	thr_exit(&curthread->tid);
 	PANIC("thr_exit() returned");
 	/* Never reach! */
 }

==== //depot/projects/wifi/lib/libthr/thread/thr_init.c#5 (text+ko) ====

@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/libthr/thread/thr_init.c,v 1.21 2005/04/06 13:57:31 davidxu Exp $
+ * $FreeBSD: src/lib/libthr/thread/thr_init.c,v 1.23 2005/04/12 03:13:49 davidxu Exp $
  */
 
 /* Allocate space for global thread variables here: */
@@ -309,6 +309,8 @@
 		_thr_initial = curthread;
 		SIGDELSET(oldset, SIGCANCEL);
 		__sys_sigprocmask(SIG_SETMASK, &oldset, NULL);
+		if (_thread_event_mask & TD_CREATE)
+			_thr_report_creation(curthread, curthread);
 	}
 }
 
@@ -384,6 +386,7 @@
 	_thr_umtx_init(&_rwlock_static_lock);
 	_thr_umtx_init(&_keytable_lock);
 	_thr_umtx_init(&_thr_atfork_lock);
+	_thr_umtx_init(&_thr_event_lock);
 	_thr_spinlock_init();
 	_thr_list_init();
 

==== //depot/projects/wifi/lib/libthr/thread/thr_list.c#2 (text+ko) ====

@@ -24,7 +24,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/libthr/thread/thr_list.c,v 1.3 2005/04/07 06:09:17 davidxu Exp $
+ * $FreeBSD: src/lib/libthr/thread/thr_list.c,v 1.4 2005/04/12 03:00:28 davidxu Exp $
  */
 
 #include <sys/types.h>
@@ -99,7 +99,7 @@
 	/* Check the threads waiting for GC. */
 	for (td = TAILQ_FIRST(&_thread_gc_list); td != NULL; td = td_next) {
 		td_next = TAILQ_NEXT(td, gcle);
-		if (td->terminated == 0) {
+		if (td->tid != TID_TERMINATED) {
 			/* make sure we are not still in userland */
 			continue;
 		}

==== //depot/projects/wifi/lib/libthr/thread/thr_private.h#5 (text+ko) ====

@@ -29,7 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/libthr/thread/thr_private.h,v 1.45 2005/04/06 13:57:31 davidxu Exp $
+ * $FreeBSD: src/lib/libthr/thread/thr_private.h,v 1.46 2005/04/12 03:00:28 davidxu Exp $
  */
 
 #ifndef _THR_PRIVATE_H
@@ -56,6 +56,7 @@
 
 #include "pthread_md.h"
 #include "thr_umtx.h"
+#include "thread_db.h"
 
 /*
  * Evaluate the storage class specifier.
@@ -345,11 +346,9 @@
 	 */
 	umtx_t			lock;
 
-	/* Thread is terminated in kernel, written by kernel. */
-	long			terminated;
-
 	/* Kernel thread id. */
 	long			tid;
+#define	TID_TERMINATED		1
 
 	/* Internal condition variable cycle number. */
 	umtx_t			cycle;
@@ -491,6 +490,15 @@
 
 	/* Cleanup handlers Link List */
 	struct pthread_cleanup	*cleanup;
+
+	/* Enable event reporting */
+	int			report_events;
+
+	/* Event mask */
+	int			event_mask;
+
+	/* Event */
+	td_event_msg_t		event_buf;
 };
 
 #define THR_UMTX_TRYLOCK(thrd, lck)			\
@@ -573,6 +581,10 @@
 
 #define	THR_IN_SYNCQ(thrd)	(((thrd)->sflags & THR_FLAGS_IN_SYNCQ) != 0)
 
+#define SHOULD_REPORT_EVENT(curthr, e)			\
+	(curthr->report_events && 			\
+	 (((curthr)->event_mask | _thread_event_mask ) & e) != 0)
+
 extern int __isthreaded;
 
 /*
@@ -581,9 +593,12 @@
 
 SCLASS void		*_usrstack	SCLASS_PRESET(NULL);
 SCLASS struct pthread	*_thr_initial	SCLASS_PRESET(NULL);
+SCLASS int		_thr_scope_system	SCLASS_PRESET(0);
+
 /* For debugger */
 SCLASS int		_libthr_debug		SCLASS_PRESET(0);
-SCLASS int		_thr_scope_system	SCLASS_PRESET(0);
+SCLASS int		_thread_event_mask	SCLASS_PRESET(0);
+SCLASS struct pthread	*_thread_last_event;
 
 /* List of all threads: */
 SCLASS TAILQ_HEAD(, pthread)	_thread_list
@@ -643,6 +658,7 @@
 SCLASS umtx_t		_rwlock_static_lock;
 SCLASS umtx_t		_keytable_lock;
 SCLASS umtx_t		_thr_list_lock;
+SCLASS umtx_t		_thr_event_lock;
 
 /* Undefine the storage class and preset specifiers: */
 #undef  SCLASS
@@ -720,6 +736,11 @@
 void	_thr_unlink(struct pthread *curthread, struct pthread *thread);
 void	_thr_suspend_check(struct pthread *curthread);
 void	_thr_assert_lock_level() __dead2;
+void	_thr_report_creation(struct pthread *curthread,
+			   struct pthread *newthread);
+void	_thr_report_death(struct pthread *curthread);
+void	_thread_bp_create(void);
+void	_thread_bp_death(void);
 
 /* #include <sys/aio.h> */
 #ifdef _SYS_AIO_H_

==== //depot/projects/wifi/lib/libthr/thread/thr_symbols.c#2 (text+ko) ====

@@ -29,7 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/libthr/thread/thr_symbols.c,v 1.1 2005/04/02 01:20:00 davidxu Exp $
+ * $FreeBSD: src/lib/libthr/thread/thr_symbols.c,v 1.2 2005/04/12 03:00:28 davidxu Exp $
  */
 
 #include <stddef.h>
@@ -45,10 +45,11 @@
 int _thread_off_tid = offsetof(struct pthread, tid);
 int _thread_off_next = offsetof(struct pthread, tle.tqe_next);
 int _thread_off_attr_flags = offsetof(struct pthread, attr.flags);
-int _thread_off_thr_locklevel = offsetof(struct pthread, locklevel);
 int _thread_off_linkmap = offsetof(Obj_Entry, linkmap);
 int _thread_off_tlsindex = offsetof(Obj_Entry, tlsindex);
-int _thread_off_isdead = offsetof(struct pthread, terminated);
+int _thread_off_report_events = offsetof(struct pthread, report_events);
+int _thread_off_event_mask = offsetof(struct pthread, event_mask);
+int _thread_off_event_buf = offsetof(struct pthread, event_buf);
 int _thread_size_key = sizeof(struct pthread_key);
 int _thread_off_key_allocated = offsetof(struct pthread_key, allocated);
 int _thread_off_key_destructor = offsetof(struct pthread_key, destructor);

==== //depot/projects/wifi/lib/libthread_db/libc_r_db.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libthread_db/libc_r_db.c,v 1.1 2004/07/18 04:17:13 marcel Exp $");
+__FBSDID("$FreeBSD: src/lib/libthread_db/libc_r_db.c,v 1.2 2005/04/12 03:03:16 davidxu Exp $");
 
 #include <machine/setjmp.h>
 #include <proc_service.h>
@@ -58,7 +58,7 @@
 static td_err_e
 libc_r_db_ta_clear_event(const td_thragent_t *ta, td_thr_events_t *ev)
 {
-	return (TD_ERR);
+	return (0);
 }
 
 static td_err_e
@@ -160,7 +160,7 @@
 static td_err_e
 libc_r_db_ta_set_event(const td_thragent_t *ta, td_thr_events_t *ev)
 {
-	return (TD_ERR);
+	return (0);
 }
 
 static td_err_e
@@ -192,13 +192,13 @@
 static td_err_e
 libc_r_db_thr_clear_event(const td_thrhandle_t *th, td_thr_events_t *ev)
 {
-	return (TD_ERR);
+	return (0);
 }
 
 static td_err_e
 libc_r_db_thr_event_enable(const td_thrhandle_t *th, int oo)
 {
-	return (TD_ERR);
+	return (0);
 }
 
 static td_err_e
@@ -281,7 +281,7 @@
 static td_err_e
 libc_r_db_thr_set_event(const td_thrhandle_t *th, td_thr_events_t *ev)
 {
-	return (TD_ERR);
+	return (0);
 }
 
 static td_err_e

==== //depot/projects/wifi/lib/libthread_db/libpthread_db.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libthread_db/libpthread_db.c,v 1.7 2005/04/05 11:38:30 davidxu Exp $");
+__FBSDID("$FreeBSD: src/lib/libthread_db/libpthread_db.c,v 1.8 2005/04/12 03:03:16 davidxu Exp $");
 
 #include <stddef.h>
 #include <stdlib.h>
@@ -428,21 +428,21 @@
 pt_ta_event_addr(const td_thragent_t *ta, td_event_e event, td_notify_t *ptr)
 {
 	TDBG_FUNC();
-	return (TD_NOEVENT);
+	return (TD_ERR);
 }
 
 static td_err_e
 pt_ta_set_event(const td_thragent_t *ta, td_thr_events_t *events)
 {
 	TDBG_FUNC();
-	return (TD_ERR);
+	return (0);
 }
 
 static td_err_e
 pt_ta_clear_event(const td_thragent_t *ta, td_thr_events_t *events)
 {
 	TDBG_FUNC();
-	return (TD_ERR);
+	return (0);
 }
 
 static td_err_e
@@ -821,21 +821,21 @@
 pt_thr_event_enable(const td_thrhandle_t *th, int en)
 {
 	TDBG_FUNC();
-	return (TD_ERR);
+	return (0);
 }
 
 static td_err_e
 pt_thr_set_event(const td_thrhandle_t *th, td_thr_events_t *setp)
 {
 	TDBG_FUNC();
-	return (TD_ERR);
+	return (0);
 }
 
 static td_err_e
 pt_thr_clear_event(const td_thrhandle_t *th, td_thr_events_t *setp)
 {
 	TDBG_FUNC();
-	return (TD_ERR);
+	return (0);
 }
 
 static td_err_e

==== //depot/projects/wifi/lib/libthread_db/libthr_db.c#3 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libthread_db/libthr_db.c,v 1.4 2005/04/05 11:38:30 davidxu Exp $");
+__FBSDID("$FreeBSD: src/lib/libthread_db/libthr_db.c,v 1.5 2005/04/12 03:03:16 davidxu Exp $");
 
 #include <proc_service.h>
 #include <stddef.h>
@@ -39,6 +39,8 @@
 
 #include "thread_db_int.h"
 
+#define	TERMINATED	1
+
 struct pt_map {
 	int		used;
 	lwpid_t		lwp;
@@ -49,24 +51,27 @@
 	TD_THRAGENT_FIELDS;
 	psaddr_t	libthr_debug_addr;
 	psaddr_t	thread_list_addr;
-	psaddr_t	thread_listgen_addr;
 	psaddr_t	thread_active_threads_addr;
 	psaddr_t	thread_keytable_addr;
-	int		thread_inited;
+	psaddr_t	thread_last_event_addr;
+	psaddr_t	thread_event_mask_addr;
+	psaddr_t	thread_bp_create_addr;
+	psaddr_t	thread_bp_death_addr;
 	int		thread_off_dtv;
 	int		thread_off_tlsindex;
 	int		thread_off_attr_flags;
 	int		thread_size_key;
 	int		thread_off_tcb;
 	int		thread_off_linkmap;
-	int		thread_off_thr_locklevel;
 	int		thread_off_next;
 	int		thread_off_state;
-	int		thread_off_isdead;
 	int		thread_off_tid;
 	int		thread_max_keys;
 	int		thread_off_key_allocated;
 	int		thread_off_key_destructor;
+	int		thread_off_report_events;
+	int		thread_off_event_mask;
+	int		thread_off_event_buf;
 	int		thread_state_zoombie;
 	int		thread_state_running;
 	struct pt_map	*map;
@@ -131,7 +136,7 @@
 			              sizeof(struct pt_map) * ta->map_len * 2);
 			if (new == NULL)
 				return (-1);
-			memset(new + ta->map_len, '\0', sizeof(struct pt_map) *
+			memset(new + ta->map_len, 0, sizeof(struct pt_map) *
 			       ta->map_len);
 			first = ta->map_len;
 			ta->map = new;
@@ -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_last_event",	&ta->thread_last_event_addr);
+	LOOKUP_SYM(ph, "_thread_event_mask",	&ta->thread_event_mask_addr);
+	LOOKUP_SYM(ph, "_thread_bp_create",	&ta->thread_bp_create_addr);
+	LOOKUP_SYM(ph, "_thread_bp_death",	&ta->thread_bp_death_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);
@@ -202,15 +211,16 @@
 	LOOKUP_VAL(ph, "_thread_off_tcb",	&ta->thread_off_tcb);
 	LOOKUP_VAL(ph, "_thread_off_tid",	&ta->thread_off_tid);
 	LOOKUP_VAL(ph, "_thread_off_linkmap",	&ta->thread_off_linkmap);
-	LOOKUP_VAL(ph, "_thread_off_thr_locklevel",	&ta->thread_off_thr_locklevel);
 	LOOKUP_VAL(ph, "_thread_off_next",	&ta->thread_off_next);
 	LOOKUP_VAL(ph, "_thread_off_state",	&ta->thread_off_state);
-	LOOKUP_VAL(ph, "_thread_off_isdead",	&ta->thread_off_isdead);
 	LOOKUP_VAL(ph, "_thread_max_keys",	&ta->thread_max_keys);
 	LOOKUP_VAL(ph, "_thread_off_key_allocated", &ta->thread_off_key_allocated);
 	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_report_events", &ta->thread_off_report_events);
+	LOOKUP_VAL(ph, "_thread_off_event_mask", &ta->thread_off_event_mask);
+	LOOKUP_VAL(ph, "_thread_off_event_buf", &ta->thread_off_event_buf);
 	dbg = getpid();
 	/*
 	 * If this fails it probably means we're debugging a core file and
@@ -250,7 +260,8 @@
 	prgregset_t gregs;
 	TAILQ_HEAD(, pthread) thread_list;
 	psaddr_t pt;
-	int ret, isdead;
+	int ret;
+	long lwp;

>>> TRUNCATED FOR MAIL (1000 lines) <<<



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200504121854.j3CIs09K059054>