From d7aaa51dffc2d29192b64b382590d6752c82c3a3 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Sun, 25 Aug 2002 00:08:23 +0000 Subject: Make shm stuff work properly. -Erik --- libc/misc/sysvipc/sem.c | 19 ++++++++----------- libc/sysdeps/linux/common/bits/ipc.h | 26 +++++++++++++------------- libc/sysdeps/linux/common/bits/sem.h | 19 +++++++++---------- 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/libc/misc/sysvipc/sem.c b/libc/misc/sysvipc/sem.c index 46b4821a4..a3eaca7be 100644 --- a/libc/misc/sysvipc/sem.c +++ b/libc/misc/sysvipc/sem.c @@ -26,13 +26,13 @@ /* Return identifier for array of NSEMS semaphores associated with KEY. */ #include -/* Define a `union semun' suitable for Linux here. */ -union semun -{ +/* arg for semctl system calls. */ +union semun { int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ - unsigned short int *array; /* array for GETALL & SETALL */ - struct seminfo *__buf; /* buffer for IPC_INFO */ + unsigned short *array; /* array for GETALL & SETALL */ + struct seminfo *__buf; /* buffer for IPC_INFO */ + void *__pad; }; @@ -41,18 +41,15 @@ union semun static inline _syscall4(int, __semctl, int, semid, int, semnum, int, cmd, union semun *, arg); #endif -int semctl (int semid, int semnum, int cmd, ...) +int semctl(int semid, int semnum, int cmd, ...) { union semun arg; - va_list ap; - - va_start (ap, cmd); + va_list ap; /* Get the argument. */ + va_start (ap, cmd); arg = va_arg (ap, union semun); - va_end (ap); - #ifdef __NR_semctl return __semctl(semid, semnum, cmd, &arg); #else diff --git a/libc/sysdeps/linux/common/bits/ipc.h b/libc/sysdeps/linux/common/bits/ipc.h index f1a043fe5..54412ff32 100644 --- a/libc/sysdeps/linux/common/bits/ipc.h +++ b/libc/sysdeps/linux/common/bits/ipc.h @@ -35,22 +35,22 @@ # define IPC_INFO 3 /* See ipcs. */ #endif +/* Type of a SYSV IPC key. */ +typedef int __kernel_key_t; + /* Special key values. */ #define IPC_PRIVATE ((__key_t) 0) /* Private key. */ /* Data structure used to pass permission information to IPC operations. */ struct ipc_perm - { - __key_t __key; /* Key. */ - __uid_t uid; /* Owner's user ID. */ - __gid_t gid; /* Owner's group ID. */ - __uid_t cuid; /* Creator's user ID. */ - __gid_t cgid; /* Creator's group ID. */ - unsigned short int mode; /* Read/write permission. */ - unsigned short int __pad1; - unsigned short int __seq; /* Sequence number. */ - unsigned short int __pad2; - unsigned long int __unused1; - unsigned long int __unused2; - }; +{ + __kernel_key_t key; + __kernel_uid_t uid; + __kernel_gid_t gid; + __kernel_uid_t cuid; + __kernel_gid_t cgid; + __kernel_mode_t mode; + unsigned short seq; +}; + diff --git a/libc/sysdeps/linux/common/bits/sem.h b/libc/sysdeps/linux/common/bits/sem.h index 6193501e2..864e0a947 100644 --- a/libc/sysdeps/linux/common/bits/sem.h +++ b/libc/sysdeps/linux/common/bits/sem.h @@ -36,16 +36,15 @@ /* Data structure describing a set of semaphores. */ -struct semid_ds -{ - struct ipc_perm sem_perm; /* operation permission struct */ - __time_t sem_otime; /* last semop() time */ - unsigned long int __unused1; - __time_t sem_ctime; /* last time changed by semctl() */ - unsigned long int __unused2; - unsigned long int sem_nsems; /* number of semaphores in set */ - unsigned long int __unused3; - unsigned long int __unused4; +struct semid_ds { + struct ipc_perm sem_perm; /* permissions .. see ipc.h */ + time_t sem_otime; /* last semop time */ + time_t sem_ctime; /* last change time */ + struct sem *sem_base; /* ptr to first semaphore in array */ + struct sem_queue *sem_pending; /* pending operations to be processed */ + struct sem_queue **sem_pending_last; /* last pending operation */ + struct sem_undo *undo; /* undo requests on this array */ + unsigned short sem_nsems; /* no. of semaphores in array */ }; /* The user should define a union like the following to use it for arguments -- cgit v1.2.3