Message ID | 20201015130632.90961-3-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | [1/3] linux: Fix time64 support for futimesat | expand |
On Thu, Oct 15, 2020 at 6:06 AM Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > > It basically calls the 64-bit time_t wait4 internal symbol. > > Checked on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Alistair > --- > include/sys/resource.h | 4 +++ > sysdeps/unix/sysv/linux/wait3.c | 44 +++++++++++++++++++++++++++++++++ > 2 files changed, 48 insertions(+) > create mode 100644 sysdeps/unix/sysv/linux/wait3.c > > diff --git a/include/sys/resource.h b/include/sys/resource.h > index 64925f257c..2235b020fc 100644 > --- a/include/sys/resource.h > +++ b/include/sys/resource.h > @@ -138,12 +138,16 @@ libc_hidden_proto (__setrlimit); > #if __TIMESIZE == 64 > # define __getrusage64 __getrusage > # define __wait4_time64 __wait4 > +# define __wait3_time64 __wait3 > #else > extern int __getrusage64 (enum __rusage_who who, struct __rusage64 *usage); > libc_hidden_proto (__getrusage64) > extern pid_t __wait4_time64 (pid_t pid, int *stat_loc, int options, > struct __rusage64 *usage); > libc_hidden_proto (__wait4_time64) > +extern pid_t __wait3_time64 (int *stat_loc, int options, > + struct __rusage64 *usage); > +libc_hidden_proto (__wait3_time64) > #endif > #endif > #endif > diff --git a/sysdeps/unix/sysv/linux/wait3.c b/sysdeps/unix/sysv/linux/wait3.c > new file mode 100644 > index 0000000000..c05776f7ab > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/wait3.c > @@ -0,0 +1,44 @@ > +/* Wait for process to change state, BSD style. Linux version. > + Copyright (C) 2020 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/>. */ > + > +#include <sys/wait.h> > +#include <sys/resource.h> > +#include <sys/types.h> > + > +pid_t > +__wait3_time64 (int *stat_loc, int options, struct __rusage64 *usage) > +{ > + return __wait4_time64 (WAIT_ANY, stat_loc, options, usage); > +} > +#if __TIMESIZE != 64 > +libc_hidden_def (__wait3_time64) > + > +pid_t > +__wait3 (int *stat_loc, int options, struct rusage *usage) > +{ > + struct __rusage64 usage64; > + pid_t ret = __wait3_time64 (stat_loc, options, > + usage != NULL ? &usage64 : NULL); > + if (ret > 0 && usage != NULL) > + rusage64_to_rusage (&usage64, usage); > + > + return ret; > +} > +#endif > + > +weak_alias (__wait3, wait3) > -- > 2.25.1 >
Hi Adhemerval, > It basically calls the 64-bit time_t wait4 internal symbol. > > Checked on x86_64-linux-gnu and i686-linux-gnu. > --- > include/sys/resource.h | 4 +++ > sysdeps/unix/sysv/linux/wait3.c | 44 > +++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) > create mode 100644 sysdeps/unix/sysv/linux/wait3.c > > diff --git a/include/sys/resource.h b/include/sys/resource.h > index 64925f257c..2235b020fc 100644 > --- a/include/sys/resource.h > +++ b/include/sys/resource.h > @@ -138,12 +138,16 @@ libc_hidden_proto (__setrlimit); > #if __TIMESIZE == 64 > # define __getrusage64 __getrusage > # define __wait4_time64 __wait4 > +# define __wait3_time64 __wait3 > #else > extern int __getrusage64 (enum __rusage_who who, struct __rusage64 > *usage); libc_hidden_proto (__getrusage64) > extern pid_t __wait4_time64 (pid_t pid, int *stat_loc, int options, > struct __rusage64 *usage); > libc_hidden_proto (__wait4_time64) > +extern pid_t __wait3_time64 (int *stat_loc, int options, > + struct __rusage64 *usage); > +libc_hidden_proto (__wait3_time64) > #endif > #endif > #endif > diff --git a/sysdeps/unix/sysv/linux/wait3.c > b/sysdeps/unix/sysv/linux/wait3.c new file mode 100644 > index 0000000000..c05776f7ab > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/wait3.c > @@ -0,0 +1,44 @@ > +/* Wait for process to change state, BSD style. Linux version. > + Copyright (C) 2020 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/>. */ > + > +#include <sys/wait.h> > +#include <sys/resource.h> > +#include <sys/types.h> > + > +pid_t > +__wait3_time64 (int *stat_loc, int options, struct __rusage64 *usage) > +{ > + return __wait4_time64 (WAIT_ANY, stat_loc, options, usage); > +} > +#if __TIMESIZE != 64 > +libc_hidden_def (__wait3_time64) > + > +pid_t > +__wait3 (int *stat_loc, int options, struct rusage *usage) > +{ > + struct __rusage64 usage64; > + pid_t ret = __wait3_time64 (stat_loc, options, > + usage != NULL ? &usage64 : NULL); > + if (ret > 0 && usage != NULL) > + rusage64_to_rusage (&usage64, usage); > + > + return ret; > +} > +#endif > + > +weak_alias (__wait3, wait3) Thanks for converting this. Reviewed-by: Lukasz Majewski <lukma@denx.de> Side comment: ------------- Now, I've just realized that struct __rusage64 (defined in non-exported header: include/sys/resource.h) also needs to be exported for proper Y2038 support (the same case as with struct __stat64_t64). 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 16/10/2020 06:14, Lukasz Majewski wrote: > Thanks for converting this. > > Reviewed-by: Lukasz Majewski <lukma@denx.de> > > Side comment: > ------------- > > Now, I've just realized that struct __rusage64 (defined in non-exported > header: include/sys/resource.h) also needs to be exported for proper > Y2038 support (the same case as with struct __stat64_t64). It should to enable getrusage, wait3, and wait4. Although not really related, I wonder if we should deprecate vtimes as well.
Hi Adhemerval, > On 16/10/2020 06:14, Lukasz Majewski wrote: > > Thanks for converting this. > > > > Reviewed-by: Lukasz Majewski <lukma@denx.de> > > > > Side comment: > > ------------- > > > > Now, I've just realized that struct __rusage64 (defined in > > non-exported header: include/sys/resource.h) also needs to be > > exported for proper Y2038 support (the same case as with struct > > __stat64_t64). > > It should to enable getrusage, wait3, and wait4. Yes, indeed. > Although not really > related, I wonder if we should deprecate vtimes as well. > As I've found following text in the vtimes/getrusage man page [1]: "Ancient systems provided a vtimes() function with a similar purpose to getrusage(). For backward compatibility, glibc also provides vtimes(). All new applications should be written using getrusage()." I think that we should. The Y2038 is a good occasion to do it (and cleanup the glibc's code base) :-) Links: [1] - https://man7.org/linux/man-pages/man3/vtimes.3.html 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
diff --git a/include/sys/resource.h b/include/sys/resource.h index 64925f257c..2235b020fc 100644 --- a/include/sys/resource.h +++ b/include/sys/resource.h @@ -138,12 +138,16 @@ libc_hidden_proto (__setrlimit); #if __TIMESIZE == 64 # define __getrusage64 __getrusage # define __wait4_time64 __wait4 +# define __wait3_time64 __wait3 #else extern int __getrusage64 (enum __rusage_who who, struct __rusage64 *usage); libc_hidden_proto (__getrusage64) extern pid_t __wait4_time64 (pid_t pid, int *stat_loc, int options, struct __rusage64 *usage); libc_hidden_proto (__wait4_time64) +extern pid_t __wait3_time64 (int *stat_loc, int options, + struct __rusage64 *usage); +libc_hidden_proto (__wait3_time64) #endif #endif #endif diff --git a/sysdeps/unix/sysv/linux/wait3.c b/sysdeps/unix/sysv/linux/wait3.c new file mode 100644 index 0000000000..c05776f7ab --- /dev/null +++ b/sysdeps/unix/sysv/linux/wait3.c @@ -0,0 +1,44 @@ +/* Wait for process to change state, BSD style. Linux version. + Copyright (C) 2020 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/>. */ + +#include <sys/wait.h> +#include <sys/resource.h> +#include <sys/types.h> + +pid_t +__wait3_time64 (int *stat_loc, int options, struct __rusage64 *usage) +{ + return __wait4_time64 (WAIT_ANY, stat_loc, options, usage); +} +#if __TIMESIZE != 64 +libc_hidden_def (__wait3_time64) + +pid_t +__wait3 (int *stat_loc, int options, struct rusage *usage) +{ + struct __rusage64 usage64; + pid_t ret = __wait3_time64 (stat_loc, options, + usage != NULL ? &usage64 : NULL); + if (ret > 0 && usage != NULL) + rusage64_to_rusage (&usage64, usage); + + return ret; +} +#endif + +weak_alias (__wait3, wait3)