$OpenBSD: patch-src_fifo_cpp,v 1.3 2014/03/20 18:10:29 ajacoutot Exp $
--- src/fifo.cpp.orig	Tue Mar  4 17:47:15 2014
+++ src/fifo.cpp	Thu Mar 20 19:03:08 2014
@@ -41,6 +41,12 @@
 #include "wave.h"
 #include "debug.h"
 
+#ifndef timespeccmp
+#define	timespeccmp(tvp, uvp, cmp)					\
+	(((tvp)->tv_sec == (uvp)->tv_sec) ?				\
+	    ((tvp)->tv_nsec cmp (uvp)->tv_nsec) :			\
+	    ((tvp)->tv_sec cmp (uvp)->tv_sec))
+#endif
 
 //>
 //<decls and function prototypes
@@ -312,10 +318,14 @@ static int sleep_until_start_request_or_inactivity()
 			to.tv_sec, to.tv_nsec,
 			ts.tv_sec, ts.tv_nsec);
 
-		while ((err = sem_timedwait(&my_sem_start_is_required, &ts)) == -1
-			&& errno == EINTR)
+		while ((err = sem_trywait(&my_sem_start_is_required)) == -1
+			&& (errno == EINTR || errno == EAGAIN))
 		{
-			continue;
+			struct timespec help;
+			clock_gettime2(&help);
+			if (timespeccmp(&help, &ts, >=))
+				break;
+			sched_yield();
 		}
 
 		assert (gettimeofday(&tv, NULL) != -1);
