|
From: Tom H. <th...@cy...> - 2004-06-14 12:33:49
|
CVS commit by thughes:
Fixed the sem test to work on systems with semtimedop.
M +1 -1 configure.in 1.111
M +50 -0 none/tests/sem.c 1.2
--- valgrind/configure.in #1.110:1.111
@@ -346,5 +346,5 @@
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(
--- valgrind/none/tests/sem.c #1.1:1.2
@@ -7,4 +7,54 @@
#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)
{
|