PERFORCE change 57366 for review
Peter Wemm
peter at FreeBSD.org
Wed Jul 14 16:22:55 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=57366
Change 57366 by peter at peter_melody on 2004/07/14 23:22:27
IFC @57365
Affected files ...
.. //depot/projects/hammer/lib/libpthread/arch/alpha/include/pthread_md.h#4 integrate
.. //depot/projects/hammer/lib/libpthread/arch/amd64/include/pthread_md.h#5 integrate
.. //depot/projects/hammer/lib/libpthread/arch/arm/include/pthread_md.h#2 integrate
.. //depot/projects/hammer/lib/libpthread/arch/i386/include/pthread_md.h#6 integrate
.. //depot/projects/hammer/lib/libpthread/arch/sparc64/include/pthread_md.h#2 integrate
.. //depot/projects/hammer/lib/libpthread/pthread.map#9 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_create.c#15 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_exit.c#8 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_init.c#15 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_kern.c#30 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_priority_queue.c#5 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_private.h#26 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_sig.c#21 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_spec.c#4 integrate
.. //depot/projects/hammer/sbin/geom/core/geom.8#3 integrate
.. //depot/projects/hammer/share/dict/freebsd#3 integrate
.. //depot/projects/hammer/share/man/man4/adw.4#2 integrate
.. //depot/projects/hammer/share/man/man4/amr.4#7 integrate
.. //depot/projects/hammer/share/man/man4/asr.4#6 integrate
.. //depot/projects/hammer/share/man/man4/ed.4#3 integrate
.. //depot/projects/hammer/share/man/man4/my.4#4 integrate
.. //depot/projects/hammer/sys/alpha/alpha/pmap.c#30 integrate
.. //depot/projects/hammer/sys/amd64/amd64/pmap.c#92 integrate
.. //depot/projects/hammer/sys/amd64/include/pmap.h#42 integrate
.. //depot/projects/hammer/sys/arm/arm/pmap.c#5 integrate
.. //depot/projects/hammer/sys/compat/freebsd32/freebsd32_proto.h#20 integrate
.. //depot/projects/hammer/sys/compat/freebsd32/freebsd32_syscall.h#18 integrate
.. //depot/projects/hammer/sys/compat/freebsd32/freebsd32_syscalls.c#18 integrate
.. //depot/projects/hammer/sys/compat/freebsd32/freebsd32_sysent.c#18 integrate
.. //depot/projects/hammer/sys/compat/freebsd32/syscalls.master#22 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_cmbat.c#15 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_pci.c#15 integrate
.. //depot/projects/hammer/sys/dev/fdc/fdc.c#8 integrate
.. //depot/projects/hammer/sys/dev/fdc/fdc_isa.c#3 integrate
.. //depot/projects/hammer/sys/dev/fdc/fdc_pccard.c#3 integrate
.. //depot/projects/hammer/sys/dev/snp/snp.c#11 integrate
.. //depot/projects/hammer/sys/i386/i386/local_apic.c#9 integrate
.. //depot/projects/hammer/sys/kern/kern_descrip.c#27 integrate
.. //depot/projects/hammer/sys/kern/kern_event.c#17 integrate
.. //depot/projects/hammer/sys/kern/kern_module.c#5 integrate
.. //depot/projects/hammer/sys/net/if_sl.c#14 integrate
.. //depot/projects/hammer/sys/net/if_var.h#20 integrate
.. //depot/projects/hammer/sys/netgraph/ng_eiface.c#11 integrate
.. //depot/projects/hammer/sys/netgraph/ng_fec.c#9 integrate
.. //depot/projects/hammer/sys/netgraph/ng_iface.c#12 integrate
.. //depot/projects/hammer/sys/netgraph/ng_ppp.c#7 integrate
.. //depot/projects/hammer/sys/netgraph/ng_pppoe.c#10 integrate
.. //depot/projects/hammer/sys/netgraph/ng_tty.c#6 integrate
.. //depot/projects/hammer/sys/pc98/conf/NOTES#31 integrate
.. //depot/projects/hammer/sys/sys/event.h#4 integrate
.. //depot/projects/hammer/sys/sys/eventvar.h#2 integrate
.. //depot/projects/hammer/sys/ufs/ffs/ffs_vfsops.c#25 integrate
.. //depot/projects/hammer/usr.bin/sed/compile.c#3 integrate
.. //depot/projects/hammer/usr.bin/sed/defs.h#2 integrate
.. //depot/projects/hammer/usr.bin/sed/main.c#4 integrate
.. //depot/projects/hammer/usr.bin/sed/misc.c#4 integrate
.. //depot/projects/hammer/usr.bin/sed/process.c#9 integrate
.. //depot/projects/hammer/usr.bin/sed/sed.1#6 integrate
.. //depot/projects/hammer/usr.bin/tr/cmap.c#2 integrate
.. //depot/projects/hammer/usr.bin/tr/cset.c#2 integrate
.. //depot/projects/hammer/usr.bin/tr/cset.h#2 integrate
.. //depot/projects/hammer/usr.sbin/ppp/radius.c#7 integrate
Differences ...
==== //depot/projects/hammer/lib/libpthread/arch/alpha/include/pthread_md.h#4 (text+ko) ====
@@ -23,7 +23,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/libpthread/arch/alpha/include/pthread_md.h,v 1.3 2003/09/26 06:53:54 marcel Exp $
+ * $FreeBSD: src/lib/libpthread/arch/alpha/include/pthread_md.h,v 1.4 2004/07/13 22:54:22 davidxu Exp $
*/
#ifndef _PTHREAD_MD_H_
@@ -218,14 +218,27 @@
static __inline int
_thread_switch(struct kcb *kcb, struct tcb *tcb, int setmbox)
{
+ extern int _libkse_debug;
+
_tcb_set(kcb, tcb);
- if (setmbox != 0)
- _alpha_restore_context(&tcb->tcb_tmbx.tm_context.uc_mcontext,
- (intptr_t)&tcb->tcb_tmbx,
- (intptr_t *)&kcb->kcb_kmbx.km_curthread);
- else
- _alpha_restore_context(&tcb->tcb_tmbx.tm_context.uc_mcontext,
- 0, NULL);
+ if (_libkse_debug == 0) {
+ tcb->tcb_tmbx.tm_lwp = kcb->kcb_kmbx.km_lwp;
+ if (setmbox != 0)
+ _alpha_restore_context(
+ &tcb->tcb_tmbx.tm_context.uc_mcontext,
+ (intptr_t)&tcb->tcb_tmbx,
+ (intptr_t *)&kcb->kcb_kmbx.km_curthread);
+ else
+ _alpha_restore_context(
+ &tcb->tcb_tmbx.tm_context.uc_mcontext,
+ 0, NULL);
+ } else {
+ if (setmbox)
+ kse_switchin(&tcb->tcb_tmbx, KSE_SWITCHIN_SETTMBX);
+ else
+ kse_switchin(&tcb->tcb_tmbx, 0);
+ }
+
/* We should not reach here. */
return (-1);
}
==== //depot/projects/hammer/lib/libpthread/arch/amd64/include/pthread_md.h#5 (text+ko) ====
@@ -24,7 +24,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/lib/libpthread/arch/amd64/include/pthread_md.h,v 1.5 2003/10/23 06:12:57 peter Exp $
+ * $FreeBSD: src/lib/libpthread/arch/amd64/include/pthread_md.h,v 1.6 2004/07/13 22:54:22 davidxu Exp $
*/
/*
* Machine-dependent thread prototypes/definitions for the thread kernel.
@@ -235,17 +235,31 @@
static __inline int
_thread_switch(struct kcb *kcb, struct tcb *tcb, int setmbox)
{
+ extern int _libkse_debug;
+
if ((kcb == NULL) || (tcb == NULL))
return (-1);
kcb->kcb_curtcb = tcb;
- if (setmbox != 0)
- _amd64_restore_context(&tcb->tcb_tmbx.tm_context.uc_mcontext,
- (intptr_t)&tcb->tcb_tmbx,
- (intptr_t *)&kcb->kcb_kmbx.km_curthread);
- else
- _amd64_restore_context(&tcb->tcb_tmbx.tm_context.uc_mcontext,
- 0, NULL);
- /* We should not reach here. */
+
+ if (_libkse_debug == 0) {
+ tcb->tcb_tmbx.tm_lwp = kcb->kcb_kmbx.km_lwp;
+ if (setmbox != 0)
+ _amd64_restore_context(
+ &tcb->tcb_tmbx.tm_context.uc_mcontext,
+ (intptr_t)&tcb->tcb_tmbx,
+ (intptr_t *)&kcb->kcb_kmbx.km_curthread);
+ else
+ _amd64_restore_context(
+ &tcb->tcb_tmbx.tm_context.uc_mcontext,
+ 0, NULL);
+ /* We should not reach here. */
+ } else {
+ if (setmbox)
+ kse_switchin(&tcb->tcb_tmbx, KSE_SWITCHIN_SETTMBX);
+ else
+ kse_switchin(&tcb->tcb_tmbx, 0);
+ }
+
return (-1);
}
#endif
==== //depot/projects/hammer/lib/libpthread/arch/arm/include/pthread_md.h#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/libpthread/arch/arm/include/pthread_md.h,v 1.1 2004/05/14 12:21:29 cognet Exp $
+ * $FreeBSD: src/lib/libpthread/arch/arm/include/pthread_md.h,v 1.3 2004/07/14 00:58:53 davidxu Exp $
*/
/*
@@ -227,15 +227,25 @@
static __inline int
_thread_switch(struct kcb *kcb, struct tcb *tcb, int setmbox)
{
+ extern int _libkse_debug;
mcontext_t *mc;
_tcb_set(kcb, tcb);
mc = &tcb->tcb_tmbx.tm_context.uc_mcontext;
- if (setmbox)
- _thr_setcontext(mc, (intptr_t)&tcb->tcb_tmbx,
- (intptr_t *)&kcb->kcb_kmbx.km_curthread);
- else
- _thr_setcontext(mc, 0, NULL);
+ if (_libkse_debug == 0) {
+ tcb->tcb_tmbx.tm_lwp = kcb->kcb_kmbx.km_lwp;
+ if (setmbox)
+ _thr_setcontext(mc, (intptr_t)&tcb->tcb_tmbx,
+ (intptr_t *)&kcb->kcb_kmbx.km_curthread);
+ else
+ _thr_setcontext(mc, 0, NULL);
+ } else {
+ if (setmbox)
+ kse_switchin(&tcb->tcb_tmbx, KSE_SWITCHIN_SETTMBX);
+ else
+ kse_switchin(&tcb->tcb_tmbx, 0);
+ }
+
/* We should not reach here. */
return (-1);
}
==== //depot/projects/hammer/lib/libpthread/arch/i386/include/pthread_md.h#6 (text+ko) ====
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/lib/libpthread/arch/i386/include/pthread_md.h,v 1.7 2003/09/19 23:28:13 marcel Exp $
+ * $FreeBSD: src/lib/libpthread/arch/i386/include/pthread_md.h,v 1.8 2004/07/13 22:54:23 davidxu Exp $
*/
/*
* Machine-dependent thread prototypes/definitions for the thread kernel.
@@ -237,15 +237,27 @@
static __inline int
_thread_switch(struct kcb *kcb, struct tcb *tcb, int setmbox)
{
+ extern int _libkse_debug;
+
if ((kcb == NULL) || (tcb == NULL))
return (-1);
kcb->kcb_curtcb = tcb;
- if (setmbox != 0)
- _thr_setcontext(&tcb->tcb_tmbx.tm_context.uc_mcontext,
- (intptr_t)&tcb->tcb_tmbx,
- (intptr_t *)&kcb->kcb_kmbx.km_curthread);
- else
- _thr_setcontext(&tcb->tcb_tmbx.tm_context.uc_mcontext, 0, NULL);
+ if (_libkse_debug == 0) {
+ tcb->tcb_tmbx.tm_lwp = kcb->kcb_kmbx.km_lwp;
+ if (setmbox != 0)
+ _thr_setcontext(&tcb->tcb_tmbx.tm_context.uc_mcontext,
+ (intptr_t)&tcb->tcb_tmbx,
+ (intptr_t *)&kcb->kcb_kmbx.km_curthread);
+ else
+ _thr_setcontext(&tcb->tcb_tmbx.tm_context.uc_mcontext,
+ 0, NULL);
+ } else {
+ if (setmbox)
+ kse_switchin(&tcb->tcb_tmbx, KSE_SWITCHIN_SETTMBX);
+ else
+ kse_switchin(&tcb->tcb_tmbx, 0);
+ }
+
/* We should not reach here. */
return (-1);
}
==== //depot/projects/hammer/lib/libpthread/arch/sparc64/include/pthread_md.h#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/libpthread/arch/sparc64/include/pthread_md.h,v 1.1 2003/10/09 02:32:28 deischen Exp $
+ * $FreeBSD: src/lib/libpthread/arch/sparc64/include/pthread_md.h,v 1.2 2004/07/13 22:54:23 davidxu Exp $
*/
/*
@@ -227,15 +227,25 @@
static __inline int
_thread_switch(struct kcb *kcb, struct tcb *tcb, int setmbox)
{
+ extern int _libkse_debug;
mcontext_t *mc;
_tcb_set(kcb, tcb);
mc = &tcb->tcb_tmbx.tm_context.uc_mcontext;
- if (setmbox)
- _thr_setcontext(mc, (intptr_t)&tcb->tcb_tmbx,
- (intptr_t *)&kcb->kcb_kmbx.km_curthread);
- else
- _thr_setcontext(mc, 0, NULL);
+ if (_libkse_debug == 0) {
+ tcb->tcb_tmbx.tm_lwp = kcb->kcb_kmbx.km_lwp;
+ if (setmbox)
+ _thr_setcontext(mc, (intptr_t)&tcb->tcb_tmbx,
+ (intptr_t *)&kcb->kcb_kmbx.km_curthread);
+ else
+ _thr_setcontext(mc, 0, NULL);
+ } else {
+ if (setmbox)
+ kse_switchin(&tcb->tcb_tmbx, KSE_SWITCHIN_SETTMBX);
+ else
+ kse_switchin(&tcb->tcb_tmbx, 0);
+ }
+
/* We should not reach here. */
return (-1);
}
==== //depot/projects/hammer/lib/libpthread/pthread.map#9 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/lib/libpthread/pthread.map,v 1.10 2004/02/10 05:36:09 deischen Exp $
+# $FreeBSD: src/lib/libpthread/pthread.map,v 1.11 2004/07/13 22:52:53 davidxu Exp $
LIBTHREAD_1_0 {
global:
___creat;
@@ -329,14 +329,11 @@
writev;
# Debugger needs these.
+ _libkse_debug;
+ _thread_activated;
_thread_list;
- _thread_next_offset;
- _thread_uniqueid_offset;
- _thread_state_offset;
- _thread_name_offset;
- _thread_ctx_offset;
- _thread_PS_RUNNING_value;
- _thread_PS_DEAD_value;
+ _thread_keytable;
+ _thread_active_threads;
local:
*;
==== //depot/projects/hammer/lib/libpthread/thread/thr_create.c#15 (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/libpthread/thread/thr_create.c,v 1.54 2004/06/12 07:40:01 davidxu Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_create.c,v 1.55 2004/07/13 22:53:56 davidxu Exp $
*/
#include <errno.h>
#include <stdlib.h>
@@ -44,20 +44,6 @@
#include "thr_private.h"
#include "libc_private.h"
-#define OFF(f) offsetof(struct pthread, f)
-int _thread_next_offset = OFF(tle.tqe_next);
-int _thread_uniqueid_offset = OFF(uniqueid);
-int _thread_state_offset = OFF(state);
-int _thread_name_offset = OFF(name);
-void *_thread_tcb_offset = OFF(tcb);
-#undef OFF
-#define OFF(f) offsetof(struct tcb, f)
-int _thread_ctx_offset = OFF(tcb_tmbx.tm_context);
-#undef OFF
-
-int _thread_PS_RUNNING_value = PS_RUNNING;
-int _thread_PS_DEAD_value = PS_DEAD;
-
static void free_thread(struct pthread *curthread, struct pthread *thread);
static int create_stack(struct pthread_attr *pattr);
static void free_stack(struct pthread_attr *pattr);
==== //depot/projects/hammer/lib/libpthread/thread/thr_exit.c#8 (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/libpthread/thread/thr_exit.c,v 1.35 2003/09/14 22:52:16 davidxu Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_exit.c,v 1.36 2004/07/13 22:49:58 davidxu Exp $
*/
#include <errno.h>
#include <unistd.h>
@@ -125,11 +125,11 @@
curkse = _get_curkse();
KSE_LOCK_ACQUIRE(curkse, &_thread_list_lock);
/* Use thread_list_lock */
- _thr_active_threads--;
+ _thread_active_threads--;
#ifdef SYSTEM_SCOPE_ONLY
- if (_thr_active_threads == 0) {
+ if (_thread_active_threads == 0) {
#else
- if (_thr_active_threads == 1) {
+ if (_thread_active_threads == 1) {
#endif
KSE_LOCK_RELEASE(curkse, &_thread_list_lock);
_kse_critical_leave(crit);
==== //depot/projects/hammer/lib/libpthread/thread/thr_init.c#15 (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/libpthread/thread/thr_init.c,v 1.62 2003/11/29 14:10:02 davidxu Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_init.c,v 1.63 2004/07/13 22:51:03 davidxu Exp $
*/
/* Allocate space for global thread variables here: */
@@ -310,6 +310,12 @@
_thr_signal_init();
_kse_critical_leave(&_thr_initial->tcb->tcb_tmbx);
+ /*
+ * activate threaded mode as soon as possible if we are
+ * being debugged
+ */
+ if (_libkse_debug)
+ _kse_setthreaded(1);
}
/*
==== //depot/projects/hammer/lib/libpthread/thread/thr_kern.c#30 (text+ko) ====
@@ -33,10 +33,11 @@
*
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libpthread/thread/thr_kern.c,v 1.106 2004/04/08 23:16:21 deischen Exp $");
+__FBSDID("$FreeBSD: src/lib/libpthread/thread/thr_kern.c,v 1.107 2004/07/13 22:49:58 davidxu Exp $");
#include <sys/types.h>
#include <sys/kse.h>
+#include <sys/ptrace.h>
#include <sys/signalvar.h>
#include <sys/queue.h>
#include <machine/atomic.h>
@@ -98,7 +99,10 @@
_pq_insert_tail(&(kse)->k_schedq->sq_runq, thrd)
#define KSE_RUNQ_REMOVE(kse, thrd) \
_pq_remove(&(kse)->k_schedq->sq_runq, thrd)
-#define KSE_RUNQ_FIRST(kse) _pq_first(&(kse)->k_schedq->sq_runq)
+#define KSE_RUNQ_FIRST(kse) \
+ ((_libkse_debug == 0) ? \
+ _pq_first(&(kse)->k_schedq->sq_runq) : \
+ _pq_first_debug(&(kse)->k_schedq->sq_runq))
#define KSE_RUNQ_THREADS(kse) ((kse)->k_schedq->sq_runq.pq_threads)
@@ -222,7 +226,7 @@
* dump core.
*/
sigprocmask(SIG_SETMASK, &curthread->sigmask, NULL);
- _thr_active_threads = 1;
+ _thread_active_threads = 1;
/*
* Enter a loop to remove and free all threads other than
@@ -355,7 +359,7 @@
* dump core.
*/
sigprocmask(SIG_SETMASK, &curthread->sigmask, NULL);
- _thr_active_threads = 1;
+ _thread_active_threads = 1;
#endif
}
@@ -435,6 +439,9 @@
PANIC("kse_create() failed\n");
return (-1);
}
+ _thr_initial->tcb->tcb_tmbx.tm_lwp =
+ _kse_initial->k_kcb->kcb_kmbx.km_lwp;
+ _thread_activated = 1;
#ifndef SYSTEM_SCOPE_ONLY
/* Set current thread to initial thread */
@@ -630,6 +637,19 @@
if (curthread->attr.flags & PTHREAD_SCOPE_SYSTEM)
kse_sched_single(&curkse->k_kcb->kcb_kmbx);
else {
+ if (__predict_false(_libkse_debug != 0)) {
+ /*
+ * Because debugger saves single step status in thread
+ * mailbox's tm_dflags, we can safely clear single
+ * step status here. the single step status will be
+ * restored by kse_switchin when the thread is
+ * switched in again. This also lets uts run in full
+ * speed.
+ */
+ ptrace(PT_CLEARSTEP, curkse->k_kcb->kcb_kmbx.km_lwp,
+ (caddr_t) 1, 0);
+ }
+
KSE_SET_SWITCH(curkse);
_thread_enter_uts(curthread->tcb, curkse->k_kcb);
}
@@ -697,7 +717,7 @@
curkse->k_flags |= KF_INITIALIZED;
first = 1;
curthread->active = 1;
-
+
/* Setup kernel signal masks for new thread. */
__sys_sigprocmask(SIG_SETMASK, &curthread->sigmask, NULL);
/*
@@ -972,7 +992,7 @@
*/
if (curthread == NULL)
; /* Nothing to do here. */
- else if ((curthread->need_switchout == 0) &&
+ else if ((curthread->need_switchout == 0) && DBG_CAN_RUN(curthread) &&
(curthread->blocked == 0) && (THR_IN_CRITICAL(curthread))) {
/*
* Resume the thread and tell it to yield when
@@ -992,8 +1012,10 @@
if (ret != 0)
PANIC("Can't resume thread in critical region\n");
}
- else if ((curthread->flags & THR_FLAGS_IN_RUNQ) == 0)
+ else if ((curthread->flags & THR_FLAGS_IN_RUNQ) == 0) {
+ curthread->tcb->tcb_tmbx.tm_lwp = 0;
kse_switchout_thread(curkse, curthread);
+ }
curkse->k_curthread = NULL;
#ifdef DEBUG_THREAD_KERN
@@ -2447,7 +2469,7 @@
*/
thread->uniqueid = next_uniqueid++;
THR_LIST_ADD(thread);
- _thr_active_threads++;
+ _thread_active_threads++;
KSE_LOCK_RELEASE(curkse, &_thread_list_lock);
_kse_critical_leave(crit);
}
@@ -2465,7 +2487,7 @@
curkse = _get_curkse();
KSE_LOCK_ACQUIRE(curkse, &_thread_list_lock);
THR_LIST_REMOVE(thread);
- _thr_active_threads--;
+ _thread_active_threads--;
KSE_LOCK_RELEASE(curkse, &_thread_list_lock);
_kse_critical_leave(crit);
}
@@ -2499,3 +2521,27 @@
return (NULL);
}
+void
+_thr_debug_check_yield(struct pthread *curthread)
+{
+ /*
+ * Note that TMDF_DONOTRUNUSER is set after process is suspended.
+ * When we are being debugged, every suspension in process
+ * will cause all KSEs to schedule an upcall in kernel, unless the
+ * KSE is in critical region.
+ * If the function is being called, it means the KSE is no longer
+ * in critical region, if the TMDF_DONOTRUNUSER is set by debugger
+ * before KSE leaves critical region, we will catch it here, else
+ * if the flag is changed during testing, it also not a problem,
+ * because the change only occurs after a process suspension event
+ * occurs. A suspension event will always cause KSE to schedule an
+ * upcall, in the case, because we are not in critical region,
+ * upcall will be scheduled sucessfully, the flag will be checked
+ * again in kse_sched_multi, we won't back until the flag
+ * is cleared by debugger, the flag will be cleared in next
+ * suspension event.
+ */
+ if ((curthread->attr.flags & PTHREAD_SCOPE_SYSTEM) == 0 &&
+ !DBG_CAN_RUN(curthread))
+ _thr_sched_switch(curthread);
+}
==== //depot/projects/hammer/lib/libpthread/thread/thr_priority_queue.c#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/libpthread/thread/thr_priority_queue.c,v 1.14 2003/04/28 23:56:11 deischen Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_priority_queue.c,v 1.15 2004/07/13 22:49:58 davidxu Exp $
*/
#include <stdlib.h>
#include <sys/queue.h>
@@ -242,6 +242,57 @@
return (pthread);
}
+/*
+ * Select a thread which is allowed to run by debugger, we probably
+ * should merge the function into _pq_first if that function is only
+ * used by scheduler to select a thread.
+ */
+pthread_t
+_pq_first_debug(pq_queue_t *pq)
+{
+ pq_list_t *pql, *pqlnext = NULL;
+ pthread_t pthread = NULL;
+
+ /*
+ * Make some assertions when debugging is enabled:
+ */
+ PQ_ASSERT_INACTIVE(pq, "_pq_first: pq_active");
+ PQ_SET_ACTIVE(pq);
+
+ for (pql = TAILQ_FIRST(&pq->pq_queue);
+ pql != NULL && pthread == NULL; pql = pqlnext) {
+ if ((pthread = TAILQ_FIRST(&pql->pl_head)) == NULL) {
+ /*
+ * The priority list is empty; remove the list
+ * from the queue.
+ */
+ pqlnext = TAILQ_NEXT(pql, pl_link);
+ TAILQ_REMOVE(&pq->pq_queue, pql, pl_link);
+
+ /* Mark the list as not being in the queue: */
+ pql->pl_queued = 0;
+ } else {
+ /*
+ * note there may be a suspension event during this
+ * test, If TMDF_DONOTRUNUSER is set after we tested it,
+ * we will run the thread, this seems be a problem,
+ * fortunatly, when we are being debugged, all context
+ * switch will be done by kse_switchin, that is a
+ * syscall, kse_switchin will check the flag again,
+ * the thread will be returned via upcall, so next
+ * time, UTS won't run the thread.
+ */
+ while (pthread != NULL && !DBG_CAN_RUN(pthread)) {
+ pthread = TAILQ_NEXT(pthread, pqe);
+ }
+ if (pthread == NULL)
+ pqlnext = TAILQ_NEXT(pql, pl_link);
+ }
+ }
+
+ PQ_CLEAR_ACTIVE(pq);
+ return (pthread);
+}
static void
pq_insert_prio_list(pq_queue_t *pq, int prio)
==== //depot/projects/hammer/lib/libpthread/thread/thr_private.h#26 (text+ko) ====
@@ -31,7 +31,7 @@
*
* Private thread definitions for the uthread kernel.
*
- * $FreeBSD: src/lib/libpthread/thread/thr_private.h,v 1.114 2004/06/12 07:40:01 davidxu Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_private.h,v 1.115 2004/07/13 22:49:58 davidxu Exp $
*/
#ifndef _THR_PRIVATE_H
@@ -430,6 +430,7 @@
int prio;
int suspend;
#define THR_STACK_USER 0x100 /* 0xFF reserved for <pthread.h> */
+#define THR_SIGNAL_THREAD 0x200 /* This is a signal thread */
int flags;
void *arg_attr;
void (*cleanup_attr) ();
@@ -582,15 +583,19 @@
int seqno;
};
+struct pthread_key {
+ volatile int allocated;
+ volatile int count;
+ int seqno;
+ void (*destructor) (void *);
+};
#define MAX_THR_LOCKLEVEL 5
/*
* Thread structure.
*/
struct pthread {
- /*
- * Thread mailbox is first so it cal be aligned properly.
- */
+ /* Thread control block */
struct tcb *tcb;
/*
@@ -816,12 +821,14 @@
#define THR_YIELD_CHECK(thrd) \
do { \
- if (((thrd)->critical_yield != 0) && \
- !(THR_IN_CRITICAL(thrd))) \
- _thr_sched_switch(thrd); \
- else if (((thrd)->check_pending != 0) && \
- !(THR_IN_CRITICAL(thrd))) \
- _thr_sig_check_pending(thrd); \
+ if (!THR_IN_CRITICAL(thrd)) { \
+ if (__predict_false(_libkse_debug)) \
+ _thr_debug_check_yield(thrd); \
+ if ((thrd)->critical_yield != 0) \
+ _thr_sched_switch(thrd); \
+ if ((thrd)->check_pending != 0) \
+ _thr_sig_check_pending(thrd); \
+ } \
} while (0)
#define THR_LOCK_ACQUIRE(thrd, lck) \
@@ -882,8 +889,6 @@
_pq_insert_tail(&(thrd)->kseg->kg_schedq.sq_runq, thrd)
#define THR_RUNQ_REMOVE(thrd) \
_pq_remove(&(thrd)->kseg->kg_schedq.sq_runq, thrd)
-#define THR_RUNQ_FIRST(thrd) \
- _pq_first(&(thrd)->kseg->kg_schedq.sq_runq)
/*
* Macros to insert/remove threads to the all thread list and
@@ -964,6 +969,8 @@
(((thrd)->state == PS_SUSPENDED) || \
(((thrd)->flags & THR_FLAGS_SUSPENDED) != 0))
#define THR_IS_EXITING(thrd) (((thrd)->flags & THR_FLAGS_EXITING) != 0)
+#define DBG_CAN_RUN(thrd) (((thrd)->tcb->tcb_tmbx.tm_dflags & \
+ TMDF_DONOTRUNUSER) == 0)
extern int __isthreaded;
@@ -980,6 +987,9 @@
SCLASS void *_usrstack SCLASS_PRESET(NULL);
SCLASS struct kse *_kse_initial SCLASS_PRESET(NULL);
SCLASS struct pthread *_thr_initial SCLASS_PRESET(NULL);
+/* For debugger */
+SCLASS int _libkse_debug SCLASS_PRESET(0);
+SCLASS int _thread_activated SCLASS_PRESET(0);
/* List of all threads: */
SCLASS TAILQ_HEAD(, pthread) _thread_list
@@ -989,7 +999,7 @@
SCLASS TAILQ_HEAD(, pthread) _thread_gc_list
SCLASS_PRESET(TAILQ_HEAD_INITIALIZER(_thread_gc_list));
-SCLASS int _thr_active_threads SCLASS_PRESET(1);
+SCLASS int _thread_active_threads SCLASS_PRESET(1);
SCLASS TAILQ_HEAD(atfork_head, pthread_atfork) _thr_atfork_list;
SCLASS pthread_mutex_t _thr_atfork_mutex;
@@ -1079,6 +1089,7 @@
void _pq_insert_head(struct pq_queue *pq, struct pthread *);
void _pq_insert_tail(struct pq_queue *pq, struct pthread *);
struct pthread *_pq_first(struct pq_queue *pq);
+struct pthread *_pq_first_debug(struct pq_queue *pq);
void *_pthread_getspecific(pthread_key_t);
int _pthread_key_create(pthread_key_t *, void (*) (void *));
int _pthread_key_delete(pthread_key_t);
@@ -1150,6 +1161,7 @@
struct pthread *_thr_hash_find(struct pthread *);
void _thr_finish_cancellation(void *arg);
int _thr_sigonstack(void *sp);
+void _thr_debug_check_yield(struct pthread *);
/*
* Aliases for _pthread functions. Should be called instead of
==== //depot/projects/hammer/lib/libpthread/thread/thr_sig.c#21 (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/libpthread/thread/thr_sig.c,v 1.78 2004/06/12 07:40:01 davidxu Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_sig.c,v 1.79 2004/07/13 22:52:11 davidxu Exp $
*/
#include <sys/param.h>
#include <sys/types.h>
@@ -232,6 +232,7 @@
pthread_sigmask(SIG_SETMASK, &sigset, &oldset);
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
+ attr->flags |= THR_SIGNAL_THREAD;
/* sigmask will be inherited */
if (pthread_create(&_thr_sig_daemon, &attr, sig_daemon, NULL))
PANIC("can not create signal daemon thread!\n");
@@ -347,6 +348,11 @@
err_save = errno;
timeout_save = curthread->timeout;
intr_save = curthread->interrupted;
+ /* Check if the signal requires a dump of thread information: */
+ if (sig == SIGINFO) {
+ /* Dump thread information to file: */
+ _thread_dump_info();
+ }
_kse_critical_enter();
/* Get a fresh copy of signal mask */
__sys_sigprocmask(SIG_BLOCK, NULL, &curthread->sigmask);
@@ -505,6 +511,12 @@
{
_kse_critical_leave(&curthread->tcb->tcb_tmbx);
+ /* Check if the signal requires a dump of thread information: */
+ if (shi->sig == SIGINFO) {
+ /* Dump thread information to file: */
+ _thread_dump_info();
+ }
+
if (((__sighandler_t *)shi->sigfunc != SIG_DFL) &&
((__sighandler_t *)shi->sigfunc != SIG_IGN)) {
if ((shi->sa_flags & SA_SIGINFO) != 0 || shi->info == NULL)
@@ -695,12 +707,18 @@
kse_wakeup(kmbx);
return (NULL);
} else if (!SIGISMEMBER(pthread->sigmask, sig)) {
- sigfunc = _thread_sigact[sig - 1].sa_sigaction;
- if ((__sighandler_t *)sigfunc == SIG_DFL) {
- if (sigprop(sig) & SA_KILL) {
- kse_thr_interrupt(NULL,
- KSE_INTR_SIGEXIT, sig);
- /* Never reach */
+ /*
+ * If debugger is running, we don't quick exit,
+ * and give it a chance to check the signal.
+ */
+ if (_libkse_debug == 0) {
+ sigfunc = _thread_sigact[sig - 1].sa_sigaction;
+ if ((__sighandler_t *)sigfunc == SIG_DFL) {
+ if (sigprop(sig) & SA_KILL) {
+ kse_thr_interrupt(NULL,
+ KSE_INTR_SIGEXIT, sig);
+ /* Never reach */
+ }
}
}
if (pthread->state == PS_SIGSUSPEND) {
@@ -1198,13 +1216,8 @@
__sys_sigprocmask(SIG_SETMASK, &sigset, &_thr_initial->sigmask);
/* Enter a loop to get the existing signal status: */
for (i = 1; i <= _SIG_MAXSIG; i++) {
- /* Check for signals which cannot be trapped: */
- if (i == SIGKILL || i == SIGSTOP) {
- }
-
/* Get the signal handler details: */
- else if (__sys_sigaction(i, NULL,
- &_thread_sigact[i - 1]) != 0) {
+ if (__sys_sigaction(i, NULL, &_thread_sigact[i - 1]) != 0) {
/*
* Abort this process if signal
* initialisation fails:
==== //depot/projects/hammer/lib/libpthread/thread/thr_spec.c#4 (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/libpthread/thread/thr_spec.c,v 1.21 2003/08/20 02:34:14 deischen Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_spec.c,v 1.22 2004/07/13 22:49:58 davidxu Exp $
*/
#include <signal.h>
#include <stdlib.h>
@@ -38,15 +38,8 @@
#include <pthread.h>
#include "thr_private.h"
-struct pthread_key {
- volatile int allocated;
- volatile int count;
- int seqno;
- void (*destructor) ();
-};
-
/* Static variables: */
-static struct pthread_key key_table[PTHREAD_KEYS_MAX];
+struct pthread_key _thread_keytable[PTHREAD_KEYS_MAX];
__weak_reference(_pthread_key_create, pthread_key_create);
__weak_reference(_pthread_key_delete, pthread_key_delete);
@@ -64,10 +57,10 @@
THR_LOCK_ACQUIRE(curthread, &_keytable_lock);
for (i = 0; i < PTHREAD_KEYS_MAX; i++) {
- if (key_table[i].allocated == 0) {
- key_table[i].allocated = 1;
- key_table[i].destructor = destructor;
- key_table[i].seqno++;
+ if (_thread_keytable[i].allocated == 0) {
+ _thread_keytable[i].allocated = 1;
+ _thread_keytable[i].destructor = destructor;
+ _thread_keytable[i].seqno++;
/* Unlock the key table: */
THR_LOCK_RELEASE(curthread, &_keytable_lock);
@@ -91,8 +84,8 @@
/* Lock the key table: */
THR_LOCK_ACQUIRE(curthread, &_keytable_lock);
- if (key_table[key].allocated)
- key_table[key].allocated = 0;
+ if (_thread_keytable[key].allocated)
+ _thread_keytable[key].allocated = 0;
else
ret = EINVAL;
@@ -123,13 +116,13 @@
(curthread->specific_data_count > 0); key++) {
destructor = NULL;
- if (key_table[key].allocated &&
+ if (_thread_keytable[key].allocated &&
(curthread->specific[key].data != NULL)) {
if (curthread->specific[key].seqno ==
- key_table[key].seqno) {
+ _thread_keytable[key].seqno) {
data = (void *)
curthread->specific[key].data;
- destructor = key_table[key].destructor;
+ destructor = _thread_keytable[key].destructor;
}
curthread->specific[key].data = NULL;
curthread->specific_data_count--;
@@ -185,7 +178,7 @@
if ((pthread->specific) ||
(pthread->specific = pthread_key_allocate_data())) {
if ((unsigned int)key < PTHREAD_KEYS_MAX) {
- if (key_table[key].allocated) {
+ if (_thread_keytable[key].allocated) {
if (pthread->specific[key].data == NULL) {
if (value != NULL)
pthread->specific_data_count++;
@@ -193,7 +186,7 @@
pthread->specific_data_count--;
pthread->specific[key].data = value;
pthread->specific[key].seqno =
- key_table[key].seqno;
+ _thread_keytable[key].seqno;
ret = 0;
} else
ret = EINVAL;
@@ -216,8 +209,8 @@
/* Check if there is specific data: */
if (pthread->specific != NULL && (unsigned int)key < PTHREAD_KEYS_MAX) {
/* Check if this key has been used before: */
- if (key_table[key].allocated &&
- (pthread->specific[key].seqno == key_table[key].seqno)) {
+ if (_thread_keytable[key].allocated &&
+ (pthread->specific[key].seqno == _thread_keytable[key].seqno)) {
/* Return the value: */
data = (void *) pthread->specific[key].data;
} else {
==== //depot/projects/hammer/sbin/geom/core/geom.8#3 (text+ko) ====
@@ -22,7 +22,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD: src/sbin/geom/core/geom.8,v 1.2 2004/07/07 21:00:57 ru Exp $
+.\" $FreeBSD: src/sbin/geom/core/geom.8,v 1.3 2004/07/14 13:32:00 pjd Exp $
.\"
.Dd May 21, 2004
.Dt GEOM 8
@@ -111,6 +111,7 @@
.Sh SEE ALSO
.Xr geom 4 ,
.Xr gconcat 8 ,
+.Xr glabel 8 ,
.Xr gnop 8 ,
.Xr gstripe 8
.Sh HISTORY
==== //depot/projects/hammer/share/dict/freebsd#3 (text+ko) ====
@@ -1,15 +1,30 @@
-$FreeBSD: src/share/dict/freebsd,v 1.6 2003/04/20 21:36:12 murray Exp $
+$FreeBSD: src/share/dict/freebsd,v 1.9 2004/07/14 07:10:15 murray Exp $
ABI
+ACL
ACPI
+ADSL
+AGP
AMD
+API
+APIC
+ATAPI
+ATX
+AVI
AXP
+AfterStep
AlphaBIOS
Appletalk
+Athlon
+BIBA
BOFs
+BOOTP
BSDCon
BSDi
Barnes
+BeOS
+Bluetooth
Border's
+Broadcom
CDROM
CDROMs
CDs
@@ -25,11 +40,19 @@
DEVBUF
DNS
DTD
+DVD
+DVI
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list