From: Tom Hughes Date: Sun, 13 Jun 2004 14:23:00 +0000 (+0000) Subject: Add support for the semtimedop system call. X-Git-Tag: svn/VALGRIND_2_1_2~97 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=05369f9e57840b43e0f91e28e8130a550b47c6e2;p=thirdparty%2Fvalgrind.git Add support for the semtimedop system call. Based on patch from Peter Knaggs . CCMAIL: 79714-done@bugs.kde.org git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2410 --- diff --git a/coregrind/vg_syscalls.c b/coregrind/vg_syscalls.c index c997a022f0..a54136f54f 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 bdc854d41b..31f2713fbb 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 0000000000..4e26b369f4 --- /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 0000000000..139597f9cb --- /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 0000000000..e69de29bb2 diff --git a/none/tests/sem.vgtest b/none/tests/sem.vgtest new file mode 100644 index 0000000000..b30577db73 --- /dev/null +++ b/none/tests/sem.vgtest @@ -0,0 +1 @@ +prog: sem