]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/posix/clock_getres.c
(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
[thirdparty/glibc.git] / sysdeps / posix / clock_getres.c
index f4dc21f8af38040f5f2f0d351e593ee74d90c31e..a2d466607e3ff0042bcb4a6dd4bc51238ae9ed7f 100644 (file)
@@ -1,5 +1,4 @@
-/* clock_getres -- Get the resolution of a POSIX clockid_t.
-   Copyright (C) 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000, 2001, 2003 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
 #include <libc-internal.h>
 
 
-#if HP_TIMING_AVAIL
-static long int nsec;          /* Clock frequency of the processor.  */
-
-static inline int
-hp_timing_getres (struct timespec *res)
-{
-  if (__builtin_expect (nsec == 0, 0))
-    {
-      hp_timing_t freq;
-
-      /* This can only happen if we haven't initialized the `nsec'
-        variable yet.  Do this now.  We don't have to protect this
-        code against multiple execution since all of them should
-        lead to the same result.  */
-      freq = __get_clockfreq ();
-      if (__builtin_expect (freq == 0, 0))
-       /* Something went wrong.  */
-       return -1;
-
-      nsec = MAX (UINT64_C (1000000000) / freq, 1);
-    }
-
-  /* Fill in the values.
-     The seconds are always zero (unless we have a 1Hz machine).  */
-  res->tv_sec = 0;
-  res->tv_nsec = nsec;
-
-  return 0;
-}
+#if HP_TIMING_AVAIL && !defined HANDLED_CPUTIME
+/* Clock frequency of the processor.  */
+static long int nsec;
 #endif
 
-static inline int
-realtime_getres (struct timespec *res)
-{
-  long int clk_tck = sysconf (_SC_CLK_TCK);
-
-  if (__builtin_expect (clk_tck != -1, 1))
-    {
-      /* This implementation assumes that the realtime clock has a
-        resolution higher than 1 second.  This is the case for any
-        reasonable implementation.  */
-      res->tv_sec = 0;
-      res->tv_nsec = 1000000000 / clk_tck;
-      return 0;
-    }
-
-  return -1;
-}
-
 
 /* Get resolution of clock.  */
 int
@@ -83,33 +38,69 @@ clock_getres (clockid_t clock_id, struct timespec *res)
 
   switch (clock_id)
     {
+#define HANDLE_REALTIME \
+      do {                                                                   \
+       long int clk_tck = sysconf (_SC_CLK_TCK);                             \
+                                                                             \
+       if (__builtin_expect (clk_tck != -1, 1))                              \
+         {                                                                   \
+           /* This implementation assumes that the realtime clock has a      \
+              resolution higher than 1 second.  This is the case for any     \
+              reasonable implementation.  */                                 \
+           res->tv_sec = 0;                                                  \
+           res->tv_nsec = 1000000000 / clk_tck;                              \
+                                                                             \
+           retval = 0;                                                       \
+         }                                                                   \
+      } while (0)
+
 #ifdef SYSDEP_GETRES
       SYSDEP_GETRES;
 #endif
 
 #ifndef HANDLED_REALTIME
     case CLOCK_REALTIME:
-      retval = realtime_getres (res);
+      HANDLE_REALTIME;
       break;
 #endif /* handled REALTIME */
 
     default:
-#ifdef SYSDEP_GETRES_CPU
-      SYSDEP_GETRES_CPU;
-#endif
 #if HP_TIMING_AVAIL
       if ((clock_id & ((1 << CLOCK_IDFIELD_SIZE) - 1))
-         == CLOCK_THREAD_CPUTIME_ID)
-       retval = hp_timing_getres (res);
-      else
+         != CLOCK_THREAD_CPUTIME_ID)
 #endif
-       __set_errno (EINVAL);
-      break;
+       {
+         __set_errno (EINVAL);
+         break;
+       }
 
 #if HP_TIMING_AVAIL && !defined HANDLED_CPUTIME
+      /* FALLTHROUGH.  */
     case CLOCK_PROCESS_CPUTIME_ID:
-    case CLOCK_THREAD_CPUTIME_ID:
-      retval = hp_timing_getres (res);
+      {
+       if (__builtin_expect (nsec == 0, 0))
+         {
+           hp_timing_t freq;
+
+           /* This can only happen if we haven't initialized the `freq'
+              variable yet.  Do this now. We don't have to protect this
+              code against multiple execution since all of them should
+              lead to the same result.  */
+           freq = __get_clockfreq ();
+           if (__builtin_expect (freq == 0, 0))
+             /* Something went wrong.  */
+             break;
+
+           nsec = MAX (UINT64_C (1000000000) / freq, 1);
+         }
+
+       /* File in the values.  The seconds are always zero (unless we
+          have a 1Hz machine).  */
+       res->tv_sec = 0;
+       res->tv_nsec = nsec;
+
+       retval = 0;
+      }
       break;
 #endif
     }