Fixed the sem test to work on systems with semtimedop.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2414 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/configure.in b/configure.in
index e83ff8f..fc4e7b0 100644
--- a/configure.in
+++ b/configure.in
@@ -345,7 +345,7 @@
 AC_FUNC_MMAP
 AC_TYPE_SIGNAL
 
-AC_CHECK_FUNCS([floor memchr memset mkdir strchr strdup strpbrk strrchr strstr])
+AC_CHECK_FUNCS([floor memchr memset mkdir strchr strdup strpbrk strrchr strstr semtimedop])
 
 AC_OUTPUT(
    Makefile 
diff --git a/none/tests/sem.c b/none/tests/sem.c
index 4e26b36..3eddaff 100644
--- a/none/tests/sem.c
+++ b/none/tests/sem.c
@@ -6,6 +6,56 @@
 #include <sys/ipc.h>
 #include <sys/sem.h>
 
+#ifndef HAVE_SEMTIMEDOP
+
+#include <signal.h>
+#include <sys/time.h>
+
+static int semtimedop(int  semid, struct sembuf *sops, unsigned nsops,
+                      struct timespec *timeout)
+{
+   struct sigaction act;
+   struct sigaction oldact;
+   struct itimerval itv;
+   int rv;
+
+   act.sa_handler = SIG_IGN;
+   sigemptyset( &act.sa_mask );
+   act.sa_flags = 0;
+   
+   if (sigaction(SIGALRM, &act, &oldact) < 0)
+   {
+      perror("sigaction");
+      exit(1);
+   }
+   
+   itv.it_interval.tv_sec = 0;
+   itv.it_interval.tv_usec = 0;
+   itv.it_value.tv_sec = timeout->tv_sec;
+   itv.it_value.tv_usec = timeout->tv_nsec / 1000;
+   
+   if (setitimer(ITIMER_REAL, &itv, NULL) < 0)
+   {
+      perror("setitimer");
+      exit(1);
+   }
+   
+   if ((rv = semop(semid, sops, nsops)) < 0 && errno == EINTR)
+   {
+      errno = EAGAIN;
+   }
+
+   if (sigaction(SIGALRM, &oldact, NULL) < 0)
+   {
+      perror("sigaction");
+      exit(1);
+   }
+   
+   return rv;
+}
+
+#endif
+
 int main(int argc, char **argv)
 {
    int semid;