diff options
author | Joseph Myers <joseph@codesourcery.com> | 2018-10-17 11:56:28 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2018-10-17 11:56:28 +0000 |
commit | 729f34028a7f494b599a29889df825cf826b6de0 (patch) | |
tree | 240e9b7f62d704af1e262f1223bec5c077b5790c /sysdeps/unix/sysv/linux/bits/shm.h | |
parent | 8c8d2a8aff71e0c53b372871f158c121289452cf (diff) | |
download | glibc-729f34028a7f494b599a29889df825cf826b6de0.tar.gz glibc-729f34028a7f494b599a29889df825cf826b6de0.tar.xz glibc-729f34028a7f494b599a29889df825cf826b6de0.zip |
Use single bits/shm.h for all architectures.
After my patch to move SHMLBA to its own header, the bits/shm.h headers for architectures using the Linux kernel still vary in a few ways: the use of __syscall_ulong_t; whether padding for 32-bit systems is present before or after time fields, or missing altogether (mips, x32); whether shm_segsz is before or after the time fields; whether, if after time fields, there is extra padding before shm_segsz. This patch arranges for a single header to be used. __syscall_ulong_t is safe to use everywhere, while bits/shm-pad.h is added with new macros __SHM_PAD_AFTER_TIME, __SHM_PAD_BEFORE_TIME, __SHM_SEGSZ_AFTER_TIME and __SHM_PAD_BETWEEN_TIME_AND_SEGSZ to describe the differences. Tested for x86_64 and x86, and with build-many-glibcs.py. * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/shm-pad.h. * sysdeps/unix/sysv/linux/bits/shm.h: Include <bits/shm-pad.h>. (shmatt_t): Define as __syscall_ulong_t. (__SHM_PAD_TIME): New macro, depending on [__SHM_PAD_BEFORE_TIME] and [__SHM_PAD_AFTER_TIME]. (struct shmid_ds): Define time fields using __SHM_PAD_TIME. Define shm_segsz and associated padding based on [__SHM_SEGSZ_AFTER_TIME] and [__SHM_PAD_BETWEEN_TIME_AND_SEGSZ]. Use __syscall_ulong_t instead of unsigned long int. [__USE_MISC] (struct shminfo): Use __syscall_ulong_t instead of unsigned long int. [__USE_MISC] (struct shm_info): Likewise. * sysdeps/unix/sysv/linux/bits/shm-pad.h: New file. * sysdeps/unix/sysv/linux/hppa/bits/shm-pad.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/shm-pad.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/shm-pad.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/shm-pad.h: Likewise. * sysdeps/unix/sysv/linux/x86/bits/shm-pad.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/shm.h: Remove. * sysdeps/unix/sysv/linux/mips/bits/shm.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/shm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/shm.h: Likewise. * sysdeps/unix/sysv/linux/x86/bits/shm.h: Likewise.
Diffstat (limited to 'sysdeps/unix/sysv/linux/bits/shm.h')
-rw-r--r-- | sysdeps/unix/sysv/linux/bits/shm.h | 63 |
1 files changed, 37 insertions, 26 deletions
diff --git a/sysdeps/unix/sysv/linux/bits/shm.h b/sysdeps/unix/sysv/linux/bits/shm.h index c305ee4e72..68ac6e970f 100644 --- a/sysdeps/unix/sysv/linux/bits/shm.h +++ b/sysdeps/unix/sysv/linux/bits/shm.h @@ -22,6 +22,7 @@ #include <bits/types.h> #include <bits/wordsize.h> #include <bits/shmlba.h> +#include <bits/shm-pad.h> /* Permission flag for shmget. */ #define SHM_R 0400 /* or S_IRUGO from <linux/stat.h> */ @@ -40,30 +41,40 @@ __BEGIN_DECLS /* Type to count number of attaches. */ -typedef unsigned long int shmatt_t; +typedef __syscall_ulong_t shmatt_t; + +#if __SHM_PAD_BEFORE_TIME +# define __SHM_PAD_TIME(NAME, RES) \ + unsigned long int __glibc_reserved ## RES; __time_t NAME +#elif __SHM_PAD_AFTER_TIME +# define __SHM_PAD_TIME(NAME, RES) \ + __time_t NAME; unsigned long int __glibc_reserved ## RES +#else +# define __SHM_PAD_TIME(NAME, RES) \ + __time_t NAME +#endif /* Data structure describing a shared memory segment. */ struct shmid_ds { struct ipc_perm shm_perm; /* operation permission struct */ +#if !__SHM_SEGSZ_AFTER_TIME size_t shm_segsz; /* size of segment in bytes */ - __time_t shm_atime; /* time of last shmat() */ -#if __WORDSIZE == 32 - unsigned long int __glibc_reserved1; #endif - __time_t shm_dtime; /* time of last shmdt() */ -#if __WORDSIZE == 32 - unsigned long int __glibc_reserved2; + __SHM_PAD_TIME (shm_atime, 1); /* time of last shmat() */ + __SHM_PAD_TIME (shm_dtime, 2); /* time of last shmdt() */ + __SHM_PAD_TIME (shm_ctime, 3); /* time of last change by shmctl() */ +#if __SHM_PAD_BETWEEN_TIME_AND_SEGSZ + unsigned long int __glibc_reserved4; #endif - __time_t shm_ctime; /* time of last change by shmctl() */ -#if __WORDSIZE == 32 - unsigned long int __glibc_reserved3; +#if __SHM_SEGSZ_AFTER_TIME + size_t shm_segsz; /* size of segment in bytes */ #endif __pid_t shm_cpid; /* pid of creator */ __pid_t shm_lpid; /* pid of last shmop */ shmatt_t shm_nattch; /* number of current attaches */ - unsigned long int __glibc_reserved4; - unsigned long int __glibc_reserved5; + __syscall_ulong_t __glibc_reserved5; + __syscall_ulong_t __glibc_reserved6; }; #ifdef __USE_MISC @@ -81,25 +92,25 @@ struct shmid_ds struct shminfo { - unsigned long int shmmax; - unsigned long int shmmin; - unsigned long int shmmni; - unsigned long int shmseg; - unsigned long int shmall; - unsigned long int __glibc_reserved1; - unsigned long int __glibc_reserved2; - unsigned long int __glibc_reserved3; - unsigned long int __glibc_reserved4; + __syscall_ulong_t shmmax; + __syscall_ulong_t shmmin; + __syscall_ulong_t shmmni; + __syscall_ulong_t shmseg; + __syscall_ulong_t shmall; + __syscall_ulong_t __glibc_reserved1; + __syscall_ulong_t __glibc_reserved2; + __syscall_ulong_t __glibc_reserved3; + __syscall_ulong_t __glibc_reserved4; }; struct shm_info { int used_ids; - unsigned long int shm_tot; /* total allocated shm */ - unsigned long int shm_rss; /* total resident shm */ - unsigned long int shm_swp; /* total swapped shm */ - unsigned long int swap_attempts; - unsigned long int swap_successes; + __syscall_ulong_t shm_tot; /* total allocated shm */ + __syscall_ulong_t shm_rss; /* total resident shm */ + __syscall_ulong_t shm_swp; /* total swapped shm */ + __syscall_ulong_t swap_attempts; + __syscall_ulong_t swap_successes; }; #endif /* __USE_MISC */ |