about summary refs log tree commit diff
path: root/sysdeps/posix/clock_getres.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/posix/clock_getres.c')
-rw-r--r--sysdeps/posix/clock_getres.c111
1 files changed, 51 insertions, 60 deletions
diff --git a/sysdeps/posix/clock_getres.c b/sysdeps/posix/clock_getres.c
index f4dc21f8af..a2d466607e 100644
--- a/sysdeps/posix/clock_getres.c
+++ b/sysdeps/posix/clock_getres.c
@@ -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
@@ -25,55 +24,11 @@
 #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
     }