svn commit: r201547 - head/lib/libc/gen

David Xu davidxu at FreeBSD.org
Tue Jan 5 03:39:31 UTC 2010


Author: davidxu
Date: Tue Jan  5 03:39:31 2010
New Revision: 201547
URL: http://svn.freebsd.org/changeset/base/201547

Log:
  Don't check has_waiters twice, inline some small functions.
  performance result on my machine:
  	mutex     Elapsed: 902115 us; per iteration: 90 ns.
  	semaphore Elapsed: 958780 us; per iteration: 95 ns.

Modified:
  head/lib/libc/gen/sem_new.c

Modified: head/lib/libc/gen/sem_new.c
==============================================================================
--- head/lib/libc/gen/sem_new.c	Tue Jan  5 02:37:59 2010	(r201546)
+++ head/lib/libc/gen/sem_new.c	Tue Jan  5 03:39:31 2010	(r201547)
@@ -331,7 +331,7 @@ _libc_sem_getvalue(sem_t * __restrict se
 	return (0);
 }
 
-static int
+static __inline int
 usem_wake(struct _usem *sem)
 {
 	if (!sem->_has_waiters)
@@ -339,7 +339,7 @@ usem_wake(struct _usem *sem)
 	return _umtx_op(sem, UMTX_OP_SEM_WAKE, 0, NULL, NULL);
 }
 
-static int
+static __inline int
 usem_wait(struct _usem *sem, const struct timespec *timeout)
 {
 	if (timeout && (timeout->tv_sec < 0 || (timeout->tv_sec == 0 &&
@@ -387,7 +387,7 @@ sem_cancel_handler(void *arg)
         } while (0)
 
 
-static int
+static __inline int
 enable_async_cancel(void)
 {
 	int old;
@@ -396,7 +396,7 @@ enable_async_cancel(void)
 	return (old);
 }
 
-static void
+static __inline void
 restore_async_cancel(int val)
 {
 	_pthread_setcanceltype(val, NULL);
@@ -413,7 +413,6 @@ _libc_sem_timedwait(sem_t * __restrict s
 		return (-1);
 
 	retval = 0;
-	_pthread_testcancel();
 	for (;;) {
 		while ((val = sem->_kern._count) > 0) {
 			if (atomic_cmpset_acq_int(&sem->_kern._count, val, val - 1))
@@ -464,7 +463,5 @@ _libc_sem_post(sem_t *sem)
 		return (-1);
 
 	atomic_add_rel_int(&sem->_kern._count, 1);
-	if (sem->_kern._has_waiters)
-		return usem_wake(&sem->_kern);
-	return (0);
+	return usem_wake(&sem->_kern);
 }


More information about the svn-src-all mailing list