From d903678ae9b7427be5e63d875344bf4f250546e3 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 2 Apr 2003 23:49:47 +0000 Subject: [PATCH] Update. 2003-04-02 Ulrich Drepper * sysdeps/unix/sysv/linux/ipc_priv.h: Define IPCOP_semtimedop. * sysdeps/generic/semtimedop.c: New file. * sysdeps/unix/sysv/linux/i386/semtimedop.S: New file. * sysdeps/unix/sysv/linux/ia64/syscalls.list: Add semtimedop. * sysdeps/unix/sysv/linux/x86_64/syscalls.list: Likewise. * sysvipc/Makefile (routines): Add semtimedop. * sysvipc/Versions [GLIBC_2.3.3] (glibc): Add semtimedop. * sysvipc/sys/sem.h: Declare semtimedop. --- ChangeLog | 11 ++++ sysdeps/unix/sysv/linux/i386/semtimedop.S | 63 ++++++++++++++++++++ sysdeps/unix/sysv/linux/ia64/syscalls.list | 1 + sysdeps/unix/sysv/linux/ipc_priv.h | 3 +- sysdeps/unix/sysv/linux/x86_64/syscalls.list | 1 + sysvipc/Makefile | 4 +- sysvipc/Versions | 4 ++ sysvipc/sys/sem.h | 13 +++- 8 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/i386/semtimedop.S diff --git a/ChangeLog b/ChangeLog index 275bcbc878..77c9774a5c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2003-04-02 Ulrich Drepper + + * sysdeps/unix/sysv/linux/ipc_priv.h: Define IPCOP_semtimedop. + * sysdeps/generic/semtimedop.c: New file. + * sysdeps/unix/sysv/linux/i386/semtimedop.S: New file. + * sysdeps/unix/sysv/linux/ia64/syscalls.list: Add semtimedop. + * sysdeps/unix/sysv/linux/x86_64/syscalls.list: Likewise. + * sysvipc/Makefile (routines): Add semtimedop. + * sysvipc/Versions [GLIBC_2.3.3] (glibc): Add semtimedop. + * sysvipc/sys/sem.h: Declare semtimedop. + 2003-04-02 Daniel Jacobowitz * configure.in: Check for __register_frame_info in both diff --git a/sysdeps/unix/sysv/linux/i386/semtimedop.S b/sysdeps/unix/sysv/linux/i386/semtimedop.S new file mode 100644 index 0000000000..572641675f --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/semtimedop.S @@ -0,0 +1,63 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2003. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include + +#define SYSOP_semtimedop 4 + +#define SVRSP 12 /* saved register space */ +#define PARMS LINKAGE+SVRSP /* space for 3 saved regs */ +#define SEMID PARMS +#define SOPS SEMID+4 +#define NSOPS SOPS+PTR_SIZE +#define TIMEOUT NSOPS+4 + + .text +ENTRY (BP_SYM (semtimedop)) + + pushl %ebp + pushl %ebx + pushl %edi + + movl $SYSOP_semtimedop, %ebx + movl SEMID(%esp), %ecx + movl NSOPS(%esp), %edx + movl SOPS(%esp), %edi + movl TIMEOUT(%esp), %ebp + movl $__NR_ipc, %eax + + ENTER_KERNEL + + /* Restore registers. */ + popl %edi + popl %ebx + popl %ebp + + /* If 0 > %eax > -4096 there was an error. */ + cmpl $-4096, %eax + ja SYSCALL_ERROR_LABEL + + /* Successful; return the syscall's value. */ +L(pseudo_end): + ret + +#ifdef PIC + .align 4 +#endif +PSEUDO_END (BP_SYM (semtimedop)) diff --git a/sysdeps/unix/sysv/linux/ia64/syscalls.list b/sysdeps/unix/sysv/linux/ia64/syscalls.list index 0985cc97a2..c2027b670f 100644 --- a/sysdeps/unix/sysv/linux/ia64/syscalls.list +++ b/sysdeps/unix/sysv/linux/ia64/syscalls.list @@ -30,6 +30,7 @@ shmctl - shmctl i:iip __shmctl shmctl shmdt - shmdt i:s __shmdt shmdt shmget - shmget i:iii __shmget shmget semop - semop i:ipi __semop semop +semtimedop - semtimedop i:ipip semtimedop semget - semget i:iii __semget semget semctl - semctl i:iiii __semctl semctl diff --git a/sysdeps/unix/sysv/linux/ipc_priv.h b/sysdeps/unix/sysv/linux/ipc_priv.h index 4d11950b04..564bee13bb 100644 --- a/sysdeps/unix/sysv/linux/ipc_priv.h +++ b/sysdeps/unix/sysv/linux/ipc_priv.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 @@ -44,6 +44,7 @@ __END_DECLS #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/sysdeps/unix/sysv/linux/x86_64/syscalls.list b/sysdeps/unix/sysv/linux/x86_64/syscalls.list index 64abc4fc74..7d050c7815 100644 --- a/sysdeps/unix/sysv/linux/x86_64/syscalls.list +++ b/sysdeps/unix/sysv/linux/x86_64/syscalls.list @@ -25,6 +25,7 @@ shmctl - shmctl i:iip __shmctl shmctl shmdt - shmdt i:s __shmdt shmdt shmget - shmget i:iii __shmget shmget semop - semop i:ipi __semop semop +semtimedop - semtimedop i:ipip semtimedop semget - semget i:iii __semget semget semctl - semctl i:iiii __semctl semctl diff --git a/sysvipc/Makefile b/sysvipc/Makefile index 0e4c105c3d..62016d287b 100644 --- a/sysvipc/Makefile +++ b/sysvipc/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1995, 1996, 1997, 2002 Free Software Foundation, Inc. +# Copyright (C) 1995, 1996, 1997, 2002, 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 @@ -26,7 +26,7 @@ headers := sys/ipc.h sys/msg.h sys/sem.h sys/shm.h \ routines := ftok \ msgsnd msgrcv msgget msgctl \ - semop semget semctl \ + semop semget semctl semtimedop \ shmat shmdt shmget shmctl include ../Rules diff --git a/sysvipc/Versions b/sysvipc/Versions index 57ebc1f17e..4c797e25ce 100644 --- a/sysvipc/Versions +++ b/sysvipc/Versions @@ -9,6 +9,10 @@ libc { # s* semctl; semget; semop; shmat; shmctl; shmdt; shmget; } + GLIBC_2.3.3 { + # Non-standard function. + semtimedop; + } GLIBC_PRIVATE { # Cancellation point entries. __libc_msgrcv; __libc_msgsnd; diff --git a/sysvipc/sys/sem.h b/sysvipc/sys/sem.h index 5b1d38f529..24a57fc32e 100644 --- a/sysvipc/sys/sem.h +++ b/sysvipc/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 */