diff --git a/coregrind/vg_syscalls.c b/coregrind/vg_syscalls.c index c997a022f..a54136f54 100644 --- a/coregrind/vg_syscalls.c +++ b/coregrind/vg_syscalls.c @@ -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; diff --git a/none/tests/Makefile.am b/none/tests/Makefile.am index bdc854d41..31f2713fb 100644 --- a/none/tests/Makefile.am +++ b/none/tests/Makefile.am @@ -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 index 000000000..4e26b369f --- /dev/null +++ b/none/tests/sem.c @@ -0,0 +1,78 @@ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include + +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 index 000000000..139597f9c --- /dev/null +++ b/none/tests/sem.stderr.exp @@ -0,0 +1,2 @@ + + diff --git a/none/tests/sem.stdout.exp b/none/tests/sem.stdout.exp new file mode 100644 index 000000000..e69de29bb diff --git a/none/tests/sem.vgtest b/none/tests/sem.vgtest new file mode 100644 index 000000000..b30577db7 --- /dev/null +++ b/none/tests/sem.vgtest @@ -0,0 +1 @@ +prog: sem