[v2,15/25] y2038: Use a common definition for semid_ds
Checks
Commit Message
Instead of replicate the same definitions from struct_semid64_ds.h
on the multiple struct_semid_ds.h, use a common header which is included
when required (struct_semid64_ds_helper.h).
The __USE_TIME_BITS64 is not defined internally yet, although the
internal header is used when building the 64-bit semctl implementation.
---
sysdeps/unix/sysv/linux/Makefile | 3 ++-
.../sysv/linux/bits/types/struct_semid64_ds.h | 5 +---
.../bits/types/struct_semid64_ds_helper.h | 23 +++++++++++++++++++
.../sysv/linux/bits/types/struct_semid_ds.h | 10 +++++---
.../linux/hppa/bits/types/struct_semid_ds.h | 4 ++++
.../linux/mips/bits/types/struct_semid_ds.h | 4 ++++
.../powerpc/bits/types/struct_semid_ds.h | 10 +++++---
.../linux/sparc/bits/types/struct_semid_ds.h | 10 +++++---
.../linux/x86/bits/types/struct_semid_ds.h | 4 ++++
9 files changed, 59 insertions(+), 14 deletions(-)
create mode 100644 sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h
Comments
On Tue, 18 May 2021 17:56:03 -0300
Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote:
> Instead of replicate the same definitions from struct_semid64_ds.h
> on the multiple struct_semid_ds.h, use a common header which is
> included when required (struct_semid64_ds_helper.h).
>
> The __USE_TIME_BITS64 is not defined internally yet, although the
> internal header is used when building the 64-bit semctl
> implementation.
Reviewed-by: Lukasz Majewski <lukma@denx.de>
> ---
> sysdeps/unix/sysv/linux/Makefile | 3 ++-
> .../sysv/linux/bits/types/struct_semid64_ds.h | 5 +---
> .../bits/types/struct_semid64_ds_helper.h | 23
> +++++++++++++++++++ .../sysv/linux/bits/types/struct_semid_ds.h |
> 10 +++++--- .../linux/hppa/bits/types/struct_semid_ds.h | 4 ++++
> .../linux/mips/bits/types/struct_semid_ds.h | 4 ++++
> .../powerpc/bits/types/struct_semid_ds.h | 10 +++++---
> .../linux/sparc/bits/types/struct_semid_ds.h | 10 +++++---
> .../linux/x86/bits/types/struct_semid_ds.h | 4 ++++
> 9 files changed, 59 insertions(+), 14 deletions(-)
> create mode 100644
> sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h
>
> diff --git a/sysdeps/unix/sysv/linux/Makefile
> b/sysdeps/unix/sysv/linux/Makefile index 193b7c46b9..b599c423ed 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -102,7 +102,8 @@ sysdep_headers += sys/mount.h sys/acct.h \
> bits/ipc-perm.h \
> bits/struct_stat.h \
> bits/struct_stat_time64_helper.h \
> - bits/types/struct_msqid64_ds_helper.h
> + bits/types/struct_msqid64_ds_helper.h \
> + bits/types/struct_semid64_ds_helper.h
>
> tests += tst-clone tst-clone2 tst-clone3 tst-fanotify
> tst-personality \ tst-quota tst-sync_file_range tst-sysconf-iov_max
> tst-ttyname \ diff --git
> a/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds.h
> b/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds.h index
> 7263e50bbf..adaee3eb9e 100644 ---
> a/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds.h +++
> b/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds.h @@ -25,9
> +25,6 @@ #else struct __semid64_ds
> {
> - struct ipc_perm sem_perm; /* operation permission
> struct */
> - __time64_t sem_otime; /* last semop() time
> */
> - __time64_t sem_ctime; /* last time changed
> by semctl() */
> - __syscall_ulong_t sem_nsems; /* number of
> semaphores in set */ +# include
> <bits/types/struct_semid64_ds_helper.h> };
> #endif
> diff --git
> a/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h
> b/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h new
> file mode 100644 index 0000000000..ea60b671f1 --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h
> @@ -0,0 +1,23 @@
> +/* Common definitions for struct semid_ds with 64 bit time.
> + Copyright (C) 2020-2021 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
> + <https://www.gnu.org/licenses/>. */
> +
> + /* Content of internal __semid64_ds. */
> + struct ipc_perm sem_perm; /* operation permission
> struct */
> + __time64_t sem_otime; /* last semop() time
> */
> + __time64_t sem_ctime; /* last time changed
> by semctl() */
> + __syscall_ulong_t sem_nsems; /* number of
> semaphores in set */ diff --git
> a/sysdeps/unix/sysv/linux/bits/types/struct_semid_ds.h
> b/sysdeps/unix/sysv/linux/bits/types/struct_semid_ds.h index
> 2f32fa500e..a7b2c9022e 100644 ---
> a/sysdeps/unix/sysv/linux/bits/types/struct_semid_ds.h +++
> b/sysdeps/unix/sysv/linux/bits/types/struct_semid_ds.h @@ -23,17
> +23,21 @@ /* Data structure describing a set of semaphores. */
> struct semid_ds {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_semid64_ds_helper.h>
> +#else
> struct ipc_perm sem_perm; /* operation permission struct */
> -#if __TIMESIZE == 32
> +# if __TIMESIZE == 32
> __time_t sem_otime; /* last semop() time */
> __syscall_ulong_t __sem_otime_high;
> __time_t sem_ctime; /* last time changed by semctl() */
> __syscall_ulong_t __sem_ctime_high;
> -#else
> +# else
> __time_t sem_otime;
> __time_t sem_ctime;
> -#endif
> +# endif
> __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> __syscall_ulong_t __glibc_reserved3;
> __syscall_ulong_t __glibc_reserved4;
> +#endif
> };
> diff --git
> a/sysdeps/unix/sysv/linux/hppa/bits/types/struct_semid_ds.h
> b/sysdeps/unix/sysv/linux/hppa/bits/types/struct_semid_ds.h index
> 16a9735e7b..5067fb1572 100644 ---
> a/sysdeps/unix/sysv/linux/hppa/bits/types/struct_semid_ds.h +++
> b/sysdeps/unix/sysv/linux/hppa/bits/types/struct_semid_ds.h @@ -23,6
> +23,9 @@ /* Data structure describing a set of semaphores. */ struct
> semid_ds {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_semid64_ds_helper.h>
> +#else
> struct ipc_perm sem_perm; /* operation permission struct */
> __syscall_ulong_t __sem_otime_high;
> __time_t sem_otime; /* last semop() time */
> @@ -31,4 +34,5 @@ struct semid_ds
> __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> __syscall_ulong_t __glibc_reserved3;
> __syscall_ulong_t __glibc_reserved4;
> +#endif
> };
> diff --git
> a/sysdeps/unix/sysv/linux/mips/bits/types/struct_semid_ds.h
> b/sysdeps/unix/sysv/linux/mips/bits/types/struct_semid_ds.h index
> 73587ea634..ee9a1e5e61 100644 ---
> a/sysdeps/unix/sysv/linux/mips/bits/types/struct_semid_ds.h +++
> b/sysdeps/unix/sysv/linux/mips/bits/types/struct_semid_ds.h @@ -23,10
> +23,14 @@ /* Data structure describing a set of semaphores. */
> struct semid_ds {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_semid64_ds_helper.h>
> +#else
> struct ipc_perm sem_perm; /* operation permission
> struct */ __time_t sem_otime; /* last semop() time */
> __time_t sem_ctime; /* last time changed by semctl() */
> __syscall_ulong_t sem_nsems; /* number of
> semaphores in set */ __syscall_ulong_t __sem_otime_high;
> __syscall_ulong_t __sem_ctime_high;
> +#endif
> };
> diff --git
> a/sysdeps/unix/sysv/linux/powerpc/bits/types/struct_semid_ds.h
> b/sysdeps/unix/sysv/linux/powerpc/bits/types/struct_semid_ds.h index
> 8fdbc5d776..0c080fed61 100644 ---
> a/sysdeps/unix/sysv/linux/powerpc/bits/types/struct_semid_ds.h +++
> b/sysdeps/unix/sysv/linux/powerpc/bits/types/struct_semid_ds.h @@
> -23,17 +23,21 @@ /* Data structure describing a set of semaphores.
> */ struct semid_ds {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_semid64_ds_helper.h>
> +#else
> struct ipc_perm sem_perm; /* operation permission struct */
> -#if __TIMESIZE == 32
> +# if __TIMESIZE == 32
> __syscall_ulong_t __sem_otime_high;
> __time_t sem_otime; /* last semop() time */
> __syscall_ulong_t __sem_ctime_high;
> __time_t sem_ctime; /* last time changed by semctl() */
> -#else
> +# else
> __time_t sem_otime; /* last semop() time */
> __time_t sem_ctime; /* last time changed by semctl() */
> -#endif
> +# endif
> __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> __syscall_ulong_t __glibc_reserved3;
> __syscall_ulong_t __glibc_reserved4;
> +#endif
> };
> diff --git
> a/sysdeps/unix/sysv/linux/sparc/bits/types/struct_semid_ds.h
> b/sysdeps/unix/sysv/linux/sparc/bits/types/struct_semid_ds.h index
> 6b9b3639b2..76810427f6 100644 ---
> a/sysdeps/unix/sysv/linux/sparc/bits/types/struct_semid_ds.h +++
> b/sysdeps/unix/sysv/linux/sparc/bits/types/struct_semid_ds.h @@
> -23,17 +23,21 @@ /* Data structure describing a set of semaphores.
> */ struct semid_ds {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_semid64_ds_helper.h>
> +#else
> struct ipc_perm sem_perm; /* operation permission struct */
> -#if __TIMESIZE == 32
> +# if __TIMESIZE == 32
> __syscall_ulong_t __sem_otime_high;
> __time_t sem_otime; /* last semop() time */
> __syscall_ulong_t __sem_ctime_high;
> __time_t sem_ctime; /* last time changed by semctl() */
> -#else
> +# else
> __time_t sem_otime; /* last semop() time */
> __time_t sem_ctime; /* last time changed by semctl() */
> -#endif
> +# endif
> __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> __syscall_ulong_t __glibc_reserved3;
> __syscall_ulong_t __glibc_reserved4;
> +#endif
> };
> diff --git a/sysdeps/unix/sysv/linux/x86/bits/types/struct_semid_ds.h
> b/sysdeps/unix/sysv/linux/x86/bits/types/struct_semid_ds.h index
> 90f03b2407..affd38b6bd 100644 ---
> a/sysdeps/unix/sysv/linux/x86/bits/types/struct_semid_ds.h +++
> b/sysdeps/unix/sysv/linux/x86/bits/types/struct_semid_ds.h @@ -23,6
> +23,9 @@ /* Data structure describing a set of semaphores. */
> struct semid_ds
> {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_semid64_ds_helper.h>
> +#else
> struct ipc_perm sem_perm; /* operation permission struct */
> __time_t sem_otime; /* last semop() time */
> __syscall_ulong_t __sem_otime_high;
> @@ -31,4 +34,5 @@ struct semid_ds
> __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> __syscall_ulong_t __glibc_reserved3;
> __syscall_ulong_t __glibc_reserved4;
> +#endif
> };
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
On 5/18/21 4:56 PM, Adhemerval Zanella wrote:
> Instead of replicate the same definitions from struct_semid64_ds.h
> on the multiple struct_semid_ds.h, use a common header which is included
> when required (struct_semid64_ds_helper.h).
>
> The __USE_TIME_BITS64 is not defined internally yet, although the
> internal header is used when building the 64-bit semctl implementation.
Requesting a v3 please.
Similar to 14/25, we should add the __glibc_reserved* members to the
structure to preserve maximum compatibility with the kernel structure.
The original struct semid_ds is 64 bytes on i686 with high-low time pairs
and only 56 bytes in the 64-bit time_t version. With the two reserved
members added back it's 64 bytes in both ABIs.
We could add some static asserts if we really want to be thorough about
the alignment of __time64_t.
> ---
> sysdeps/unix/sysv/linux/Makefile | 3 ++-
> .../sysv/linux/bits/types/struct_semid64_ds.h | 5 +---
> .../bits/types/struct_semid64_ds_helper.h | 23 +++++++++++++++++++
> .../sysv/linux/bits/types/struct_semid_ds.h | 10 +++++---
> .../linux/hppa/bits/types/struct_semid_ds.h | 4 ++++
> .../linux/mips/bits/types/struct_semid_ds.h | 4 ++++
> .../powerpc/bits/types/struct_semid_ds.h | 10 +++++---
> .../linux/sparc/bits/types/struct_semid_ds.h | 10 +++++---
> .../linux/x86/bits/types/struct_semid_ds.h | 4 ++++
> 9 files changed, 59 insertions(+), 14 deletions(-)
> create mode 100644 sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h
>
> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index 193b7c46b9..b599c423ed 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -102,7 +102,8 @@ sysdep_headers += sys/mount.h sys/acct.h \
> bits/ipc-perm.h \
> bits/struct_stat.h \
> bits/struct_stat_time64_helper.h \
> - bits/types/struct_msqid64_ds_helper.h
> + bits/types/struct_msqid64_ds_helper.h \
> + bits/types/struct_semid64_ds_helper.h
OK. Add helper.
>
> tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
> tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \
> diff --git a/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds.h b/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds.h
> index 7263e50bbf..adaee3eb9e 100644
> --- a/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds.h
> +++ b/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds.h
> @@ -25,9 +25,6 @@
> #else
> struct __semid64_ds
> {
> - struct ipc_perm sem_perm; /* operation permission struct */
> - __time64_t sem_otime; /* last semop() time */
> - __time64_t sem_ctime; /* last time changed by semctl() */
> - __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> +# include <bits/types/struct_semid64_ds_helper.h>
OK. Use helper.
> };
> #endif
> diff --git a/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h b/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h
> new file mode 100644
> index 0000000000..ea60b671f1
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h
> @@ -0,0 +1,23 @@
> +/* Common definitions for struct semid_ds with 64 bit time.
> + Copyright (C) 2020-2021 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
> + <https://www.gnu.org/licenses/>. */
> +
> + /* Content of internal __semid64_ds. */
> + struct ipc_perm sem_perm; /* operation permission struct */
> + __time64_t sem_otime; /* last semop() time */
> + __time64_t sem_ctime; /* last time changed by semctl() */
> + __syscall_ulong_t sem_nsems; /* number of semaphores in set */
Definitions look good.
Needs __glibc_reserved3 and __glibc_reserved4.
> diff --git a/sysdeps/unix/sysv/linux/bits/types/struct_semid_ds.h b/sysdeps/unix/sysv/linux/bits/types/struct_semid_ds.h
> index 2f32fa500e..a7b2c9022e 100644
> --- a/sysdeps/unix/sysv/linux/bits/types/struct_semid_ds.h
> +++ b/sysdeps/unix/sysv/linux/bits/types/struct_semid_ds.h
> @@ -23,17 +23,21 @@
> /* Data structure describing a set of semaphores. */
> struct semid_ds
> {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_semid64_ds_helper.h>
OK. Use in new abi.
> +#else
> struct ipc_perm sem_perm; /* operation permission struct */
> -#if __TIMESIZE == 32
> +# if __TIMESIZE == 32
> __time_t sem_otime; /* last semop() time */
> __syscall_ulong_t __sem_otime_high;
> __time_t sem_ctime; /* last time changed by semctl() */
> __syscall_ulong_t __sem_ctime_high;
> -#else
> +# else
> __time_t sem_otime;
> __time_t sem_ctime;
> -#endif
> +# endif
> __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> __syscall_ulong_t __glibc_reserved3;
> __syscall_ulong_t __glibc_reserved4;
> +#endif
> };
> diff --git a/sysdeps/unix/sysv/linux/hppa/bits/types/struct_semid_ds.h b/sysdeps/unix/sysv/linux/hppa/bits/types/struct_semid_ds.h
> index 16a9735e7b..5067fb1572 100644
> --- a/sysdeps/unix/sysv/linux/hppa/bits/types/struct_semid_ds.h
> +++ b/sysdeps/unix/sysv/linux/hppa/bits/types/struct_semid_ds.h
> @@ -23,6 +23,9 @@
> /* Data structure describing a set of semaphores. */
> struct semid_ds
> {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_semid64_ds_helper.h>
OK. Use helper.
> +#else
> struct ipc_perm sem_perm; /* operation permission struct */
> __syscall_ulong_t __sem_otime_high;
> __time_t sem_otime; /* last semop() time */
> @@ -31,4 +34,5 @@ struct semid_ds
> __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> __syscall_ulong_t __glibc_reserved3;
> __syscall_ulong_t __glibc_reserved4;
> +#endif
> };
> diff --git a/sysdeps/unix/sysv/linux/mips/bits/types/struct_semid_ds.h b/sysdeps/unix/sysv/linux/mips/bits/types/struct_semid_ds.h
> index 73587ea634..ee9a1e5e61 100644
> --- a/sysdeps/unix/sysv/linux/mips/bits/types/struct_semid_ds.h
> +++ b/sysdeps/unix/sysv/linux/mips/bits/types/struct_semid_ds.h
> @@ -23,10 +23,14 @@
> /* Data structure describing a set of semaphores. */
> struct semid_ds
> {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_semid64_ds_helper.h>
OK. Use helper.
> +#else
> struct ipc_perm sem_perm; /* operation permission struct */
> __time_t sem_otime; /* last semop() time */
> __time_t sem_ctime; /* last time changed by semctl() */
> __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> __syscall_ulong_t __sem_otime_high;
> __syscall_ulong_t __sem_ctime_high;
> +#endif
> };
> diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/types/struct_semid_ds.h b/sysdeps/unix/sysv/linux/powerpc/bits/types/struct_semid_ds.h
> index 8fdbc5d776..0c080fed61 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/bits/types/struct_semid_ds.h
> +++ b/sysdeps/unix/sysv/linux/powerpc/bits/types/struct_semid_ds.h
> @@ -23,17 +23,21 @@
> /* Data structure describing a set of semaphores. */
> struct semid_ds
> {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_semid64_ds_helper.h>
OK. Use helper.
> +#else
> struct ipc_perm sem_perm; /* operation permission struct */
> -#if __TIMESIZE == 32
> +# if __TIMESIZE == 32
> __syscall_ulong_t __sem_otime_high;
> __time_t sem_otime; /* last semop() time */
> __syscall_ulong_t __sem_ctime_high;
> __time_t sem_ctime; /* last time changed by semctl() */
> -#else
> +# else
> __time_t sem_otime; /* last semop() time */
> __time_t sem_ctime; /* last time changed by semctl() */
> -#endif
> +# endif
> __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> __syscall_ulong_t __glibc_reserved3;
> __syscall_ulong_t __glibc_reserved4;
> +#endif
> };
> diff --git a/sysdeps/unix/sysv/linux/sparc/bits/types/struct_semid_ds.h b/sysdeps/unix/sysv/linux/sparc/bits/types/struct_semid_ds.h
> index 6b9b3639b2..76810427f6 100644
> --- a/sysdeps/unix/sysv/linux/sparc/bits/types/struct_semid_ds.h
> +++ b/sysdeps/unix/sysv/linux/sparc/bits/types/struct_semid_ds.h
> @@ -23,17 +23,21 @@
> /* Data structure describing a set of semaphores. */
> struct semid_ds
> {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_semid64_ds_helper.h>
OK. Use helper.
> +#else
> struct ipc_perm sem_perm; /* operation permission struct */
> -#if __TIMESIZE == 32
> +# if __TIMESIZE == 32
> __syscall_ulong_t __sem_otime_high;
> __time_t sem_otime; /* last semop() time */
> __syscall_ulong_t __sem_ctime_high;
> __time_t sem_ctime; /* last time changed by semctl() */
> -#else
> +# else
> __time_t sem_otime; /* last semop() time */
> __time_t sem_ctime; /* last time changed by semctl() */
> -#endif
> +# endif
> __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> __syscall_ulong_t __glibc_reserved3;
> __syscall_ulong_t __glibc_reserved4;
> +#endif
> };
> diff --git a/sysdeps/unix/sysv/linux/x86/bits/types/struct_semid_ds.h b/sysdeps/unix/sysv/linux/x86/bits/types/struct_semid_ds.h
> index 90f03b2407..affd38b6bd 100644
> --- a/sysdeps/unix/sysv/linux/x86/bits/types/struct_semid_ds.h
> +++ b/sysdeps/unix/sysv/linux/x86/bits/types/struct_semid_ds.h
> @@ -23,6 +23,9 @@
> /* Data structure describing a set of semaphores. */
> struct semid_ds
> {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_semid64_ds_helper.h>
OK. Use helper.
> +#else
> struct ipc_perm sem_perm; /* operation permission struct */
> __time_t sem_otime; /* last semop() time */
> __syscall_ulong_t __sem_otime_high;
> @@ -31,4 +34,5 @@ struct semid_ds
> __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> __syscall_ulong_t __glibc_reserved3;
> __syscall_ulong_t __glibc_reserved4;
> +#endif
> };
>
On 04/06/2021 16:38, Carlos O'Donell wrote:
> On 5/18/21 4:56 PM, Adhemerval Zanella wrote:
>> Instead of replicate the same definitions from struct_semid64_ds.h
>> on the multiple struct_semid_ds.h, use a common header which is included
>> when required (struct_semid64_ds_helper.h).
>>
>> The __USE_TIME_BITS64 is not defined internally yet, although the
>> internal header is used when building the 64-bit semctl implementation.
>
> Requesting a v3 please.
>
> Similar to 14/25, we should add the __glibc_reserved* members to the
> structure to preserve maximum compatibility with the kernel structure.
>
> The original struct semid_ds is 64 bytes on i686 with high-low time pairs
> and only 56 bytes in the 64-bit time_t version. With the two reserved
> members added back it's 64 bytes in both ABIs.
Ack.
>
> We could add some static asserts if we really want to be thorough about
> the alignment of __time64_t.
I think there is no need, this would bsaically verify the expected ABI
already set by the compiler (since we do not need to actually follow
kernel expected internal layout).
>
>> ---
>> sysdeps/unix/sysv/linux/Makefile | 3 ++-
>> .../sysv/linux/bits/types/struct_semid64_ds.h | 5 +---
>> .../bits/types/struct_semid64_ds_helper.h | 23 +++++++++++++++++++
>> .../sysv/linux/bits/types/struct_semid_ds.h | 10 +++++---
>> .../linux/hppa/bits/types/struct_semid_ds.h | 4 ++++
>> .../linux/mips/bits/types/struct_semid_ds.h | 4 ++++
>> .../powerpc/bits/types/struct_semid_ds.h | 10 +++++---
>> .../linux/sparc/bits/types/struct_semid_ds.h | 10 +++++---
>> .../linux/x86/bits/types/struct_semid_ds.h | 4 ++++
>> 9 files changed, 59 insertions(+), 14 deletions(-)
>> create mode 100644 sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h
>>
>> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
>> index 193b7c46b9..b599c423ed 100644
>> --- a/sysdeps/unix/sysv/linux/Makefile
>> +++ b/sysdeps/unix/sysv/linux/Makefile
>> @@ -102,7 +102,8 @@ sysdep_headers += sys/mount.h sys/acct.h \
>> bits/ipc-perm.h \
>> bits/struct_stat.h \
>> bits/struct_stat_time64_helper.h \
>> - bits/types/struct_msqid64_ds_helper.h
>> + bits/types/struct_msqid64_ds_helper.h \
>> + bits/types/struct_semid64_ds_helper.h
>
> OK. Add helper.
>
>>
>> tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
>> tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \
>> diff --git a/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds.h b/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds.h
>> index 7263e50bbf..adaee3eb9e 100644
>> --- a/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds.h
>> +++ b/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds.h
>> @@ -25,9 +25,6 @@
>> #else
>> struct __semid64_ds
>> {
>> - struct ipc_perm sem_perm; /* operation permission struct */
>> - __time64_t sem_otime; /* last semop() time */
>> - __time64_t sem_ctime; /* last time changed by semctl() */
>> - __syscall_ulong_t sem_nsems; /* number of semaphores in set */
>> +# include <bits/types/struct_semid64_ds_helper.h>
>
> OK. Use helper.
>
>> };
>> #endif
>> diff --git a/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h b/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h
>> new file mode 100644
>> index 0000000000..ea60b671f1
>> --- /dev/null
>> +++ b/sysdeps/unix/sysv/linux/bits/types/struct_semid64_ds_helper.h
>> @@ -0,0 +1,23 @@
>> +/* Common definitions for struct semid_ds with 64 bit time.
>> + Copyright (C) 2020-2021 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
>> + <https://www.gnu.org/licenses/>. */
>> +
>> + /* Content of internal __semid64_ds. */
>> + struct ipc_perm sem_perm; /* operation permission struct */
>> + __time64_t sem_otime; /* last semop() time */
>> + __time64_t sem_ctime; /* last time changed by semctl() */
>> + __syscall_ulong_t sem_nsems; /* number of semaphores in set */
>
> Definitions look good.
>
> Needs __glibc_reserved3 and __glibc_reserved4.
Ack.
@@ -102,7 +102,8 @@ sysdep_headers += sys/mount.h sys/acct.h \
bits/ipc-perm.h \
bits/struct_stat.h \
bits/struct_stat_time64_helper.h \
- bits/types/struct_msqid64_ds_helper.h
+ bits/types/struct_msqid64_ds_helper.h \
+ bits/types/struct_semid64_ds_helper.h
tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \
@@ -25,9 +25,6 @@
#else
struct __semid64_ds
{
- struct ipc_perm sem_perm; /* operation permission struct */
- __time64_t sem_otime; /* last semop() time */
- __time64_t sem_ctime; /* last time changed by semctl() */
- __syscall_ulong_t sem_nsems; /* number of semaphores in set */
+# include <bits/types/struct_semid64_ds_helper.h>
};
#endif
new file mode 100644
@@ -0,0 +1,23 @@
+/* Common definitions for struct semid_ds with 64 bit time.
+ Copyright (C) 2020-2021 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
+ <https://www.gnu.org/licenses/>. */
+
+ /* Content of internal __semid64_ds. */
+ struct ipc_perm sem_perm; /* operation permission struct */
+ __time64_t sem_otime; /* last semop() time */
+ __time64_t sem_ctime; /* last time changed by semctl() */
+ __syscall_ulong_t sem_nsems; /* number of semaphores in set */
@@ -23,17 +23,21 @@
/* Data structure describing a set of semaphores. */
struct semid_ds
{
+#ifdef __USE_TIME_BITS64
+# include <bits/types/struct_semid64_ds_helper.h>
+#else
struct ipc_perm sem_perm; /* operation permission struct */
-#if __TIMESIZE == 32
+# if __TIMESIZE == 32
__time_t sem_otime; /* last semop() time */
__syscall_ulong_t __sem_otime_high;
__time_t sem_ctime; /* last time changed by semctl() */
__syscall_ulong_t __sem_ctime_high;
-#else
+# else
__time_t sem_otime;
__time_t sem_ctime;
-#endif
+# endif
__syscall_ulong_t sem_nsems; /* number of semaphores in set */
__syscall_ulong_t __glibc_reserved3;
__syscall_ulong_t __glibc_reserved4;
+#endif
};
@@ -23,6 +23,9 @@
/* Data structure describing a set of semaphores. */
struct semid_ds
{
+#ifdef __USE_TIME_BITS64
+# include <bits/types/struct_semid64_ds_helper.h>
+#else
struct ipc_perm sem_perm; /* operation permission struct */
__syscall_ulong_t __sem_otime_high;
__time_t sem_otime; /* last semop() time */
@@ -31,4 +34,5 @@ struct semid_ds
__syscall_ulong_t sem_nsems; /* number of semaphores in set */
__syscall_ulong_t __glibc_reserved3;
__syscall_ulong_t __glibc_reserved4;
+#endif
};
@@ -23,10 +23,14 @@
/* Data structure describing a set of semaphores. */
struct semid_ds
{
+#ifdef __USE_TIME_BITS64
+# include <bits/types/struct_semid64_ds_helper.h>
+#else
struct ipc_perm sem_perm; /* operation permission struct */
__time_t sem_otime; /* last semop() time */
__time_t sem_ctime; /* last time changed by semctl() */
__syscall_ulong_t sem_nsems; /* number of semaphores in set */
__syscall_ulong_t __sem_otime_high;
__syscall_ulong_t __sem_ctime_high;
+#endif
};
@@ -23,17 +23,21 @@
/* Data structure describing a set of semaphores. */
struct semid_ds
{
+#ifdef __USE_TIME_BITS64
+# include <bits/types/struct_semid64_ds_helper.h>
+#else
struct ipc_perm sem_perm; /* operation permission struct */
-#if __TIMESIZE == 32
+# if __TIMESIZE == 32
__syscall_ulong_t __sem_otime_high;
__time_t sem_otime; /* last semop() time */
__syscall_ulong_t __sem_ctime_high;
__time_t sem_ctime; /* last time changed by semctl() */
-#else
+# else
__time_t sem_otime; /* last semop() time */
__time_t sem_ctime; /* last time changed by semctl() */
-#endif
+# endif
__syscall_ulong_t sem_nsems; /* number of semaphores in set */
__syscall_ulong_t __glibc_reserved3;
__syscall_ulong_t __glibc_reserved4;
+#endif
};
@@ -23,17 +23,21 @@
/* Data structure describing a set of semaphores. */
struct semid_ds
{
+#ifdef __USE_TIME_BITS64
+# include <bits/types/struct_semid64_ds_helper.h>
+#else
struct ipc_perm sem_perm; /* operation permission struct */
-#if __TIMESIZE == 32
+# if __TIMESIZE == 32
__syscall_ulong_t __sem_otime_high;
__time_t sem_otime; /* last semop() time */
__syscall_ulong_t __sem_ctime_high;
__time_t sem_ctime; /* last time changed by semctl() */
-#else
+# else
__time_t sem_otime; /* last semop() time */
__time_t sem_ctime; /* last time changed by semctl() */
-#endif
+# endif
__syscall_ulong_t sem_nsems; /* number of semaphores in set */
__syscall_ulong_t __glibc_reserved3;
__syscall_ulong_t __glibc_reserved4;
+#endif
};
@@ -23,6 +23,9 @@
/* Data structure describing a set of semaphores. */
struct semid_ds
{
+#ifdef __USE_TIME_BITS64
+# include <bits/types/struct_semid64_ds_helper.h>
+#else
struct ipc_perm sem_perm; /* operation permission struct */
__time_t sem_otime; /* last semop() time */
__syscall_ulong_t __sem_otime_high;
@@ -31,4 +34,5 @@ struct semid_ds
__syscall_ulong_t sem_nsems; /* number of semaphores in set */
__syscall_ulong_t __glibc_reserved3;
__syscall_ulong_t __glibc_reserved4;
+#endif
};