source: trunk/libs/newlib/src/newlib/libc/sys/linux/clock_gettime.c

Last change on this file was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 2.9 KB
Line 
1/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
2   This file is part of the GNU C Library.
3
4   The GNU C Library is free software; you can redistribute it and/or
5   modify it under the terms of the GNU Lesser General Public
6   License as published by the Free Software Foundation; either
7   version 2.1 of the License, or (at your option) any later version.
8
9   The GNU C Library is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12   Lesser General Public License for more details.
13
14   You should have received a copy of the GNU Lesser General Public
15   License along with the GNU C Library; if not, write to the Free
16   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17   02111-1307 USA.  */
18
19#include <errno.h>
20#include <stdint.h>
21#include <time.h>
22#include <sys/time.h>
23#include <libc-internal.h>
24#include <hp-timing.h>
25
26
27#if HP_TIMING_AVAIL
28/* Clock frequency of the processor.  We make it a 64-bit variable
29   because some jokers are already playing with processors with more
30   than 4GHz.  */
31static hp_timing_t freq;
32
33
34/* We need the starting time for the process.  */
35extern hp_timing_t _dl_cpuclock_offset;
36
37
38/* This function is defined in the thread library.  */
39extern int __pthread_clock_gettime (hp_timing_t freq, struct timespec *tp)
40     __attribute__ ((__weak__));
41#endif
42
43
44/* Get current value of CLOCK and store it in TP.  */
45int
46clock_gettime (clockid_t clock_id, struct timespec *tp)
47{
48  struct timeval tv;
49  int retval = -1;
50
51  switch (clock_id)
52    {
53    case CLOCK_REALTIME:
54      retval = gettimeofday (&tv, NULL);
55      if (retval == 0)
56        /* Convert into `timespec'.  */
57        TIMEVAL_TO_TIMESPEC (&tv, tp);
58      break;
59
60#if HP_TIMING_AVAIL
61    case CLOCK_PROCESS_CPUTIME_ID:
62    case CLOCK_THREAD_CPUTIME_ID:
63      {
64        hp_timing_t tsc;
65
66        if (__builtin_expect (freq == 0, 0))
67          {
68            /* This can only happen if we haven't initialized the `freq'
69               variable yet.  Do this now. We don't have to protect this
70               code against multiple execution since all of them should
71               lead to the same result.  */
72            freq = __get_clockfreq ();
73            if (__builtin_expect (freq == 0, 0))
74              /* Something went wrong.  */
75              break;
76          }
77
78        if (clock_id == CLOCK_THREAD_CPUTIME_ID
79            && __pthread_clock_gettime != NULL)
80          {
81            retval = __pthread_clock_gettime (freq, tp);
82            break;
83          }
84
85        /* Get the current counter.  */
86        HP_TIMING_NOW (tsc);
87
88        /* Compute the offset since the start time of the process.  */
89        tsc -= _dl_cpuclock_offset;
90
91        /* Compute the seconds.  */
92        tp->tv_sec = tsc / freq;
93
94        /* And the nanoseconds.  This computation should be stable until
95           we get machines with about 16GHz frequency.  */
96        tp->tv_nsec = ((tsc % freq) * UINT64_C (1000000000)) / freq;
97
98        retval = 0;
99      }
100    break;
101#endif
102
103    default:
104      __set_errno (EINVAL);
105      break;
106    }
107
108  return retval;
109}
Note: See TracBrowser for help on using the repository browser.