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;