diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/bits')
-rw-r--r-- | sysdeps/unix/sysv/linux/bits/sem-pad.h | 33 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/bits/sem.h | 29 |
2 files changed, 50 insertions, 12 deletions
diff --git a/sysdeps/unix/sysv/linux/bits/sem-pad.h b/sysdeps/unix/sysv/linux/bits/sem-pad.h new file mode 100644 index 0000000000..c57fea4ac8 --- /dev/null +++ b/sysdeps/unix/sysv/linux/bits/sem-pad.h @@ -0,0 +1,33 @@ +/* Define where padding goes in struct semid_ds. Generic version. + Copyright (C) 2018 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 + 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, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _SYS_SEM_H +# error "Never use <bits/sem-pad.h> directly; include <sys/sem.h> instead." +#endif + +#include <bits/wordsize.h> + +/* On most architectures, padding goes after time fields for 32-bit + systems and is omitted for 64-bit systems. Some architectures pad + before time fields instead, or omit padding despite being 32-bit, + or include it despite being 64-bit. This must match the layout + used for struct semid64_ds in <asm/sembuf.h>, as glibc does not do + layout conversions for this structure. */ + +#define __SEM_PAD_AFTER_TIME (__WORDSIZE == 32) +#define __SEM_PAD_BEFORE_TIME 0 diff --git a/sysdeps/unix/sysv/linux/bits/sem.h b/sysdeps/unix/sysv/linux/bits/sem.h index bf6d797080..d6e879ea0f 100644 --- a/sysdeps/unix/sysv/linux/bits/sem.h +++ b/sysdeps/unix/sysv/linux/bits/sem.h @@ -20,7 +20,7 @@ #endif #include <sys/types.h> -#include <bits/wordsize.h> +#include <bits/sem-pad.h> /* Flags for `semop'. */ #define SEM_UNDO 0x1000 /* undo the operation on exit */ @@ -35,21 +35,26 @@ #define SETALL 17 /* set all semval's */ +#if __SEM_PAD_BEFORE_TIME +# define __SEM_PAD_TIME(NAME, RES) \ + __syscall_ulong_t __glibc_reserved ## RES; __time_t NAME +#elif __SEM_PAD_AFTER_TIME +# define __SEM_PAD_TIME(NAME, RES) \ + __time_t NAME; __syscall_ulong_t __glibc_reserved ## RES +#else +# define __SEM_PAD_TIME(NAME, RES) \ + __time_t NAME +#endif + /* 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 */ -#if __WORDSIZE == 32 - unsigned long int __glibc_reserved1; -#endif - __time_t sem_ctime; /* last time changed by semctl() */ -#if __WORDSIZE == 32 - unsigned long int __glibc_reserved2; -#endif - unsigned long int sem_nsems; /* number of semaphores in set */ - unsigned long int __glibc_reserved3; - unsigned long int __glibc_reserved4; + __SEM_PAD_TIME (sem_otime, 1); /* last semop() time */ + __SEM_PAD_TIME (sem_ctime, 2); /* last time changed by semctl() */ + __syscall_ulong_t sem_nsems; /* number of semaphores in set */ + __syscall_ulong_t __glibc_reserved3; + __syscall_ulong_t __glibc_reserved4; }; /* The user should define a union like the following to use it for arguments |