[v2,08/11] Use clock_gettime to implement timespec_get.

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.
Related show

Commit Message

Adhemerval Zanella Oct. 25, 2019, 12:08 p.m.
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

Comments

Lukasz Majewski Oct. 28, 2019, 1:30 p.m. | #1
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

Patch

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)