From owner-svn-src-user@FreeBSD.ORG Wed Mar 21 07:33:42 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 000991065673; Wed, 21 Mar 2012 07:33:41 +0000 (UTC) (envelope-from davidxu@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id DFFAE8FC0C; Wed, 21 Mar 2012 07:33:41 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q2L7XfuX060086; Wed, 21 Mar 2012 07:33:41 GMT (envelope-from davidxu@svn.freebsd.org) Received: (from davidxu@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q2L7XfvT060084; Wed, 21 Mar 2012 07:33:41 GMT (envelope-from davidxu@svn.freebsd.org) Message-Id: <201203210733.q2L7XfvT060084@svn.freebsd.org> From: David Xu Date: Wed, 21 Mar 2012 07:33:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r233267 - user/davidxu/pth_objdestroy/lib/libc/gen X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Mar 2012 07:33:42 -0000 Author: davidxu Date: Wed Mar 21 07:33:41 2012 New Revision: 233267 URL: http://svn.freebsd.org/changeset/base/233267 Log: Only spin on SMP machine. Modified: user/davidxu/pth_objdestroy/lib/libc/gen/sem_new.c Modified: user/davidxu/pth_objdestroy/lib/libc/gen/sem_new.c ============================================================================== --- user/davidxu/pth_objdestroy/lib/libc/gen/sem_new.c Wed Mar 21 07:29:47 2012 (r233266) +++ user/davidxu/pth_objdestroy/lib/libc/gen/sem_new.c Wed Mar 21 07:33:41 2012 (r233267) @@ -74,6 +74,14 @@ struct sem_nameinfo { static pthread_once_t once = PTHREAD_ONCE_INIT; static pthread_mutex_t sem_llock; static LIST_HEAD(,sem_nameinfo) sem_list = LIST_HEAD_INITIALIZER(sem_list); +static int ncpu; + +static void +check_mp(void) +{ + if (ncpu == 0) + ncpu = sysconf(_SC_NPROCESSORS_CONF); +} static void sem_prefork() @@ -99,6 +107,8 @@ sem_module_init(void) { pthread_mutexattr_t ma; + check_mp(); + _pthread_mutexattr_init(&ma); _pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE); _pthread_mutex_init(&sem_llock, &ma); @@ -121,6 +131,7 @@ sem_check_validity(sem_t *sem) int _sem_init(sem_t *sem, int pshared, unsigned int value) { + check_mp(); if (value > SEM_VALUE_MAX) { errno = EINVAL; @@ -367,7 +378,7 @@ loops: return (0); } } - if (spins-- > 0) + if (ncpu > 1 && spins-- > 0) goto loops; return (EAGAIN); }