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
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;
{
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;
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 \
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
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
--- /dev/null
+#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);
+}