Message ID | 20191025120832.27667-9-adhemerval.zanella@linaro.org |
---|---|
State | Accepted |
Commit | 40a36935fff4eac83b9676b04048990ccb3c4754 |
Headers | show |
Series | Y2038 preparation: use clock_[gs]ettime to implement the other time-getting and -setting functions. | expand |
Hi Adhemerval, > From: Zack Weinberg <zackw@panix.com> > > Use clock_gettime to implement timespec_get. > > Changes from previous version: > > - Change commit message remove the rationale to not promote it. > > -- > > timespec_get is the same function as clock_gettime, with an obnoxious > coating of NIH painted on it by the ISO C committee. In addition to > the rename, it takes its arguments in a different order, it returns 0 > on *failure* or a positive number on *success*, and it requires that > all of its TIME_* constants be positive. This last means we cannot > directly reuse the existing CLOCK_* constants for it, because > those have been allocated starting with CLOCK_REALTIME = 0 on all > existing platforms. > > This patch simply promotes the sysdeps/posix implementation to > universal, and removes the Linux-specific implementation, whose > apparent reason for existing was to cut out one function call's worth > of overhead. > > Checked on x86_64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu, > powerpc64-linux-gnu, powerpc-linux-gnu, and aarch64-linux-gnu. > --- > sysdeps/posix/timespec_get.c | 32 ------------------ > sysdeps/unix/sysv/linux/timespec_get.c | 46 > -------------------------- time/timespec_get.c | > 14 +++----- 3 files changed, 4 insertions(+), 88 deletions(-) > delete mode 100644 sysdeps/posix/timespec_get.c > delete mode 100644 sysdeps/unix/sysv/linux/timespec_get.c > > diff --git a/sysdeps/posix/timespec_get.c > b/sysdeps/posix/timespec_get.c deleted file mode 100644 > index e3146da2d3..0000000000 > --- a/sysdeps/posix/timespec_get.c > +++ /dev/null > @@ -1,32 +0,0 @@ > -/* timespec_get -- C11 interface to sample a clock. Generic POSIX.1 > version. > - Copyright (C) 2013-2019 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 <time.h> > - > - > -/* Set TS to calendar time based in time base BASE. */ > -int > -timespec_get (struct timespec *ts, int base) > -{ > - if (base == TIME_UTC) > - { > - __clock_gettime (CLOCK_REALTIME, ts); > - return base; > - } > - return 0; > -} > diff --git a/sysdeps/unix/sysv/linux/timespec_get.c > b/sysdeps/unix/sysv/linux/timespec_get.c deleted file mode 100644 > index 629827d0f9..0000000000 > --- a/sysdeps/unix/sysv/linux/timespec_get.c > +++ /dev/null > @@ -1,46 +0,0 @@ > -/* Copyright (C) 2011-2019 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. > - > - 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 <time.h> > -#include <sysdep.h> > -#include <errno.h> > - > -#ifdef HAVE_CLOCK_GETTIME_VSYSCALL > -# define HAVE_VSYSCALL > -#endif > -#include <sysdep-vdso.h> > - > -/* Set TS to calendar time based in time base BASE. */ > -int > -timespec_get (struct timespec *ts, int base) > -{ > - switch (base) > - { > - int res; > - INTERNAL_SYSCALL_DECL (err); > - case TIME_UTC: > - res = INTERNAL_VSYSCALL (clock_gettime, err, 2, > CLOCK_REALTIME, ts); > - if (INTERNAL_SYSCALL_ERROR_P (res, err)) > - return 0; > - break; > - > - default: > - return 0; > - } > - > - return base; > -} > diff --git a/time/timespec_get.c b/time/timespec_get.c > index cef9a4263c..5124c747c2 100644 > --- a/time/timespec_get.c > +++ b/time/timespec_get.c > @@ -22,16 +22,10 @@ > int > timespec_get (struct timespec *ts, int base) > { > - switch (base) > + if (base == TIME_UTC) > { > - case TIME_UTC: > - /* Not supported. */ > - return 0; > - > - default: > - return 0; > + __clock_gettime (CLOCK_REALTIME, ts); > + return base; > } > - > - return base; > + return 0; > } > -stub_warning (timespec_get) Reviewed-by: Lukasz Majewski <lukma@denx.de> 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/sysdeps/posix/timespec_get.c b/sysdeps/posix/timespec_get.c deleted file mode 100644 index e3146da2d3..0000000000 --- a/sysdeps/posix/timespec_get.c +++ /dev/null @@ -1,32 +0,0 @@ -/* timespec_get -- C11 interface to sample a clock. Generic POSIX.1 version. - Copyright (C) 2013-2019 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 <time.h> - - -/* Set TS to calendar time based in time base BASE. */ -int -timespec_get (struct timespec *ts, int base) -{ - if (base == TIME_UTC) - { - __clock_gettime (CLOCK_REALTIME, ts); - return base; - } - return 0; -} diff --git a/sysdeps/unix/sysv/linux/timespec_get.c b/sysdeps/unix/sysv/linux/timespec_get.c deleted file mode 100644 index 629827d0f9..0000000000 --- a/sysdeps/unix/sysv/linux/timespec_get.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (C) 2011-2019 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. - - 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 <time.h> -#include <sysdep.h> -#include <errno.h> - -#ifdef HAVE_CLOCK_GETTIME_VSYSCALL -# define HAVE_VSYSCALL -#endif -#include <sysdep-vdso.h> - -/* Set TS to calendar time based in time base BASE. */ -int -timespec_get (struct timespec *ts, int base) -{ - switch (base) - { - int res; - INTERNAL_SYSCALL_DECL (err); - case TIME_UTC: - res = INTERNAL_VSYSCALL (clock_gettime, err, 2, CLOCK_REALTIME, ts); - if (INTERNAL_SYSCALL_ERROR_P (res, err)) - return 0; - break; - - default: - return 0; - } - - return base; -} diff --git a/time/timespec_get.c b/time/timespec_get.c index cef9a4263c..5124c747c2 100644 --- a/time/timespec_get.c +++ b/time/timespec_get.c @@ -22,16 +22,10 @@ int timespec_get (struct timespec *ts, int base) { - switch (base) + if (base == TIME_UTC) { - case TIME_UTC: - /* Not supported. */ - return 0; - - default: - return 0; + __clock_gettime (CLOCK_REALTIME, ts); + return base; } - - return base; + return 0; } -stub_warning (timespec_get)
From: Zack Weinberg <zackw@panix.com> Use clock_gettime to implement timespec_get. Changes from previous version: - Change commit message remove the rationale to not promote it. -- timespec_get is the same function as clock_gettime, with an obnoxious coating of NIH painted on it by the ISO C committee. In addition to the rename, it takes its arguments in a different order, it returns 0 on *failure* or a positive number on *success*, and it requires that all of its TIME_* constants be positive. This last means we cannot directly reuse the existing CLOCK_* constants for it, because those have been allocated starting with CLOCK_REALTIME = 0 on all existing platforms. This patch simply promotes the sysdeps/posix implementation to universal, and removes the Linux-specific implementation, whose apparent reason for existing was to cut out one function call's worth of overhead. Checked on x86_64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu, powerpc64-linux-gnu, powerpc-linux-gnu, and aarch64-linux-gnu. --- sysdeps/posix/timespec_get.c | 32 ------------------ sysdeps/unix/sysv/linux/timespec_get.c | 46 -------------------------- time/timespec_get.c | 14 +++----- 3 files changed, 4 insertions(+), 88 deletions(-) delete mode 100644 sysdeps/posix/timespec_get.c delete mode 100644 sysdeps/unix/sysv/linux/timespec_get.c -- 2.17.1