]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add support for the semtimedop system call.
authorTom Hughes <tom@compton.nu>
Sun, 13 Jun 2004 14:23:00 +0000 (14:23 +0000)
committerTom Hughes <tom@compton.nu>
Sun, 13 Jun 2004 14:23:00 +0000 (14:23 +0000)
Based on patch from Peter Knaggs <sedragdnuon@yahoo.com>.

CCMAIL: 79714-done@bugs.kde.org

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2410

coregrind/vg_syscalls.c
none/tests/Makefile.am
none/tests/sem.c [new file with mode: 0644]
none/tests/sem.stderr.exp [new file with mode: 0644]
none/tests/sem.stdout.exp [new file with mode: 0644]
none/tests/sem.vgtest [new file with mode: 0644]

index c997a022f0dc3ec37e389b97ead6c1c2de9d6369..a54136f54fbd8cb73f4b9ed870da4e1b606af8e2 100644 (file)
@@ -2583,6 +2583,13 @@ PRE(ipc)
    case 2: /* IPCOP_semget */
    case 3: /* IPCOP_semctl */
       break;
+   case 4: /* IPCOP_semtimedop */
+      SYSCALL_TRACK( pre_mem_read, tid, "semtimedop(sops)", arg5, 
+                    arg3 * sizeof(struct sembuf) );
+      if (arg6 != (UInt)NULL)
+         SYSCALL_TRACK( pre_mem_read, tid, "semtimedop(timeout)", arg5, 
+                        sizeof(struct timespec) );
+      break;
    case 11: /* IPCOP_msgsnd */
    {
       struct msgbuf *msgp = (struct msgbuf *)arg5;
@@ -2710,9 +2717,9 @@ POST(ipc)
 {
    switch (arg1 /* call */) {
    case 1: /* IPCOP_semop */
-      break;
    case 2: /* IPCOP_semget */
    case 3: /* IPCOP_semctl */
+   case 4: /* IPCOP_semtimedop */
       break;
    case 11: /* IPCOP_msgsnd */
       break;
index bdc854d41bcbdbf2d0d950c6c12cbe8f7270928e..31f2713fbbbf3b59371d269a06cdf7510f0d306a 100644 (file)
@@ -45,6 +45,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \
        resolv.stderr.exp resolv.stdout.exp resolv.vgtest \
        seg_override.stderr.exp \
        seg_override.stdout.exp seg_override.vgtest \
+       sem.stderr.exp sem.stdout.exp sem.vgtest \
        semlimit.stderr.exp semlimit.stdout.exp semlimit.vgtest \
        susphello.stdout.exp susphello.stderr.exp susphello.vgtest \
        sha1_test.stderr.exp sha1_test.vgtest \
@@ -62,7 +63,7 @@ check_PROGRAMS = \
        cpuid dastest discard exec-sigmask floored fork fpu_lazy_eflags \
        fucomip $(INSN_TESTS) \
        int munmap_exe map_unmap mremap rcl_assert \
-       rcrl readline1 resolv seg_override semlimit sha1_test \
+       rcrl readline1 resolv seg_override sem semlimit sha1_test \
        shortpush shorts smc1 susphello pth_blockedsig pushpopseg \
        syscall-restart1 syscall-restart2 system \
        coolo_sigaction gxx304 yield
@@ -111,6 +112,7 @@ rcrl_SOURCES                = rcrl.c
 readline1_SOURCES      = readline1.c
 resolv_SOURCES                 = resolv.c
 seg_override_SOURCES   = seg_override.c
+sem_SOURCES            = sem.c
 semlimit_SOURCES       = semlimit.c
 semlimit_LDADD         = -lpthread
 smc1_SOURCES           = smc1.c
diff --git a/none/tests/sem.c b/none/tests/sem.c
new file mode 100644 (file)
index 0000000..4e26b36
--- /dev/null
@@ -0,0 +1,78 @@
+#define _GNU_SOURCE
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+
+int main(int argc, char **argv)
+{
+   int semid;
+   struct sembuf sop;
+   struct timespec ts;
+   
+   if ((semid = semget(IPC_PRIVATE, 1, 0600)) < 0)
+   {
+      perror("semget");
+      exit(1);
+   }
+
+   sop.sem_num = 0;
+   sop.sem_op = 1;
+   sop.sem_flg = 0;
+   
+   if (semop(semid, &sop, 1) < 0)
+   {
+      perror("semop");
+      semctl(semid, 0, IPC_RMID);
+      exit(1);
+   }
+
+   sop.sem_num = 0;
+   sop.sem_op = 0;
+   sop.sem_flg = 0;
+
+   ts.tv_sec = 0;
+   ts.tv_nsec = 1000;
+   
+   if (semtimedop(semid, &sop, 1, &ts) < 0 && errno != EAGAIN)
+   {
+      perror("semtimedop");
+      semctl(semid, 0, IPC_RMID);
+      exit(1);
+   }
+
+   sop.sem_num = 0;
+   sop.sem_op = -1;
+   sop.sem_flg = 0;
+   
+   if (semop(semid, &sop, 1) < 0)
+   {
+      perror("semop");
+      semctl(semid, 0, IPC_RMID);
+      exit(1);
+   }
+
+   sop.sem_num = 0;
+   sop.sem_op = 0;
+   sop.sem_flg = 0;
+
+   ts.tv_sec = 0;
+   ts.tv_nsec = 1000;
+   
+   if (semtimedop(semid, &sop, 1, &ts) < 0)
+   {
+      perror("semtimedop");
+      semctl(semid, 0, IPC_RMID);
+      exit(1);
+   }
+
+   if (semctl(semid, 0, IPC_RMID) < 0)
+   {
+      perror("semctl(IPC_RMID)");
+      exit(1);
+   }
+         
+   exit(0);
+}
diff --git a/none/tests/sem.stderr.exp b/none/tests/sem.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/sem.stdout.exp b/none/tests/sem.stdout.exp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/none/tests/sem.vgtest b/none/tests/sem.vgtest
new file mode 100644 (file)
index 0000000..b30577d
--- /dev/null
@@ -0,0 +1 @@
+prog: sem