From owner-p4-projects@FreeBSD.ORG Thu May 29 14:51:43 2003 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A1C0537B404; Thu, 29 May 2003 14:51:42 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 54F6637B401 for ; Thu, 29 May 2003 14:51:42 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 38BB443F3F for ; Thu, 29 May 2003 14:51:41 -0700 (PDT) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.6/8.12.6) with ESMTP id h4TLpf0U064477 for ; Thu, 29 May 2003 14:51:41 -0700 (PDT) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id h4TLpeUI064474 for perforce@freebsd.org; Thu, 29 May 2003 14:51:40 -0700 (PDT) Date: Thu, 29 May 2003 14:51:40 -0700 (PDT) Message-Id: <200305292151.h4TLpeUI064474@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Subject: PERFORCE change 32055 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 29 May 2003 21:51:43 -0000 http://perforce.freebsd.org/chv.cgi?CH=32055 Change 32055 by peter@peter_daintree on 2003/05/29 14:51:15 IFC @32051 Affected files ... .. //depot/projects/hammer/contrib/amd/conf/transp/transp_sockets.c#2 integrate .. //depot/projects/hammer/contrib/binutils/bfd/elf64-alpha.c#5 integrate .. //depot/projects/hammer/crypto/openssh/sshd.c#5 integrate .. //depot/projects/hammer/lib/libc/rpc/svc_vc.c#3 integrate .. //depot/projects/hammer/lib/libc/stdlib/realpath.c#6 integrate .. //depot/projects/hammer/lib/libc/xdr/xdr_rec.c#3 integrate .. //depot/projects/hammer/lib/libpthread/thread/thr_init.c#7 integrate .. //depot/projects/hammer/lib/libpthread/thread/thr_private.h#9 integrate .. //depot/projects/hammer/lib/libpthread/thread/thr_sig.c#9 integrate .. //depot/projects/hammer/lib/libpthread/thread/thr_spinlock.c#5 integrate .. //depot/projects/hammer/lib/libthr/arch/i386/i386/_setcurthread.c#7 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_cond.c#5 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_create.c#6 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_exit.c#5 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_gc.c#4 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_join.c#4 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_mutex.c#6 integrate .. //depot/projects/hammer/release/doc/en_US.ISO8859-1/hardware/common/dev.sgml#23 integrate .. //depot/projects/hammer/release/doc/en_US.ISO8859-1/relnotes/common/new.sgml#29 integrate .. //depot/projects/hammer/release/doc/ja_JP.eucJP/errata/article.sgml#5 integrate .. //depot/projects/hammer/release/doc/ja_JP.eucJP/hardware/common/dev.sgml#6 integrate .. //depot/projects/hammer/release/doc/ja_JP.eucJP/relnotes/common/new.sgml#6 integrate .. //depot/projects/hammer/share/man/man4/axe.4#2 integrate .. //depot/projects/hammer/share/man/man4/mac_portacl.4#2 integrate .. //depot/projects/hammer/share/man/man4/man4.i386/pae.4#3 integrate .. //depot/projects/hammer/share/man/man4/man4.i386/sbni.4#2 integrate .. //depot/projects/hammer/share/man/man4/man4.i386/vpd.4#2 integrate .. //depot/projects/hammer/share/man/man4/my.4#2 integrate .. //depot/projects/hammer/share/man/man4/rndtest.4#2 integrate .. //depot/projects/hammer/share/man/man4/rue.4#2 integrate .. //depot/projects/hammer/share/man/man4/sbsh.4#2 integrate .. //depot/projects/hammer/sys/amd64/amd64/identcpu.c#11 integrate .. //depot/projects/hammer/sys/contrib/dev/acpica/nsalloc.c#5 integrate .. //depot/projects/hammer/sys/ia64/ia64/machdep.c#16 integrate .. //depot/projects/hammer/sys/ia64/ia64/trap.c#11 integrate .. //depot/projects/hammer/sys/ia64/ia64/unaligned.c#3 integrate .. //depot/projects/hammer/sys/ia64/include/cpu.h#7 integrate .. //depot/projects/hammer/sys/kern/kern_sysctl.c#7 integrate .. //depot/projects/hammer/sys/kern/subr_mbuf.c#11 integrate .. //depot/projects/hammer/sys/kern/uipc_syscalls.c#8 integrate .. //depot/projects/hammer/sys/kern/vfs_cluster.c#8 integrate .. //depot/projects/hammer/sys/net/if_loop.c#7 integrate .. //depot/projects/hammer/sys/sparc64/sparc64/tick.c#5 integrate Differences ... ==== //depot/projects/hammer/contrib/amd/conf/transp/transp_sockets.c#2 (text+ko) ==== @@ -50,6 +50,9 @@ #include #include +#ifndef RPC_MAXDATASIZE +#define RPC_MAXDATASIZE 9000 +#endif /* * find the IP address that can be used to connect to the local host @@ -216,6 +219,8 @@ int create_amq_service(int *udp_soAMQp, SVCXPRT **udp_amqpp, int *tcp_soAMQp, SVCXPRT **tcp_amqpp) { + int maxrec = RPC_MAXDATASIZE; + /* first create TCP service */ if (tcp_soAMQp) { *tcp_soAMQp = socket(AF_INET, SOCK_STREAM, 0); @@ -231,6 +236,9 @@ return 2; } } +#ifdef SVCSET_CONNMAXREC + SVC_CONTROL(*tcp_amqpp, SVCSET_CONNMAXREC, &maxrec); +#endif /* next create UDP service */ if (udp_soAMQp) { ==== //depot/projects/hammer/contrib/binutils/bfd/elf64-alpha.c#5 (text+ko) ==== @@ -19,6 +19,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/* $FreeBSD: src/contrib/binutils/bfd/elf64-alpha.c,v 1.18 2003/05/28 03:32:33 obrien Exp $ */ + /* We need a published ABI spec for this. Until one comes out, don't assume this'll remain unchanged forever. */ @@ -4490,8 +4492,20 @@ value -= gp; goto default_reloc; + case R_ALPHA_GPREL32: + /* If the target section was a removed linkonce section, + r_symndx will be zero. In this case, assume that the + switch will not be used, so don't fill it in. If we + do nothing here, we'll get relocation truncated messages, + due to the placement of the application above 4GB. */ + if (r_symndx == 0) + { + r = bfd_reloc_ok; + break; + } + /* FALLTHRU */ + case R_ALPHA_GPREL16: - case R_ALPHA_GPREL32: case R_ALPHA_GPRELLOW: if (dynamic_symbol_p) { ==== //depot/projects/hammer/crypto/openssh/sshd.c#5 (text+ko) ==== @@ -43,7 +43,7 @@ #include "includes.h" RCSID("$OpenBSD: sshd.c,v 1.263 2003/02/16 17:09:57 markus Exp $"); -RCSID("$FreeBSD: src/crypto/openssh/sshd.c,v 1.33 2003/04/23 17:10:53 des Exp $"); +RCSID("$FreeBSD: src/crypto/openssh/sshd.c,v 1.34 2003/05/28 19:39:33 des Exp $"); #include #include @@ -835,9 +835,10 @@ /* Save argv. Duplicate so setproctitle emulation doesn't clobber it */ saved_argc = ac; saved_argv = av; - saved_argv = xmalloc(sizeof(*saved_argv) * ac); + saved_argv = xmalloc(sizeof(*saved_argv) * (ac + 1)); for (i = 0; i < ac; i++) saved_argv[i] = xstrdup(av[i]); + saved_argv[ac] = NULL; #ifndef HAVE_SETPROCTITLE /* Prepare for later setproctitle emulation */ ==== //depot/projects/hammer/lib/libc/rpc/svc_vc.c#3 (text+ko) ==== @@ -34,7 +34,7 @@ static char *sccsid = "@(#)svc_tcp.c 2.2 88/08/01 4.0 RPCSRC"; #endif #include -__FBSDID("$FreeBSD: src/lib/libc/rpc/svc_vc.c,v 1.17 2003/01/26 23:01:49 mbr Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/rpc/svc_vc.c,v 1.19 2003/05/29 19:43:22 mbr Exp $"); /* * svc_vc.c, Server side for Connection Oriented based RPC. @@ -487,8 +487,15 @@ cfp = (struct cf_conn *)xprt->xp_p1; + cm = NULL; + sa = (struct sockaddr *)xprt->xp_rtaddr.buf; if (cfp->nonblock) { - len = _read(sock, buf, (size_t)len); + if (sa->sa_family == AF_LOCAL) { + cm = (struct cmessage *)xprt->xp_verf.oa_base; + if ((len = __msgread_withcred(sock, buf, len, cm)) > 0) + xprt->xp_p2 = &cm->cmcred; + } else + len = _read(sock, buf, (size_t)len); if (len < 0) { if (errno == EAGAIN) len = 0; @@ -517,8 +524,6 @@ } } while ((pollfd.revents & POLLIN) == 0); - cm = NULL; - sa = (struct sockaddr *)xprt->xp_rtaddr.buf; if (sa->sa_family == AF_LOCAL) { cm = (struct cmessage *)xprt->xp_verf.oa_base; if ((len = __msgread_withcred(sock, buf, len, cm)) > 0) { ==== //depot/projects/hammer/lib/libc/stdlib/realpath.c#6 (text+ko) ==== @@ -30,7 +30,7 @@ static char sccsid[] = "@(#)realpath.c 8.1 (Berkeley) 2/16/94"; #endif /* LIBC_SCCS and not lint */ #include -__FBSDID("$FreeBSD: src/lib/libc/stdlib/realpath.c,v 1.19 2003/05/01 19:03:14 nectar Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/stdlib/realpath.c,v 1.20 2003/05/28 08:23:01 fjoe Exp $"); #include "namespace.h" #include @@ -119,7 +119,7 @@ */ if (resolved_len > 1) { resolved[resolved_len - 1] = '\0'; - q = strrchr(resolved, '/'); + q = strrchr(resolved, '/') + 1; *q = '\0'; resolved_len = q - resolved; } @@ -158,7 +158,7 @@ } else if (resolved_len > 1) { /* Strip the last path component. */ resolved[resolved_len - 1] = '\0'; - q = strrchr(resolved, '/'); + q = strrchr(resolved, '/') + 1; *q = '\0'; resolved_len = q - resolved; } ==== //depot/projects/hammer/lib/libc/xdr/xdr_rec.c#3 (text+ko) ==== @@ -35,7 +35,7 @@ static char *sccsid = "@(#)xdr_rec.c 2.2 88/08/01 4.0 RPCSRC"; #endif #include -__FBSDID("$FreeBSD: src/lib/libc/xdr/xdr_rec.c,v 1.19 2003/02/27 13:40:01 nectar Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/xdr/xdr_rec.c,v 1.20 2003/05/28 09:13:09 mbr Exp $"); /* * xdr_rec.c, Implements TCP/IP based XDR streams with a "record marking" @@ -489,16 +489,7 @@ XDR *xdrs; { RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private); - enum xprt_stat xstat; - if (rstrm->nonblock) { - if (__xdrrec_getrec(xdrs, &xstat, FALSE)) - return FALSE; - if (!rstrm->in_haveheader && xstat == XPRT_IDLE) - return TRUE; - return FALSE; - } - while (rstrm->fbtbc > 0 || (! rstrm->last_frag)) { if (! skip_input_bytes(rstrm, rstrm->fbtbc)) return (TRUE); @@ -719,6 +710,8 @@ { u_int32_t header; + if (rstrm->nonblock) + return FALSE; if (! get_input_bytes(rstrm, (char *)(void *)&header, sizeof(header))) return (FALSE); header = ntohl(header); ==== //depot/projects/hammer/lib/libpthread/thread/thr_init.c#7 (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.52 2003/05/16 19:58:29 deischen Exp $ + * $FreeBSD: src/lib/libpthread/thread/thr_init.c,v 1.53 2003/05/29 17:10:45 deischen Exp $ */ /* Allocate space for global thread variables here: */ @@ -515,6 +515,7 @@ if (_lock_init(&_keytable_lock, LCK_ADAPTIVE, _thr_lock_wait, _thr_lock_wakeup) != 0) PANIC("Cannot initialize thread specific keytable lock"); + _thr_spinlock_init(); /* Clear pending signals and get the process signal mask. */ sigemptyset(&_thr_proc_sigpending); ==== //depot/projects/hammer/lib/libpthread/thread/thr_private.h#9 (text+ko) ==== @@ -31,7 +31,7 @@ * * Private thread definitions for the uthread kernel. * - * $FreeBSD: src/lib/libpthread/thread/thr_private.h,v 1.87 2003/05/16 19:58:29 deischen Exp $ + * $FreeBSD: src/lib/libpthread/thread/thr_private.h,v 1.88 2003/05/29 17:10:45 deischen Exp $ */ #ifndef _THR_PRIVATE_H @@ -1114,6 +1114,7 @@ void _thr_sched_switch(struct pthread *); void _thr_sched_switch_unlocked(struct pthread *); void _thr_set_timeout(const struct timespec *); +void _thr_seterrno(struct pthread *, int); void _thr_sig_handler(int, siginfo_t *, ucontext_t *); void _thr_sig_check_pending(struct pthread *); void _thr_sig_rundown(struct pthread *, ucontext_t *, @@ -1121,7 +1122,7 @@ void _thr_sig_send(struct pthread *pthread, int sig); void _thr_sig_wrapper(void); void _thr_sigframe_restore(struct pthread *thread, struct pthread_sigframe *psf); -void _thr_seterrno(struct pthread *, int); +void _thr_spinlock_init(void); void _thr_enter_cancellation_point(struct pthread *); void _thr_leave_cancellation_point(struct pthread *); int _thr_setconcurrency(int new_level); ==== //depot/projects/hammer/lib/libpthread/thread/thr_sig.c#9 (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.51 2003/05/24 02:29:25 deischen Exp $ + * $FreeBSD: src/lib/libpthread/thread/thr_sig.c,v 1.52 2003/05/29 17:10:45 deischen Exp $ */ #include #include @@ -175,7 +175,7 @@ void _thr_sig_handler(int sig, siginfo_t *info, ucontext_t *ucp) { - void (*sigfunc)(int, siginfo_t *, void *); + __siginfohandler_t *sigfunc; struct kse *curkse; curkse = _get_curkse(); @@ -184,7 +184,8 @@ sigfunc = _thread_sigact[sig - 1].sa_sigaction; ucp->uc_sigmask = _thr_proc_sigmask; if (((__sighandler_t *)sigfunc != SIG_DFL) && - ((__sighandler_t *)sigfunc != SIG_IGN)) { + ((__sighandler_t *)sigfunc != SIG_IGN) && + (sigfunc != (__siginfohandler_t *)_thr_sig_handler)) { if (((_thread_sigact[sig - 1].sa_flags & SA_SIGINFO) != 0) || (info == NULL)) (*(sigfunc))(sig, info, ucp); ==== //depot/projects/hammer/lib/libpthread/thread/thr_spinlock.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_spinlock.c,v 1.15 2003/04/28 23:56:12 deischen Exp $ + * $FreeBSD: src/lib/libpthread/thread/thr_spinlock.c,v 1.16 2003/05/29 17:10:45 deischen Exp $ * */ @@ -40,6 +40,20 @@ #include "spinlock.h" #include "thr_private.h" +#define MAX_SPINLOCKS 5 + +struct spinlock_extra { + struct lock lock; + kse_critical_t crit; +}; + +static void init_spinlock(spinlock_t *lck); + +static struct lock spinlock_static_lock; +static struct spinlock_extra extra[MAX_SPINLOCKS]; +static int spinlock_count = 0; +static int initialized = 0; + /* * These are for compatability only. Spinlocks of this type * are deprecated. @@ -48,12 +62,13 @@ void _spinunlock(spinlock_t *lck) { + struct spinlock_extra *extra; kse_critical_t crit; - crit = (kse_critical_t)lck->fname; - atomic_store_rel_long(&lck->access_lock, 0); - if (crit != NULL) - _kse_critical_leave(crit); + extra = (struct spinlock_extra *)lck->fname; + crit = extra->crit; + KSE_LOCK_RELEASE(_get_curkse(), &extra->lock); + _kse_critical_leave(crit); } @@ -66,21 +81,21 @@ void _spinlock(spinlock_t *lck) { + struct spinlock_extra *extra; kse_critical_t crit; + THR_ASSERT(__isthreaded != 0, "Spinlock called when not threaded."); + THR_ASSERT(initialized != 0, "Spinlocks not initialized."); /* * Try to grab the lock and loop if another thread grabs * it before we do. */ - if (_kse_isthreaded()) - crit = _kse_critical_enter(); - else - crit = NULL; - while(_atomic_lock(&lck->access_lock)) { - while (lck->access_lock) - ; - } - lck->fname = (char *)crit; + crit = _kse_critical_enter(); + if (lck->fname == NULL) + init_spinlock(lck); + extra = (struct spinlock_extra *)lck->fname; + KSE_LOCK_ACQUIRE(_get_curkse(), &extra->lock); + extra->crit = crit; } /* @@ -98,3 +113,40 @@ { _spinlock(lck); } + +static void +init_spinlock(spinlock_t *lck) +{ + struct kse *curkse = _get_curkse(); + + KSE_LOCK_ACQUIRE(curkse, &spinlock_static_lock); + if ((lck->fname == NULL) && (spinlock_count < MAX_SPINLOCKS)) { + lck->fname = (char *)&extra[spinlock_count]; + spinlock_count++; + } + KSE_LOCK_RELEASE(curkse, &spinlock_static_lock); + THR_ASSERT(lck->fname != NULL, "Exceeded max spinlocks"); +} + +void +_thr_spinlock_init(void) +{ + int i; + + if (initialized != 0) { + _lock_destroy(&spinlock_static_lock); + for (i = 0; i < MAX_SPINLOCKS; i++) { + _lock_destroy(&extra[i].lock); + } + } + + if (_lock_init(&spinlock_static_lock, LCK_ADAPTIVE, + _kse_lock_wait, _kse_lock_wakeup) != 0) + PANIC("Cannot initialize spinlock_static_lock"); + for (i = 0; i < MAX_SPINLOCKS; i++) { + if (_lock_init(&extra[i].lock, LCK_ADAPTIVE, + _kse_lock_wait, _kse_lock_wakeup) != 0) + PANIC("Cannot initialize spinlock extra"); + } + initialized = 1; +} ==== //depot/projects/hammer/lib/libthr/arch/i386/i386/_setcurthread.c#7 (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/libthr/arch/i386/i386/_setcurthread.c,v 1.8 2003/05/25 22:40:57 mtm Exp $ + * $FreeBSD: src/lib/libthr/arch/i386/i386/_setcurthread.c,v 1.9 2003/05/29 20:49:17 mtm Exp $ */ #include @@ -111,6 +111,8 @@ if (ldt_free == NULL) { /* Concurrent thread limit reached */ *err = curthread->error = EAGAIN; + if (thr != _thread_initial) + _SPINUNLOCK(&ldt_lock); return (NULL); } ==== //depot/projects/hammer/lib/libthr/thread/thr_cond.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/libthr/thread/thr_cond.c,v 1.6 2003/05/24 01:02:16 mtm Exp $ + * $FreeBSD: src/lib/libthr/thread/thr_cond.c,v 1.7 2003/05/29 20:54:00 mtm Exp $ */ #include #include @@ -38,8 +38,15 @@ #include "thr_private.h" /* + * Proctect two different threads calling a pthread_cond_* function + * from accidentally initializing the condition variable twice. + */ +static spinlock_t static_cond_lock = _SPINLOCK_INITIALIZER; + +/* * Prototypes */ +static inline int cond_init(pthread_cond_t *); static pthread_t cond_queue_deq(pthread_cond_t); static void cond_queue_remove(pthread_cond_t, pthread_t); static void cond_queue_enq(pthread_cond_t, pthread_t); @@ -202,7 +209,7 @@ * If the condition variable is statically initialized, perform dynamic * initialization. */ - if (*cond == NULL && (rval = pthread_cond_init(cond, NULL)) != 0) + if (*cond == PTHREAD_COND_INITIALIZER && (rval = cond_init(cond)) != 0) return (rval); @@ -363,7 +370,7 @@ * If the condition variable is statically initialized, perform dynamic * initialization. */ - if (*cond == NULL && (rval = pthread_cond_init(cond, NULL)) != 0) + if (*cond == PTHREAD_COND_INITIALIZER && (rval = cond_init(cond)) != 0) return (rval); COND_LOCK(*cond); @@ -518,3 +525,14 @@ pthread->flags |= PTHREAD_FLAGS_IN_CONDQ; pthread->data.cond = cond; } + +static inline int +cond_init(pthread_cond_t *cond) +{ + _SPINLOCK(&static_cond_lock); + if (*cond == PTHREAD_COND_INITIALIZER) + return (_pthread_cond_init(cond, NULL)); + _SPINUNLOCK(&static_cond_lock); + return (0); +} + ==== //depot/projects/hammer/lib/libthr/thread/thr_create.c#6 (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_create.c,v 1.9 2003/05/26 00:37:07 mtm Exp $ + * $FreeBSD: src/lib/libthr/thread/thr_create.c,v 1.10 2003/05/29 20:40:50 mtm Exp $ */ #include #include @@ -171,7 +171,6 @@ new_thread->uniqueid = next_uniqueid++; THREAD_LIST_LOCK; - _thread_critical_enter(new_thread); /* * Check if the garbage collector thread @@ -182,8 +181,6 @@ /* Add the thread to the linked list of all threads: */ TAILQ_INSERT_HEAD(&_thread_list, new_thread, tle); - THREAD_LIST_UNLOCK; - /* * Create the thread. * @@ -200,11 +197,11 @@ PANIC("thr_create"); } + THREAD_LIST_UNLOCK; + /* Return a pointer to the thread structure: */ (*thread) = new_thread; - _thread_critical_exit(new_thread); - /* * Start a garbage collector thread * if necessary. ==== //depot/projects/hammer/lib/libthr/thread/thr_exit.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/libthr/thread/thr_exit.c,v 1.6 2003/05/25 08:31:33 mtm Exp $ + * $FreeBSD: src/lib/libthr/thread/thr_exit.c,v 1.8 2003/05/29 20:46:53 mtm Exp $ */ #include #include @@ -94,7 +94,7 @@ void _pthread_exit(void *status) { - pthread_t pthread; + pthread_t pthread, joiner; int exitNow = 0; /* Check if this thread is already in the process of exiting: */ @@ -122,10 +122,27 @@ _thread_cleanupspecific(); } +retry: + /* + * Proper lock order, to minimize deadlocks, between joining + * and exiting threads is: DEAD_LIST, THREAD_LIST, exiting, joiner. + * In order to do this *and* protect from races, we must resort + * this test-and-retry loop. + */ + joiner = curthread->joiner; + /* Lock the dead list first to maintain correct lock order */ DEAD_LIST_LOCK; + THREAD_LIST_LOCK; _thread_critical_enter(curthread); + if (joiner != curthread->joiner) { + _thread_critical_exit(curthread); + THREAD_LIST_UNLOCK; + DEAD_LIST_UNLOCK; + goto retry; + } + /* Check if there is a thread joining this one: */ if (curthread->joiner != NULL) { pthread = curthread->joiner; @@ -151,34 +168,35 @@ * Add this thread to the list of dead threads, and * also remove it from the active threads list. */ - THREAD_LIST_LOCK; TAILQ_INSERT_HEAD(&_dead_list, curthread, dle); TAILQ_REMOVE(&_thread_list, curthread, tle); PTHREAD_SET_STATE(curthread, PS_DEAD); _thread_critical_exit(curthread); + /* If we're the last thread, call it quits */ + if (TAILQ_EMPTY(&_thread_list)) + exitNow = 1; + + THREAD_LIST_UNLOCK; + /* * Signal the garbage collector thread that there is something - * to clean up. + * to clean up. But don't allow it to free the memory until after + * it is retired by holding on to the dead list lock. */ if (pthread_cond_signal(&_gc_cond) != 0) PANIC("Cannot signal gc cond"); - /* If we're the last thread, call it quits */ - if (TAILQ_EMPTY(&_thread_list)) - exitNow = 1; + if (exitNow) + exit(0); - THREAD_LIST_UNLOCK; DEAD_LIST_UNLOCK; - if (exitNow) - exit(0); - /* - * Retire the architecture specific id so that it can be used for - * new threads. + * This function will not return unless we are the last + * thread, which we can't be because we've already checked + * for that. */ - _retire_thread(curthread->arch_id); _thr_exit(); /* This point should not be reached. */ ==== //depot/projects/hammer/lib/libthr/thread/thr_gc.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/libthr/thread/thr_gc.c,v 1.5 2003/05/26 00:37:07 mtm Exp $ + * $FreeBSD: src/lib/libthr/thread/thr_gc.c,v 1.6 2003/05/29 20:46:53 mtm Exp $ * * Garbage collector thread. Frees memory allocated for dead threads. * @@ -142,6 +142,13 @@ pthread_cln = pthread; _SPINUNLOCK(&pthread->lock); + + /* + * Retire the architecture specific id so it may be + * used for new threads. + */ + _retire_thread(pthread_cln->arch_id); + } /* ==== //depot/projects/hammer/lib/libthr/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/libthr/thread/thr_join.c,v 1.6 2003/05/26 00:28:49 mtm Exp $ + * $FreeBSD: src/lib/libthr/thread/thr_join.c,v 1.8 2003/05/29 20:46:53 mtm Exp $ */ #include #include @@ -107,9 +107,10 @@ /* Check if the thread is not dead: */ if (pthread->state != PS_DEAD) { - _thread_critical_enter(curthread); /* Set the running thread to be the joiner: */ pthread->joiner = curthread; + _SPINUNLOCK(&pthread->lock); + _thread_critical_enter(curthread); /* Keep track of which thread we're joining to: */ curthread->join_status.thread = pthread; @@ -118,11 +119,19 @@ PTHREAD_SET_STATE(curthread, PS_JOIN); /* Wait for our signal to wake up. */ _thread_critical_exit(curthread); - _SPINUNLOCK(&pthread->lock); THREAD_LIST_UNLOCK; DEAD_LIST_UNLOCK; _thread_suspend(curthread, NULL); + /* + * XXX - For correctness reasons. + * We must aquire these in the same order and also + * importantly, release in the same order, order because + * otherwise we might deadlock with the joined thread + * when we attempt to release one of these locks. + */ + DEAD_LIST_LOCK; + THREAD_LIST_LOCK; _thread_critical_enter(curthread); } @@ -134,6 +143,8 @@ if ((ret == 0) && (thread_return != NULL)) *thread_return = curthread->join_status.ret; _thread_critical_exit(curthread); + THREAD_LIST_UNLOCK; + DEAD_LIST_UNLOCK; } else { /* * The thread exited (is dead) without being detached, and no @@ -149,9 +160,9 @@ /* Make the thread collectable by the garbage collector. */ pthread->attr.flags |= PTHREAD_DETACHED; _SPINUNLOCK(&pthread->lock); + THREAD_LIST_UNLOCK; if (pthread_cond_signal(&_gc_cond) != 0) PANIC("Cannot signal gc cond"); - THREAD_LIST_UNLOCK; DEAD_LIST_UNLOCK; } ==== //depot/projects/hammer/lib/libthr/thread/thr_mutex.c#6 (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_mutex.c,v 1.8 2003/05/23 09:48:20 mtm Exp $ + * $FreeBSD: src/lib/libthr/thread/thr_mutex.c,v 1.9 2003/05/29 20:58:31 mtm Exp $ */ #include #include @@ -101,7 +101,7 @@ if (mutex == NULL) ret = EINVAL; - else if (*mutex == NULL) + else if (*mutex == PTHREAD_MUTEX_INITIALIZER) ret = _pthread_mutex_init(mutex, NULL); else { /* @@ -269,35 +269,25 @@ static int init_static(pthread_mutex_t *mutex) { - int ret; - _SPINLOCK(&static_init_lock); - - if (*mutex == NULL) - ret = _pthread_mutex_init(mutex, NULL); - else - ret = 0; - + if (*mutex == PTHREAD_MUTEX_INITIALIZER) { + _SPINUNLOCK(&static_init_lock); + return(_pthread_mutex_init(mutex, NULL)); + } _SPINUNLOCK(&static_init_lock); - - return (ret); + return (0); } static int init_static_private(pthread_mutex_t *mutex) { - int ret; - _SPINLOCK(&static_init_lock); - - if (*mutex == NULL) - ret = _pthread_mutex_init(mutex, &static_mattr); - else - ret = 0; - + if (*mutex == PTHREAD_MUTEX_INITIALIZER) { + _SPINUNLOCK(&static_init_lock); + return (_pthread_mutex_init(mutex, &static_mattr)); + } _SPINUNLOCK(&static_init_lock); - - return (ret); + return (0); } int @@ -312,7 +302,8 @@ * If the mutex is statically initialized, perform the dynamic * initialization: */ - else if ((*mutex != NULL) || (ret = init_static(mutex)) == 0) + else if ((*mutex != PTHREAD_MUTEX_INITIALIZER) || + (ret = init_static(mutex)) == 0) ret = mutex_lock_common(mutex, 1); return (ret); @@ -330,7 +321,8 @@ * If the mutex is statically initialized, perform the dynamic * initialization marking the mutex private (delete safe): */ - else if ((*mutex != NULL) || (ret = init_static_private(mutex)) == 0) + else if ((*mutex != PTHREAD_MUTEX_INITIALIZER) || + (ret = init_static_private(mutex)) == 0) ret = mutex_lock_common(mutex, 1); return (ret); @@ -514,7 +506,8 @@ * If the mutex is statically initialized, perform the dynamic * initialization: */ - else if ((*mutex != NULL) || ((ret = init_static(mutex)) == 0)) + else if ((*mutex != PTHREAD_MUTEX_INITIALIZER) || + ((ret = init_static(mutex)) == 0)) ret = mutex_lock_common(mutex, 0); return (ret); @@ -535,7 +528,8 @@ * If the mutex is statically initialized, perform the dynamic * initialization marking it private (delete safe): */ - else if ((*mutex != NULL) || ((ret = init_static_private(mutex)) == 0)) + else if ((*mutex != PTHREAD_MUTEX_INITIALIZER) || + ((ret = init_static_private(mutex)) == 0)) ret = mutex_lock_common(mutex, 0); return (ret); ==== //depot/projects/hammer/release/doc/en_US.ISO8859-1/hardware/common/dev.sgml#23 (text+ko) ==== @@ -31,7 +31,7 @@ - $FreeBSD: src/release/doc/en_US.ISO8859-1/hardware/common/dev.sgml,v 1.155 2003/05/24 18:50:20 hrs Exp $ + $FreeBSD: src/release/doc/en_US.ISO8859-1/hardware/common/dev.sgml,v 1.156 2003/05/28 21:01:22 hrs Exp $ Supported Devices @@ -688,7 +688,7 @@ ICM PSC-2401 SCSI - Melco IFC-SC + MELCO IFC-SC RATOC REX-5536, REX-5536AM, REX-5536M, @@ -1273,7 +1273,7 @@ (PCMPC100 V2) - Melco LPC-T/LPC2-T/LPC2-CLT/LPC2-TX/LPC3-TX/LPC3-CLX + MELCO LPC-T/LPC2-T/LPC2-CLT/LPC2-TX/LPC3-TX/LPC3-CLX NDC Ethernet Instant-Link @@ -1609,7 +1609,7 @@ LinkSys USB10T, USB10TA, USB10TX, USB100TX, USB100H1 - Melco LUA-TX, LUA2-TX + MELCO LUA-TX, LUA2-TX Planex UE-200TX @@ -1716,7 +1716,7 @@ GREEN HOUSE GH-USB100B - Melco LUA-KTX + MELCO LUA-KTX @@ -2345,7 +2345,7 @@ Lucent WaveLAN/IEEE 802.11 - Melco Airconnect WLI-PCM-S11, WLI-PCM-L11 + MELCO Airconnect WLI-PCM-S11, WLI-PCM-L11 NCR WaveLAN/IEEE 802.11 @@ -2428,7 +2428,7 @@ Icom SL-200 - Melco WLI-PCM + MELCO WLI-PCM NEL SSMagic @@ -3306,21 +3306,21 @@ Matshita CF-VFDU03 floppy drive - Melco USB2.0 MO Drive MO-CH640U2 + MELCO USB2.0 MO Drive MO-CH640U2 - Melco USB/IEEE1394 Portable HD Drive HDP-i30P/CI, HDP-i40P/CI + I-O DATA USB/IEEE1394 Portable HD Drive HDP-i30P/CI, HDP-i40P/CI - Melco USB Flash Disk PetitDrive, + MELCO USB Flash Disk PetitDrive, RUF-32M, -64M, -128M, -256M - Melco USB2.0 Flash Disk PetitDrive2, + MELCO USB2.0 Flash Disk PetitDrive2, RUF-256M/U2, -512M/U2 - Melco USB Flash Disk ClipDrive, + MELCO USB Flash Disk ClipDrive, RUF-C32M, -C64M, -C128M, -C256M, -C512M @@ -3521,7 +3521,7 @@ FAX-Modem/PCCARD - Melco IGM-PCM56K/IGM-PCM56KH + MELCO IGM-PCM56K/IGM-PCM56KH Nokia Card Phone 2.0 (gsm900/dcs1800 HSCSD terminal) ==== //depot/projects/hammer/release/doc/en_US.ISO8859-1/relnotes/common/new.sgml#29 (text+ko) ==== @@ -3,7 +3,7 @@ The FreeBSD Project - $FreeBSD: src/release/doc/en_US.ISO8859-1/relnotes/common/new.sgml,v 1.572 2003/05/27 15:43:59 bmah Exp $ + $FreeBSD: src/release/doc/en_US.ISO8859-1/relnotes/common/new.sgml,v 1.573 2003/05/28 21:01:22 hrs Exp $ 2000 @@ -735,7 +735,7 @@ The format of the /etc/pwd.db and /etc/spwd.db password databases created by - &man.pwd.mkdb.8; is now byte-order dependent. The pre-processed + &man.pwd.mkdb.8; is now byte-order independent. The pre-processed password databases can now be moved between machines of different architectures. The format includes version numbers on entries to ensure compatibility with old binaries. ==== //depot/projects/hammer/release/doc/ja_JP.eucJP/errata/article.sgml#5 (text+ko) ==== @@ -1,8 +1,8 @@