Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Mar 2012 07:33:41 +0000 (UTC)
From:      David Xu <davidxu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r233267 - user/davidxu/pth_objdestroy/lib/libc/gen
Message-ID:  <201203210733.q2L7XfvT060084@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }



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