Date: Fri, 16 May 2003 18:51:21 -0700 (PDT) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 31364 for review Message-ID: <200305170151.h4H1pLdP004587@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=31364 Change 31364 by marcel@marcel_nfs on 2003/05/16 18:50:42 IFC @31361 Affected files ... .. //depot/projects/ia64/bin/chflags/chflags.1#3 integrate .. //depot/projects/ia64/bin/pwd/pwd.1#7 integrate .. //depot/projects/ia64/bin/sh/sh.1#22 integrate .. //depot/projects/ia64/games/caesar/caesar.6#3 integrate .. //depot/projects/ia64/games/grdc/grdc.6#4 integrate .. //depot/projects/ia64/lib/libc/ia64/sys/brk.S#5 integrate .. //depot/projects/ia64/lib/libc/ia64/sys/pipe.S#3 integrate .. //depot/projects/ia64/lib/libc/ia64/sys/sbrk.S#6 integrate .. //depot/projects/ia64/lib/libkvm/kvm_ia64.c#3 integrate .. //depot/projects/ia64/lib/libpthread/sys/lock.c#3 integrate .. //depot/projects/ia64/lib/libpthread/sys/lock.h#3 integrate .. //depot/projects/ia64/lib/libpthread/thread/thr_cond.c#7 integrate .. //depot/projects/ia64/lib/libpthread/thread/thr_exit.c#4 integrate .. //depot/projects/ia64/lib/libpthread/thread/thr_init.c#9 integrate .. //depot/projects/ia64/lib/libpthread/thread/thr_join.c#4 integrate .. //depot/projects/ia64/lib/libpthread/thread/thr_kern.c#15 integrate .. //depot/projects/ia64/lib/libpthread/thread/thr_mutex.c#4 integrate .. //depot/projects/ia64/lib/libpthread/thread/thr_nanosleep.c#4 integrate .. //depot/projects/ia64/lib/libpthread/thread/thr_private.h#12 integrate .. //depot/projects/ia64/lib/libpthread/thread/thr_sig.c#8 integrate .. //depot/projects/ia64/lib/libpthread/thread/thr_sigsuspend.c#4 integrate .. //depot/projects/ia64/lib/libpthread/thread/thr_sigwait.c#5 integrate .. //depot/projects/ia64/lib/libpthread/thread/thr_yield.c#4 integrate .. //depot/projects/ia64/libexec/ftpd/ftpd.8#12 integrate .. //depot/projects/ia64/libexec/rtld-elf/rtld.1#7 integrate .. //depot/projects/ia64/release/scripts/doFS.sh#16 integrate .. //depot/projects/ia64/sbin/sysctl/sysctl.8#8 integrate .. //depot/projects/ia64/share/man/man9/CTASSERT.9#1 branch .. //depot/projects/ia64/share/man/man9/KASSERT.9#3 integrate .. //depot/projects/ia64/share/man/man9/Makefile#22 integrate .. //depot/projects/ia64/share/man/man9/VFS_SET.9#4 integrate .. //depot/projects/ia64/share/man/man9/byteorder.9#4 integrate .. //depot/projects/ia64/share/man/man9/mbuf.9#9 integrate .. //depot/projects/ia64/share/man/man9/rman.9#1 branch .. //depot/projects/ia64/share/man/man9/sleep.9#7 integrate .. //depot/projects/ia64/sys/boot/i386/libi386/amd64_tramp.S#2 integrate .. //depot/projects/ia64/sys/conf/Makefile.ia64#18 integrate .. //depot/projects/ia64/sys/conf/files.ia64#40 integrate .. //depot/projects/ia64/sys/conf/options.ia64#13 integrate .. //depot/projects/ia64/sys/dev/md/md.c#28 integrate .. //depot/projects/ia64/sys/ia64/ia32/ia32_sysvec.c#6 integrate .. //depot/projects/ia64/sys/ia64/ia32/ia32_util.h#5 integrate .. //depot/projects/ia64/sys/ia64/ia64/db_interface.c#10 integrate .. //depot/projects/ia64/sys/ia64/ia64/db_trace.c#10 integrate .. //depot/projects/ia64/sys/ia64/ia64/elf_machdep.c#10 integrate .. //depot/projects/ia64/sys/ia64/ia64/exception.s#21 integrate .. //depot/projects/ia64/sys/ia64/ia64/genassym.c#12 integrate .. //depot/projects/ia64/sys/ia64/ia64/interrupt.c#28 integrate .. //depot/projects/ia64/sys/ia64/ia64/locore.s#15 integrate .. //depot/projects/ia64/sys/ia64/ia64/machdep.c#68 integrate .. //depot/projects/ia64/sys/ia64/ia64/mp_machdep.c#32 integrate .. //depot/projects/ia64/sys/ia64/ia64/pmap.c#61 integrate .. //depot/projects/ia64/sys/ia64/ia64/support.s#7 integrate .. //depot/projects/ia64/sys/ia64/ia64/trap.c#50 integrate .. //depot/projects/ia64/sys/ia64/ia64/unaligned.c#2 integrate .. //depot/projects/ia64/sys/ia64/ia64/unwind.c#6 integrate .. //depot/projects/ia64/sys/ia64/ia64/vm_machdep.c#23 integrate .. //depot/projects/ia64/sys/ia64/include/asm.h#9 integrate .. //depot/projects/ia64/sys/ia64/include/cpu.h#12 integrate .. //depot/projects/ia64/sys/ia64/include/db_machdep.h#6 integrate .. //depot/projects/ia64/sys/ia64/include/frame.h#4 integrate .. //depot/projects/ia64/sys/ia64/include/pcb.h#8 integrate .. //depot/projects/ia64/sys/ia64/include/proc.h#5 integrate .. //depot/projects/ia64/sys/ia64/include/reg.h#9 integrate .. //depot/projects/ia64/sys/ia64/include/signal.h#7 integrate .. //depot/projects/ia64/sys/ia64/include/smp.h#4 integrate .. //depot/projects/ia64/sys/ia64/include/ucontext.h#2 integrate .. //depot/projects/ia64/sys/ia64/include/unwind.h#3 integrate .. //depot/projects/ia64/sys/ia64/include/vmparam.h#8 integrate .. //depot/projects/ia64/sys/kern/kern_synch.c#36 integrate .. //depot/projects/ia64/sys/kern/kern_thr.c#6 integrate .. //depot/projects/ia64/sys/kern/kern_thread.c#45 integrate .. //depot/projects/ia64/sys/kern/vfs_subr.c#48 integrate .. //depot/projects/ia64/sys/sys/proc.h#65 integrate .. //depot/projects/ia64/tools/tools/tinderbox/Makefile#4 integrate .. //depot/projects/ia64/tools/tools/tinderbox/tbmaster.1#1 branch .. //depot/projects/ia64/tools/tools/tinderbox/tbmaster.pl#9 integrate .. //depot/projects/ia64/tools/tools/tinderbox/tinderbox.1#1 branch .. //depot/projects/ia64/tools/tools/tinderbox/tinderbox.pl#8 integrate .. //depot/projects/ia64/usr.bin/truss/ia64-fbsd.c#3 integrate Differences ... ==== //depot/projects/ia64/bin/chflags/chflags.1#3 (text+ko) ==== @@ -33,9 +33,9 @@ .\" SUCH DAMAGE. .\" .\" @(#)chflags.1 8.4 (Berkeley) 5/2/95 -.\" $FreeBSD: src/bin/chflags/chflags.1,v 1.16 2003/03/24 20:15:58 johan Exp $ +.\" $FreeBSD: src/bin/chflags/chflags.1,v 1.17 2003/05/16 21:18:01 ru Exp $ .\" -.Dd Mar 24, 2003 +.Dd March 24, 2003 .Dt CHFLAGS 1 .Os .Sh NAME ==== //depot/projects/ia64/bin/pwd/pwd.1#7 (text+ko) ==== @@ -33,7 +33,7 @@ .\" SUCH DAMAGE. .\" .\" @(#)pwd.1 8.2 (Berkeley) 4/28/95 -.\" $FreeBSD: src/bin/pwd/pwd.1,v 1.21 2003/04/12 03:22:54 tjr Exp $ +.\" $FreeBSD: src/bin/pwd/pwd.1,v 1.22 2003/05/16 21:19:32 ru Exp $ .\" .Dd April 12, 2003 .Dt PWD 1 @@ -43,7 +43,7 @@ .Nd return working directory name .Sh SYNOPSIS .Nm -.Oo Fl L | Fl P Oc +.Op Fl L | P .Sh DESCRIPTION The .Nm ==== //depot/projects/ia64/bin/sh/sh.1#22 (text+ko) ==== @@ -33,7 +33,7 @@ .\" SUCH DAMAGE. .\" .\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95 -.\" $FreeBSD: src/bin/sh/sh.1,v 1.86 2003/04/30 19:18:50 schweikh Exp $ +.\" $FreeBSD: src/bin/sh/sh.1,v 1.87 2003/05/16 21:19:32 ru Exp $ .\" .Dd April 12, 2003 .Dt SH 1 @@ -1295,7 +1295,7 @@ List or alter key bindings for the line editor. This command is documented in .Xr editrc 5 . -.It Ic cd Oo Fl L | Fl P Oc Op Ar directory +.It Ic cd Oo Fl L | P Oc Op Ar directory Switch to the specified .Ar directory , or to the directory specified in the @@ -1626,7 +1626,7 @@ If the .Fl s option is specified, only the PIDs of the jobs are printed, one per line. -.It Ic pwd Oo Fl L | Fl P Oc +.It Ic pwd Op Fl L | P Print the path of the current directory. The built-in command may differ from the program of the same name because the built-in command remembers what the current directory ==== //depot/projects/ia64/games/caesar/caesar.6#3 (text+ko) ==== @@ -30,13 +30,13 @@ .\" SUCH DAMAGE. .\" .\" @(#)caesar.6 8.2 (Berkeley) 11/16/93 -.\" $FreeBSD: src/games/caesar/caesar.6,v 1.8 2003/03/24 11:18:30 tjr Exp $ +.\" $FreeBSD: src/games/caesar/caesar.6,v 1.9 2003/05/16 21:26:39 ru Exp $ .\" .Dd November 16, 1993 .Dt CAESAR 6 .Os .Sh NAME -.Nm caesar +.Nm caesar , rot13 .Nd decrypt caesar ciphers .Sh SYNOPSIS .Nm ==== //depot/projects/ia64/games/grdc/grdc.6#4 (text+ko) ==== @@ -1,4 +1,4 @@ -.\" $FreeBSD: src/games/grdc/grdc.6,v 1.5 2003/03/28 16:37:45 mux Exp $ +.\" $FreeBSD: src/games/grdc/grdc.6,v 1.6 2003/05/16 21:27:23 ru Exp $ .Dd September 25, 2001 .Dt GRDC 6 .Os @@ -7,8 +7,7 @@ .Nd grand digital clock (curses) .Sh SYNOPSIS .Nm -.Op Fl s -.Op Fl t +.Op Fl st .Op Ar n .Sh DESCRIPTION .Nm ==== //depot/projects/ia64/lib/libc/ia64/sys/brk.S#5 (text+ko) ==== @@ -28,7 +28,7 @@ */ #include <machine/asm.h> -__FBSDID("$FreeBSD: src/lib/libc/ia64/sys/brk.S,v 1.3 2003/03/03 01:09:46 obrien Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/ia64/sys/brk.S,v 1.4 2003/05/16 21:26:39 marcel Exp $"); #include "SYS.h" @@ -44,12 +44,14 @@ add r14=@ltoff(minbrk),gp ;; ld8 r14=[r14] ;; ld8 r14=[r14] ;; - cmp.ltu p6,p0=in0,r14 ;; -(p6) mov in0=r14 + cmp.ltu p6,p0=r32,r14 ;; +(p6) mov r32=r14 ;; + st8 [sp]=r32 CALLSYS_ERROR(break) + ld8 r15=[sp] add r14=@ltoff(curbrk),gp ;; ld8 r14=[r14] ;; - st8 [r14]=in0 + st8 [r14]=r15 mov ret0=0 br.ret.sptk.few rp END(brk) ==== //depot/projects/ia64/lib/libc/ia64/sys/pipe.S#3 (text+ko) ==== @@ -28,14 +28,20 @@ */ #include <machine/asm.h> -__FBSDID("$FreeBSD: src/lib/libc/ia64/sys/pipe.S,v 1.3 2003/03/03 01:09:46 obrien Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/ia64/sys/pipe.S,v 1.4 2003/05/16 21:26:39 marcel Exp $"); #include "SYS.h" -SYSCALL(pipe) - .regstk 1,0,0,0 - st4 [in0]=ret0,4 ;; - st4 [in0]=ret1 - mov ret0=0 +ENTRY(__sys_pipe, 1) + WEAK_ALIAS(pipe, __sys_pipe) + WEAK_ALIAS(_pipe, __sys_pipe) + st8 [sp]=r32 + CALLSYS_ERROR(pipe) + ld8 r14=[sp] + ;; + st4 [r14]=ret0,4 + ;; + st4 [r14]=ret1 + mov ret0=0 br.ret.sptk.few rp -END(pipe) +END(__sys_pipe) ==== //depot/projects/ia64/lib/libc/ia64/sys/sbrk.S#6 (text+ko) ==== @@ -28,7 +28,7 @@ */ #include <machine/asm.h> -__FBSDID("$FreeBSD: src/lib/libc/ia64/sys/sbrk.S,v 1.4 2003/03/03 01:09:46 obrien Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/ia64/sys/sbrk.S,v 1.5 2003/05/16 21:26:39 marcel Exp $"); #include "SYS.h" @@ -43,18 +43,21 @@ add r14 = @ltoff(curbrk), gp ;; ld8 r14 = [r14] - cmp.eq p6, p0 = in0, r0 + cmp.eq p6, p0 = r32, r0 ;; ld8 ret0 = [r14] (p6) br.ret.sptk.few rp ;; - add in0 = ret0, in0 + add r32 = ret0, r32 + ;; + st8 [sp] = r32 CALLSYS_ERROR(break) + ld8 r15 = [sp] add r14 = @ltoff(curbrk), gp ;; ld8 r14 = [r14] ;; ld8 ret0 = [r14] - st8 [r14] = in0 + st8 [r14] = r15 br.ret.sptk.few rp END(sbrk) ==== //depot/projects/ia64/lib/libkvm/kvm_ia64.c#3 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/lib/libkvm/kvm_ia64.c,v 1.3 2002/10/21 04:21:12 marcel Exp $ */ +/* $FreeBSD: src/lib/libkvm/kvm_ia64.c,v 1.4 2003/05/16 21:26:40 marcel Exp $ */ /* $NetBSD: kvm_alpha.c,v 1.7.2.1 1997/11/02 20:34:26 mellon Exp $ */ /* @@ -148,7 +148,7 @@ * addresses/values. */ - nlist[0].n_name = "kptdir"; + nlist[0].n_name = "ia64_kptdir"; nlist[1].n_name = 0; if (kvm_nlist(kd, nlist) != 0) { ==== //depot/projects/ia64/lib/libpthread/sys/lock.c#3 (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/sys/lock.c,v 1.3 2003/05/04 22:29:09 deischen Exp $ + * $FreeBSD: src/lib/libpthread/sys/lock.c,v 1.4 2003/05/16 19:58:29 deischen Exp $ */ #include <sys/types.h> @@ -65,7 +65,7 @@ lck->l_head->lr_watcher = NULL; lck->l_head->lr_owner = NULL; lck->l_head->lr_waiting = 0; - lck->l_head->lr_handshake = 0; + lck->l_head->lr_active = 1; lck->l_tail = lck->l_head; } return (0); @@ -85,7 +85,7 @@ lu->lu_myreq->lr_watcher = NULL; lu->lu_myreq->lr_owner = lu; lu->lu_myreq->lr_waiting = 0; - lu->lu_myreq->lr_handshake = 0; + lu->lu_myreq->lr_active = 0; lu->lu_watchreq = NULL; lu->lu_priority = 0; lu->lu_private = priv; @@ -166,19 +166,16 @@ for (i = 0; i < MAX_SPINS; i++) { if (lu->lu_watchreq->lr_locked == 0) return; + if (lu->lu_watchreq->lr_active == 0) + break; } atomic_store_rel_long(&lu->lu_watchreq->lr_waiting, 1); while (lu->lu_watchreq->lr_locked != 0) lck->l_wait(lck, lu); atomic_store_rel_long(&lu->lu_watchreq->lr_waiting, 0); - /* - * Wait for original owner to stop accessing the - * lockreq object. - */ - while (lu->lu_watchreq->lr_handshake) - ; } } + lu->lu_myreq->lr_active = 1; } /* @@ -240,24 +237,21 @@ } } if (lu_h != NULL) { - lu_h->lu_watchreq->lr_handshake = 1; /* Give the lock to the highest priority user. */ - atomic_store_rel_long(&lu_h->lu_watchreq->lr_locked, 0); if ((lu_h->lu_watchreq->lr_waiting != 0) && (lck->l_wakeup != NULL)) /* Notify the sleeper */ lck->l_wakeup(lck, lu_h->lu_myreq->lr_watcher); - atomic_store_rel_long(&lu_h->lu_watchreq->lr_handshake, - 0); + else + atomic_store_rel_long(&lu_h->lu_watchreq->lr_locked, 0); } else { - myreq->lr_handshake = 1; - /* Give the lock to the previous request. */ - atomic_store_rel_long(&myreq->lr_locked, 0); if ((myreq->lr_waiting != 0) && (lck->l_wakeup != NULL)) /* Notify the sleeper */ lck->l_wakeup(lck, myreq->lr_watcher); - atomic_store_rel_long(&myreq->lr_handshake, 0); + else + /* Give the lock to the previous request. */ + atomic_store_rel_long(&myreq->lr_locked, 0); } } else { /* @@ -270,19 +264,25 @@ lu->lu_watchreq = NULL; lu->lu_myreq->lr_locked = 1; lu->lu_myreq->lr_waiting = 0; - if (lck->l_wakeup) { - /* Start wakeup */ - myreq->lr_handshake = 1; + if (myreq->lr_waiting != 0 && lck->l_wakeup) + /* Notify the sleeper */ + lck->l_wakeup(lck, myreq->lr_watcher); + else /* Give the lock to the previous request. */ atomic_store_rel_long(&myreq->lr_locked, 0); - if (myreq->lr_waiting != 0) { - /* Notify the sleeper */ - lck->l_wakeup(lck, myreq->lr_watcher); - } - /* Stop wakeup */ - atomic_store_rel_long(&myreq->lr_handshake, 0); - } else { - atomic_store_rel_long(&myreq->lr_locked, 0); - } } + lu->lu_myreq->lr_active = 0; +} + +void +_lock_grant(struct lock *lck /* unused */, struct lockuser *lu) +{ + atomic_store_rel_long(&lu->lu_watchreq->lr_locked, 0); } + +void +_lockuser_setactive(struct lockuser *lu, int active) +{ + lu->lu_myreq->lr_active = active; +} + ==== //depot/projects/ia64/lib/libpthread/sys/lock.h#3 (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/sys/lock.h,v 1.3 2003/05/04 22:29:09 deischen Exp $ + * $FreeBSD: src/lib/libpthread/sys/lock.h,v 1.4 2003/05/16 19:58:29 deischen Exp $ */ #ifndef _LOCK_H_ @@ -55,7 +55,7 @@ struct lockuser *lr_watcher; /* only used for priority locks */ struct lockuser *lr_owner; /* only used for priority locks */ long lr_waiting; /* non-zero when wakeup needed */ - volatile long lr_handshake; /* non-zero when wakeup in progress */ + volatile int lr_active; /* non-zero if the lock is last lock for thread */ }; struct lockuser { @@ -72,6 +72,7 @@ #define _LCK_REQUEST_INITIALIZER { 0, NULL, NULL, 0 } #define _LCK_BUSY(lu) ((lu)->lu_watchreq->lr_locked != 0) +#define _LCK_ACTIVE(lu) ((lu)->lu_watchreq->lr_active != 0) #define _LCK_GRANTED(lu) ((lu)->lu_watchreq->lr_locked == 0) #define _LCK_SET_PRIVATE(lu, p) (lu)->lu_private = (void *)(p) @@ -84,7 +85,9 @@ lock_handler_t *, lock_handler_t *); int _lockuser_init(struct lockuser *lu, void *priv); void _lockuser_destroy(struct lockuser *lu); +void _lockuser_setactive(struct lockuser *lu, int active); void _lock_acquire(struct lock *, struct lockuser *, int); void _lock_release(struct lock *, struct lockuser *); +void _lock_grant(struct lock *, struct lockuser *); #endif ==== //depot/projects/ia64/lib/libpthread/thread/thr_cond.c#7 (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_cond.c,v 1.39 2003/05/02 11:39:00 davidxu Exp $ + * $FreeBSD: src/lib/libpthread/thread/thr_cond.c,v 1.40 2003/05/16 19:58:29 deischen Exp $ */ #include <stdlib.h> #include <errno.h> @@ -267,11 +267,12 @@ * lock); we should be able to safely * set the state. */ - THR_LOCK_SWITCH(curthread); + THR_SCHED_LOCK(curthread, curthread); THR_SET_STATE(curthread, PS_COND_WAIT); /* Remember the CV: */ curthread->data.cond = *cond; + THR_SCHED_UNLOCK(curthread, curthread); /* Unlock the CV structure: */ THR_LOCK_RELEASE(curthread, @@ -281,7 +282,6 @@ _thr_sched_switch(curthread); curthread->data.cond = NULL; - THR_UNLOCK_SWITCH(curthread); /* * XXX - This really isn't a good check @@ -479,11 +479,12 @@ * lock); we should be able to safely * set the state. */ - THR_LOCK_SWITCH(curthread); + THR_SCHED_LOCK(curthread, curthread); THR_SET_STATE(curthread, PS_COND_WAIT); /* Remember the CV: */ curthread->data.cond = *cond; + THR_SCHED_UNLOCK(curthread, curthread); /* Unlock the CV structure: */ THR_LOCK_RELEASE(curthread, @@ -493,7 +494,6 @@ _thr_sched_switch(curthread); curthread->data.cond = NULL; - THR_UNLOCK_SWITCH(curthread); /* * XXX - This really isn't a good check ==== //depot/projects/ia64/lib/libpthread/thread/thr_exit.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_exit.c,v 1.31 2003/04/28 23:56:11 deischen Exp $ + * $FreeBSD: src/lib/libpthread/thread/thr_exit.c,v 1.32 2003/05/16 19:58:29 deischen Exp $ */ #include <errno.h> #include <unistd.h> @@ -125,9 +125,8 @@ /* This thread will never be re-scheduled. */ THR_LOCK_SWITCH(curthread); THR_SET_STATE(curthread, PS_DEAD); - _thr_sched_switch(curthread); + _thr_sched_switch_unlocked(curthread); /* Never reach! */ - THR_UNLOCK_SWITCH(curthread); /* This point should not be reached. */ PANIC("Dead thread has resumed"); ==== //depot/projects/ia64/lib/libpthread/thread/thr_init.c#9 (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.51 2003/04/30 15:05:17 deischen Exp $ + * $FreeBSD: src/lib/libpthread/thread/thr_init.c,v 1.52 2003/05/16 19:58:29 deischen Exp $ */ /* Allocate space for global thread variables here: */ @@ -72,6 +72,7 @@ int __pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *); int __pthread_mutex_lock(pthread_mutex_t *); int __pthread_mutex_trylock(pthread_mutex_t *); +void _thread_init_hack(void); static void init_private(void); static void init_main_thread(struct pthread *thread); @@ -131,6 +132,7 @@ &_sigsuspend, &_socket, &_socketpair, + &_thread_init_hack, &_wait4, &_write, &_writev ==== //depot/projects/ia64/lib/libpthread/thread/thr_join.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_join.c,v 1.24 2003/04/28 23:56:11 deischen Exp $ + * $FreeBSD: src/lib/libpthread/thread/thr_join.c,v 1.25 2003/05/16 19:58:29 deischen Exp $ */ #include <errno.h> #include <pthread.h> @@ -123,13 +123,15 @@ THR_SCHED_UNLOCK(curthread, pthread); _thr_ref_delete(curthread, pthread); - THR_LOCK_SWITCH(curthread); + THR_SCHED_LOCK(curthread, curthread); while (curthread->join_status.thread == pthread) { THR_SET_STATE(curthread, PS_JOIN); + THR_SCHED_UNLOCK(curthread, curthread); /* Schedule the next thread: */ _thr_sched_switch(curthread); + THR_SCHED_LOCK(curthread, curthread); } - THR_UNLOCK_SWITCH(curthread); + THR_SCHED_UNLOCK(curthread, curthread); /* * The thread return value and error are set by the ==== //depot/projects/ia64/lib/libpthread/thread/thr_kern.c#15 (text+ko) ==== @@ -33,7 +33,7 @@ * */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/lib/libpthread/thread/thr_kern.c,v 1.64 2003/05/05 05:01:19 davidxu Exp $"); +__FBSDID("$FreeBSD: src/lib/libpthread/thread/thr_kern.c,v 1.65 2003/05/16 19:58:29 deischen Exp $"); #include <sys/types.h> #include <sys/kse.h> @@ -398,7 +398,6 @@ */ ts.tv_sec = 0; ts.tv_nsec = 1000000; /* 1 sec */ - KSE_SET_WAIT(curkse); while (_LCK_BUSY(lu)) { /* * Yield the kse and wait to be notified when the lock @@ -408,14 +407,7 @@ curkse->k_mbx.km_flags |= KMF_NOUPCALL | KMF_NOCOMPLETED; kse_release(&ts); curkse->k_mbx.km_flags = saved_flags; - - /* - * Make sure that the wait flag is set again in case - * we wokeup without the lock being granted. - */ - KSE_SET_WAIT(curkse); } - KSE_CLEAR_WAIT(curkse); } void @@ -423,17 +415,23 @@ { struct kse *curkse; struct kse *kse; + struct kse_mailbox *mbx; curkse = _get_curkse(); kse = (struct kse *)_LCK_GET_PRIVATE(lu); if (kse == curkse) PANIC("KSE trying to wake itself up in lock"); - else if (KSE_WAITING(kse)) { + else { + mbx = &kse->k_mbx; + _lock_grant(lock, lu); /* * Notify the owning kse that it has the lock. + * It is safe to pass invalid address to kse_wakeup + * even if the mailbox is not in kernel at all, + * and waking up a wrong kse is also harmless. */ - KSE_WAKEUP(kse); + kse_wakeup(mbx); } } @@ -446,30 +444,13 @@ _thr_lock_wait(struct lock *lock, struct lockuser *lu) { struct pthread *curthread = (struct pthread *)lu->lu_private; - int count; - /* - * Spin for a bit. - * - * XXX - We probably want to make this a bit smarter. It - * doesn't make sense to spin unless there is more - * than 1 CPU. A thread that is holding one of these - * locks is prevented from being swapped out for another - * thread within the same scheduling entity. - */ - count = 0; - while (_LCK_BUSY(lu) && count < 300) - count++; - while (_LCK_BUSY(lu)) { - THR_LOCK_SWITCH(curthread); - if (_LCK_BUSY(lu)) { - /* Wait for the lock: */ - atomic_store_rel_int(&curthread->need_wakeup, 1); - THR_SET_STATE(curthread, PS_LOCKWAIT); - _thr_sched_switch(curthread); - } - THR_UNLOCK_SWITCH(curthread); - } + do { + THR_SCHED_LOCK(curthread, curthread); + THR_SET_STATE(curthread, PS_LOCKWAIT); + THR_SCHED_UNLOCK(curthread, curthread); + _thr_sched_switch(curthread); + } while _LCK_BUSY(lu); } void @@ -477,26 +458,14 @@ { struct pthread *thread; struct pthread *curthread; - int unlock; curthread = _get_curthread(); thread = (struct pthread *)_LCK_GET_PRIVATE(lu); - unlock = 0; - if (curthread->kseg == thread->kseg) { - /* Not already locked */ - if (curthread->lock_switch == 0) { - THR_SCHED_LOCK(curthread, thread); - unlock = 1; - } - } else { - THR_SCHED_LOCK(curthread, thread); - unlock = 1; - } + THR_SCHED_LOCK(curthread, thread); + _lock_grant(lock, lu); _thr_setrunnable_unlocked(thread); - atomic_store_rel_int(&thread->need_wakeup, 0); - if (unlock) - THR_SCHED_UNLOCK(curthread, thread); + THR_SCHED_UNLOCK(curthread, thread); } kse_critical_t @@ -537,27 +506,42 @@ THR_YIELD_CHECK(thread); } +void +_thr_sched_switch(struct pthread *curthread) +{ + struct kse *curkse; + + (void)_kse_critical_enter(); + curkse = _get_curkse(); + KSE_SCHED_LOCK(curkse, curkse->k_kseg); + _thr_sched_switch_unlocked(curthread); +} + /* * XXX - We may need to take the scheduling lock before calling * this, or perhaps take the lock within here before * doing anything else. */ void -_thr_sched_switch(struct pthread *curthread) +_thr_sched_switch_unlocked(struct pthread *curthread) { + struct pthread *td; struct pthread_sigframe psf; struct kse *curkse; - volatile int once = 0; + int ret; + volatile int uts_once; + volatile int resume_once = 0; /* We're in the scheduler, 5 by 5: */ - THR_ASSERT(curthread->lock_switch, "lock_switch"); - THR_ASSERT(_kse_in_critical(), "not in critical region"); curkse = _get_curkse(); curthread->need_switchout = 1; /* The thread yielded on its own. */ curthread->critical_yield = 0; /* No need to yield anymore. */ curthread->slice_usec = -1; /* Restart the time slice. */ + /* Thread can unlock the scheduler lock. */ + curthread->lock_switch = 1; + /* * The signal frame is allocated off the stack because * a thread can be interrupted by other signals while @@ -566,19 +550,95 @@ sigemptyset(&psf.psf_sigset); curthread->curframe = &psf; - _thread_enter_uts(&curthread->tmbx, &curkse->k_mbx); + /* + * Enter the scheduler if any one of the following is true: + * + * o The current thread is dead; it's stack needs to be + * cleaned up and it can't be done while operating on + * it. + * o There are no runnable threads. + * o The next thread to run won't unlock the scheduler + * lock. A side note: the current thread may be run + * instead of the next thread in the run queue, but + * we don't bother checking for that. + */ + if ((curthread->state == PS_DEAD) || + (((td = KSE_RUNQ_FIRST(curkse)) == NULL) && + (curthread->state != PS_RUNNING)) || + ((td != NULL) && (td->lock_switch == 0))) + _thread_enter_uts(&curthread->tmbx, &curkse->k_mbx); + else { + uts_once = 0; + THR_GETCONTEXT(&curthread->tmbx.tm_context); + if (uts_once == 0) { + uts_once = 1; + + /* Switchout the current thread. */ + kse_switchout_thread(curkse, curthread); + + /* Choose another thread to run. */ + td = KSE_RUNQ_FIRST(curkse); + KSE_RUNQ_REMOVE(curkse, td); + curkse->k_curthread = td; + + /* + * Make sure the current thread's kse points to + * this kse. + */ + td->kse = curkse; + + /* + * Reset accounting. + */ + td->tmbx.tm_uticks = 0; + td->tmbx.tm_sticks = 0; + + /* + * Reset the time slice if this thread is running + * for the first time or running again after using + * its full time slice allocation. + */ + if (td->slice_usec == -1) + td->slice_usec = 0; + + /* Mark the thread active. */ + td->active = 1; + + /* Remove the frame reference. */ + td->curframe = NULL; + + /* + * Continue the thread at its current frame: + */ + ret = _thread_switch(&td->tmbx, NULL); + /* This point should not be reached. */ + if (ret != 0) + PANIC("Bad return from _thread_switch"); + PANIC("Thread has returned from _thread_switch"); + } + } + + if (curthread->lock_switch != 0) { + /* + * Unlock the scheduling queue and leave the + * critical region. + */ + /* Don't trust this after a switch! */ + curkse = _get_curkse(); + curthread->lock_switch = 0; + KSE_SCHED_UNLOCK(curkse, curkse->k_kseg); + _kse_critical_leave(&curthread->tmbx); + } /* * This thread is being resumed; check for cancellations. */ - if ((once == 0) && (!THR_IN_CRITICAL(curthread))) { - once = 1; - curthread->critical_count++; - THR_UNLOCK_SWITCH(curthread); - curthread->critical_count--; + if ((resume_once == 0) && (!THR_IN_CRITICAL(curthread))) { + resume_once = 1; thr_resume_check(curthread, &curthread->tmbx.tm_context, &psf); - THR_LOCK_SWITCH(curthread); } + + THR_ACTIVATE_LAST_LOCK(curthread); } /* @@ -743,12 +803,10 @@ KSE_CLEAR_WAIT(curkse); } + /* Lock the scheduling lock. */ curthread = curkse->k_curthread; - if (curthread == NULL || curthread->lock_switch == 0) { - /* - * curthread was preempted by upcall, it is not a volunteer - * context switch. Lock the scheduling lock. - */ + if ((curthread == NULL) || (curthread->need_switchout == 0)) { + /* This is an upcall; take the scheduler lock. */ KSE_SCHED_LOCK(curkse, curkse->k_kseg); } @@ -798,14 +856,9 @@ DBG_MSG("Continuing thread %p in critical region\n", curthread); kse_wakeup_multi(curkse); - if (curthread->lock_switch) { - KSE_SCHED_LOCK(curkse, curkse->k_kseg); - ret = _thread_switch(&curthread->tmbx, 0); - } else { - KSE_SCHED_UNLOCK(curkse, curkse->k_kseg); - ret = _thread_switch(&curthread->tmbx, - &curkse->k_mbx.km_curthread); - } + KSE_SCHED_UNLOCK(curkse, curkse->k_kseg); + ret = _thread_switch(&curthread->tmbx, + &curkse->k_mbx.km_curthread); if (ret != 0) PANIC("Can't resume thread in critical region\n"); } @@ -895,9 +948,6 @@ kse_wakeup_multi(curkse); - /* Unlock the scheduling queue: */ - KSE_SCHED_UNLOCK(curkse, curkse->k_kseg); - /* * The thread's current signal frame will only be NULL if it * is being resumed after being blocked in the kernel. In @@ -906,25 +956,30 @@ * signal frame to the thread's context. */ #ifdef NOT_YET - if ((curframe == NULL) && ((curthread->check_pending != 0) || + if ((curframe == NULL) && ((curthread->have_signals != 0) || (((curthread->cancelflags & THR_AT_CANCEL_POINT) == 0) && ((curthread->cancelflags & PTHREAD_CANCEL_ASYNCHRONOUS) != 0)))) signalcontext(&curthread->tmbx.tm_context, 0, (__sighandler_t *)thr_resume_wrapper); #else - if ((curframe == NULL) && (curthread->check_pending != 0)) + if ((curframe == NULL) && (curthread->have_signals != 0)) signalcontext(&curthread->tmbx.tm_context, 0, (__sighandler_t *)thr_resume_wrapper); #endif /* * Continue the thread at its current frame: */ - if (curthread->lock_switch) { - KSE_SCHED_LOCK(curkse, curkse->k_kseg); - ret = _thread_switch(&curthread->tmbx, 0); + if (curthread->lock_switch != 0) { + /* + * This thread came from a scheduler switch; it will + * unlock the scheduler lock and set the mailbox. + */ + ret = _thread_switch(&curthread->tmbx, NULL); } else { + /* This thread won't unlock the scheduler lock. */ + KSE_SCHED_UNLOCK(curkse, curkse->k_kseg); ret = _thread_switch(&curthread->tmbx, - &curkse->k_mbx.km_curthread); + &curkse->k_mbx.km_curthread); } if (ret != 0) PANIC("Thread has returned from _thread_switch"); @@ -977,9 +1032,9 @@ struct pthread_sigframe *psf) { /* Check signals before cancellations. */ - while (curthread->check_pending != 0) { + while (curthread->have_signals != 0) { /* Clear the pending flag. */ - curthread->check_pending = 0; + curthread->have_signals = 0; /* * It's perfectly valid, though not portable, for @@ -1262,6 +1317,11 @@ THR_SET_STATE(thread, PS_SUSPENDED); else KSE_RUNQ_INSERT_TAIL(kse, thread); + if ((thread->kse != kse) && + (thread->kse->k_curthread == thread)) { + thread->kse->k_curthread = NULL; + thread->active = 0; + } } completed = completed->tm_next; } @@ -1360,12 +1420,15 @@ kse_switchout_thread(struct kse *kse, struct pthread *thread) { int level; + int i; /* * Place the currently running thread into the * appropriate queue(s). */ DBG_MSG("Switching out thread %p, state %d\n", thread, thread->state); + >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305170151.h4H1pLdP004587>