svn commit: r233267 - user/davidxu/pth_objdestroy/lib/libc/gen
David Xu
davidxu at FreeBSD.org
Wed Mar 21 07:33:42 UTC 2012
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);
}
More information about the svn-src-user
mailing list