about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/bits/shm.h
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2018-10-17 11:56:28 +0000
committerJoseph Myers <joseph@codesourcery.com>2018-10-17 11:56:28 +0000
commit729f34028a7f494b599a29889df825cf826b6de0 (patch)
tree240e9b7f62d704af1e262f1223bec5c077b5790c /sysdeps/unix/sysv/linux/bits/shm.h
parent8c8d2a8aff71e0c53b372871f158c121289452cf (diff)
downloadglibc-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.h63
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 */