spin in sem_[timed]wait before performing futex wait
authorRich Felker <dalias@aerifal.cx>
Mon, 25 Aug 2014 20:38:25 +0000 (16:38 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 25 Aug 2014 20:38:25 +0000 (16:38 -0400)
empirically, this increases the maximum rate of wait/post operations
between two threads by 20-150 times on machines I tested, including
x86 and arm. conceptually, it makes sense to do some spinning because
semaphores are intended to be usable as a notification mechanism
between threads, not just as locks, and low-latency notification is a
valuable property to have.

src/thread/sem_timedwait.c

index bfcb6dc..df5f3a6 100644 (file)
@@ -8,6 +8,11 @@ static void cleanup(void *p)
 
 int sem_timedwait(sem_t *restrict sem, const struct timespec *restrict at)
 {
+       if (!sem_trywait(sem)) return 0;
+
+       int spins = 100;
+       while (spins-- && sem->__val[0] <= 0) a_spin();
+
        while (sem_trywait(sem)) {
                int r;
                a_inc(sem->__val+1);