Add support for the semtimedop system call.

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
This commit is contained in:
Tom Hughes 2004-06-13 14:23:00 +00:00
parent 73500af01e
commit 05369f9e57
6 changed files with 92 additions and 2 deletions

View 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;

View 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

78
none/tests/sem.c Normal file
View File

@ -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);
}

View File

@ -0,0 +1,2 @@

View File

1
none/tests/sem.vgtest Normal file
View File

@ -0,0 +1 @@
prog: sem