From ee438a1eb65d4092116df23ce029fa98bc5ea162 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Sat, 5 Jan 2008 06:47:30 +0000 Subject: implement semtimedop for #927 --- include/sys/sem.h | 13 ++++++++++++- libc/misc/sysvipc/Makefile.in | 4 ++-- libc/misc/sysvipc/__syscall_ipc.c | 17 +++++++++++++++++ libc/misc/sysvipc/ipc.h | 5 +++-- libc/misc/sysvipc/msgq.c | 8 ++++---- libc/misc/sysvipc/sem.c | 21 ++++++++++++++++++--- libc/misc/sysvipc/semtimedop.c | 8 ++++++++ libc/misc/sysvipc/shm.c | 8 ++++---- libc/sysdeps/linux/common/__syscall_ipc.c | 17 ----------------- 9 files changed, 68 insertions(+), 33 deletions(-) create mode 100644 libc/misc/sysvipc/__syscall_ipc.c create mode 100644 libc/misc/sysvipc/semtimedop.c delete mode 100644 libc/sysdeps/linux/common/__syscall_ipc.c diff --git a/include/sys/sem.h b/include/sys/sem.h index 5b1d38f52..24a57fc32 100644 --- a/include/sys/sem.h +++ b/include/sys/sem.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1995-1999, 2000, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -30,6 +30,11 @@ /* Get system dependent definition of `struct semid_ds' and more. */ #include +#ifdef __USE_GNU +# define __need_timespec +# include +#endif + /* The following System V style IPC functions implement a semaphore handling. The definition is found in XPG2. */ @@ -53,6 +58,12 @@ extern int semget (key_t __key, int __nsems, int __semflg) __THROW; /* Operate on semaphore. */ extern int semop (int __semid, struct sembuf *__sops, size_t __nsops) __THROW; +#ifdef __USE_GNU +/* Operate on semaphore with timeout. */ +extern int semtimedop (int __semid, struct sembuf *__sops, size_t __nsops, + __const struct timespec *__timeout) __THROW; +#endif + __END_DECLS #endif /* sys/sem.h */ diff --git a/libc/misc/sysvipc/Makefile.in b/libc/misc/sysvipc/Makefile.in index 4c865dc49..6b88ad6f0 100644 --- a/libc/misc/sysvipc/Makefile.in +++ b/libc/misc/sysvipc/Makefile.in @@ -5,10 +5,10 @@ # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. # -CSRC := ftok.c +CSRC := ftok.c __syscall_ipc.c # multi source sem.c -CSRC += semget.c semctl.c semop.c +CSRC += semget.c semctl.c semop.c semtimedop.c # multi source shm.c CSRC += shmat.c shmctl.c shmdt.c shmget.c diff --git a/libc/misc/sysvipc/__syscall_ipc.c b/libc/misc/sysvipc/__syscall_ipc.c new file mode 100644 index 000000000..99dfbf49f --- /dev/null +++ b/libc/misc/sysvipc/__syscall_ipc.c @@ -0,0 +1,17 @@ +/* vi: set sw=4 ts=4: */ +/* + * __syscall_ipc() for uClibc + * + * Copyright (C) 2000-2006 Erik Andersen + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#include + +#ifdef __NR_ipc +#define __NR___syscall_ipc __NR_ipc +#include "ipc.h" +_syscall6(int, __syscall_ipc, unsigned int, call, long, first, long, second, long, + third, void *, ptr, void *, fifth); +#endif diff --git a/libc/misc/sysvipc/ipc.h b/libc/misc/sysvipc/ipc.h index 5bdbe6471..339d1364b 100644 --- a/libc/misc/sysvipc/ipc.h +++ b/libc/misc/sysvipc/ipc.h @@ -12,14 +12,15 @@ #ifdef __NR_ipc /* The actual system call: all functions are multiplexed by this. */ -extern int __syscall_ipc (unsigned int __call, int __first, int __second, - int __third, void *__ptr) attribute_hidden; +extern int __syscall_ipc (unsigned int __call, long __first, long __second, + long __third, void *__ptr, void *__fifth) attribute_hidden; /* The codes for the functions to use the multiplexer `__syscall_ipc'. */ #define IPCOP_semop 1 #define IPCOP_semget 2 #define IPCOP_semctl 3 +#define IPCOP_semtimedop 4 #define IPCOP_msgsnd 11 #define IPCOP_msgrcv 12 #define IPCOP_msgget 13 diff --git a/libc/misc/sysvipc/msgq.c b/libc/misc/sysvipc/msgq.c index f56bb4e8a..c1ab27626 100644 --- a/libc/misc/sysvipc/msgq.c +++ b/libc/misc/sysvipc/msgq.c @@ -15,7 +15,7 @@ int msgctl(int msqid, int cmd, struct msqid_ds *buf) #ifdef __NR_msgctl return __libc_msgctl(msqid, cmd | __IPC_64, buf); #else - return __syscall_ipc(IPCOP_msgctl, msqid, cmd | __IPC_64, 0, buf); + return __syscall_ipc(IPCOP_msgctl, msqid, cmd | __IPC_64, 0, buf, 0); #endif } #endif @@ -28,7 +28,7 @@ _syscall2(int, msgget, key_t, key, int, msgflg) /* Get messages queue. */ int msgget (key_t key, int msgflg) { - return __syscall_ipc(IPCOP_msgget ,key ,msgflg ,0 ,0); + return __syscall_ipc(IPCOP_msgget ,key ,msgflg ,0 ,0, 0); } #endif #endif @@ -52,7 +52,7 @@ int msgrcv (int msqid, void *msgp, size_t msgsz, temp.r_msgtyp = msgtyp; temp.oldmsg = msgp; - return __syscall_ipc(IPCOP_msgrcv ,msqid ,msgsz ,msgflg ,&temp); + return __syscall_ipc(IPCOP_msgrcv ,msqid ,msgsz ,msgflg ,&temp, 0); } #endif #endif @@ -66,7 +66,7 @@ _syscall4(int, msgsnd, int, msqid, const void *, msgp, size_t, msgsz, int, msgfl /* Send message to message queue. */ int msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg) { - return __syscall_ipc(IPCOP_msgsnd, msqid, msgsz, msgflg, (void *)msgp); + return __syscall_ipc(IPCOP_msgsnd, msqid, msgsz, msgflg, (void *)msgp, 0); } #endif #endif diff --git a/libc/misc/sysvipc/sem.c b/libc/misc/sysvipc/sem.c index ccbe25b46..ce259a10e 100644 --- a/libc/misc/sysvipc/sem.c +++ b/libc/misc/sysvipc/sem.c @@ -53,7 +53,7 @@ int semctl(int semid, int semnum, int cmd, ...) #ifdef __NR_semctl return __semctl(semid, semnum, cmd | __IPC_64, arg.__pad); #else - return __syscall_ipc(IPCOP_semctl, semid, semnum, cmd | __IPC_64, &arg); + return __syscall_ipc(IPCOP_semctl, semid, semnum, cmd | __IPC_64, &arg, 0); #endif } #endif @@ -70,7 +70,7 @@ _syscall3(int, semget, key_t, key, int, nsems, int, semflg); * with KEY. */ int semget (key_t key, int nsems, int semflg) { - return __syscall_ipc(IPCOP_semget, key, nsems, semflg, NULL); + return __syscall_ipc(IPCOP_semget, key, nsems, semflg, NULL, 0); } #endif #endif @@ -84,7 +84,22 @@ _syscall3(int, semop, int, semid, struct sembuf *, sops, size_t, nsops); /* Perform user-defined atomical operation of array of semaphores. */ int semop (int semid, struct sembuf *sops, size_t nsops) { - return __syscall_ipc(IPCOP_semop, semid, (int) nsops, 0, sops); + return __syscall_ipc(IPCOP_semop, semid, (int) nsops, 0, sops, 0); +} +#endif +#endif + +#ifdef L_semtimedop + +#ifdef __NR_semtimedop +_syscall6(int, semtimedop, int, semid, struct sembuf *, sops, size_t, nsops, const struct timespec *, timeout); + +#else + +int semtimedop(int semid, struct sembuf *sops, size_t nsops, + const struct timespec *timeout) +{ + return __syscall_ipc(IPCOP_semtimedop, semid, nsops, 0, sops, timeout); } #endif #endif diff --git a/libc/misc/sysvipc/semtimedop.c b/libc/misc/sysvipc/semtimedop.c new file mode 100644 index 000000000..ecd0438f5 --- /dev/null +++ b/libc/misc/sysvipc/semtimedop.c @@ -0,0 +1,8 @@ +/* + * Copyright (C) 2000-2006 Erik Andersen + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#define L_semtimedop +#include "sem.c" diff --git a/libc/misc/sysvipc/shm.c b/libc/misc/sysvipc/shm.c index a466de921..9f76a12ed 100644 --- a/libc/misc/sysvipc/shm.c +++ b/libc/misc/sysvipc/shm.c @@ -45,7 +45,7 @@ void * shmat (int shmid, const void *shmaddr, int shmflg) int retval; unsigned long raddr; - retval = __syscall_ipc(IPCOP_shmat, shmid, shmflg, (int) &raddr, (void *) shmaddr); + retval = __syscall_ipc(IPCOP_shmat, shmid, shmflg, (int) &raddr, (void *) shmaddr, 0); return ((unsigned long int) retval > -(unsigned long int) SHMLBA ? (void *) retval : (void *) raddr); } @@ -63,7 +63,7 @@ int shmctl(int shmid, int cmd, struct shmid_ds *buf) #ifdef __NR_shmctl return __libc_shmctl(shmid, cmd | __IPC_64, buf); #else - return __syscall_ipc(IPCOP_shmctl, shmid, cmd | __IPC_64, 0, buf); + return __syscall_ipc(IPCOP_shmctl, shmid, cmd | __IPC_64, 0, buf, 0); #endif } #endif @@ -77,7 +77,7 @@ _syscall1(int, shmdt, const void *, shmaddr); #else int shmdt (const void *shmaddr) { - return __syscall_ipc(IPCOP_shmdt, 0, 0, 0, (void *) shmaddr); + return __syscall_ipc(IPCOP_shmdt, 0, 0, 0, (void *) shmaddr, 0); } #endif #endif @@ -90,7 +90,7 @@ _syscall3(int, shmget, key_t, key, size_t, size, int, shmflg); #else int shmget (key_t key, size_t size, int shmflg) { - return __syscall_ipc(IPCOP_shmget, key, size, shmflg, NULL); + return __syscall_ipc(IPCOP_shmget, key, size, shmflg, NULL, 0); } #endif #endif diff --git a/libc/sysdeps/linux/common/__syscall_ipc.c b/libc/sysdeps/linux/common/__syscall_ipc.c deleted file mode 100644 index d46b142fb..000000000 --- a/libc/sysdeps/linux/common/__syscall_ipc.c +++ /dev/null @@ -1,17 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * __syscall_ipc() for uClibc - * - * Copyright (C) 2000-2006 Erik Andersen - * - * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. - */ - -#include - -#ifdef __NR_ipc -#define __NR___syscall_ipc __NR_ipc -#include "../../../misc/sysvipc/ipc.h" -_syscall5(int, __syscall_ipc, unsigned int, call, int, first, int, second, int, - third, void *, ptr); -#endif -- cgit v1.2.3