OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc2/] [newlib/] [libc/] [sys/] [linux/] [clock_settime.c] - Diff between revs 207 and 520

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 520
/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   This file is part of the GNU C Library.
 
 
   The GNU C Library is free software; you can redistribute it and/or
   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.
   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,
   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.
   Lesser General Public License for more details.
 
 
   You should have received a copy of the GNU Lesser General Public
   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */
   02111-1307 USA.  */
 
 
#include <errno.h>
#include <errno.h>
#include <time.h>
#include <time.h>
#include <sys/time.h>
#include <sys/time.h>
#include <libc-internal.h>
#include <libc-internal.h>
 
 
 
 
#if HP_TIMING_AVAIL
#if HP_TIMING_AVAIL
/* Clock frequency of the processor.  We make it a 64-bit variable
/* Clock frequency of the processor.  We make it a 64-bit variable
   because some jokers are already playing with processors with more
   because some jokers are already playing with processors with more
   than 4GHz.  */
   than 4GHz.  */
static hp_timing_t freq;
static hp_timing_t freq;
 
 
 
 
/* We need the starting time for the process.  */
/* We need the starting time for the process.  */
extern hp_timing_t _dl_cpuclock_offset;
extern hp_timing_t _dl_cpuclock_offset;
 
 
 
 
/* This function is defined in the thread library.  */
/* This function is defined in the thread library.  */
extern void __pthread_clock_settime (hp_timing_t offset)
extern void __pthread_clock_settime (hp_timing_t offset)
     __attribute__ ((__weak__));
     __attribute__ ((__weak__));
#endif
#endif
 
 
 
 
/* Set CLOCK to value TP.  */
/* Set CLOCK to value TP.  */
int
int
clock_settime (clockid_t clock_id, const struct timespec *tp)
clock_settime (clockid_t clock_id, const struct timespec *tp)
{
{
  struct timeval tv;
  struct timeval tv;
  int retval;
  int retval;
 
 
  /* Make sure the time cvalue is OK.  */
  /* Make sure the time cvalue is OK.  */
  if (tp->tv_nsec < 0 || tp->tv_nsec >= 1000000000)
  if (tp->tv_nsec < 0 || tp->tv_nsec >= 1000000000)
    {
    {
      __set_errno (EINVAL);
      __set_errno (EINVAL);
      return -1;
      return -1;
    }
    }
 
 
  switch (clock_id)
  switch (clock_id)
    {
    {
    case CLOCK_REALTIME:
    case CLOCK_REALTIME:
      TIMESPEC_TO_TIMEVAL (&tv, tp);
      TIMESPEC_TO_TIMEVAL (&tv, tp);
 
 
      retval = settimeofday (&tv, NULL);
      retval = settimeofday (&tv, NULL);
      break;
      break;
 
 
#if HP_TIMING_AVAIL
#if HP_TIMING_AVAIL
    case CLOCK_PROCESS_CPUTIME_ID:
    case CLOCK_PROCESS_CPUTIME_ID:
    case CLOCK_THREAD_CPUTIME_ID:
    case CLOCK_THREAD_CPUTIME_ID:
      {
      {
        hp_timing_t tsc;
        hp_timing_t tsc;
        hp_timing_t usertime;
        hp_timing_t usertime;
 
 
        /* First thing is to get the current time.  */
        /* First thing is to get the current time.  */
        HP_TIMING_NOW (tsc);
        HP_TIMING_NOW (tsc);
 
 
        if (__builtin_expect (freq == 0, 0))
        if (__builtin_expect (freq == 0, 0))
          {
          {
            /* This can only happen if we haven't initialized the `freq'
            /* This can only happen if we haven't initialized the `freq'
               variable yet.  Do this now. We don't have to protect this
               variable yet.  Do this now. We don't have to protect this
               code against multiple execution since all of them should
               code against multiple execution since all of them should
               lead to the same result.  */
               lead to the same result.  */
            freq = __get_clockfreq ();
            freq = __get_clockfreq ();
            if (__builtin_expect (freq == 0, 0))
            if (__builtin_expect (freq == 0, 0))
              {
              {
                /* Something went wrong.  */
                /* Something went wrong.  */
                retval = -1;
                retval = -1;
                break;
                break;
              }
              }
          }
          }
 
 
        /* Convert the user-provided time into CPU ticks.  */
        /* Convert the user-provided time into CPU ticks.  */
        usertime = tp->tv_sec * freq + (tp->tv_nsec * freq) / 1000000000ull;
        usertime = tp->tv_sec * freq + (tp->tv_nsec * freq) / 1000000000ull;
 
 
        /* Determine the offset and use it as the new base value.  */
        /* Determine the offset and use it as the new base value.  */
        if (clock_id != CLOCK_THREAD_CPUTIME_ID
        if (clock_id != CLOCK_THREAD_CPUTIME_ID
            || __pthread_clock_settime == NULL)
            || __pthread_clock_settime == NULL)
          _dl_cpuclock_offset = tsc - usertime;
          _dl_cpuclock_offset = tsc - usertime;
        else
        else
          __pthread_clock_settime (tsc - usertime);
          __pthread_clock_settime (tsc - usertime);
 
 
        retval = 0;
        retval = 0;
      }
      }
      break;
      break;
#endif
#endif
 
 
    default:
    default:
      __set_errno (EINVAL);
      __set_errno (EINVAL);
      retval = -1;
      retval = -1;
      break;
      break;
    }
    }
 
 
  return retval;
  return retval;
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.