[PATCH 1/2] Move kernel dependent parts of <sys/time.h>

Joel Sherrill joel at rtems.org
Thu Apr 7 15:56:25 UTC 2016


Does this address the warning in the RTEMS main_date.c command that popped
up with the newlib guard changes?

I am guessing not. Have you looked at that warning when using a toolset
with a recent newlib?
On Apr 7, 2016 5:58 AM, "Sebastian Huber" <
sebastian.huber at embedded-brains.de> wrote:

> Move the kernel dependent parts of <sys/time.h> to new system-specific
> header file <machine/_time.h>.  Provide an empty default implementation.
> Add a specialized implementation for RTEMS.
>
> Signed-off-by: Sebastian Huber <sebastian.huber at embedded-brains.de>
> ---
>  newlib/libc/include/machine/_time.h           |   3 +
>  newlib/libc/include/sys/time.h                | 151 +------------------
>  newlib/libc/sys/rtems/include/machine/_time.h | 199
> ++++++++++++++++++++++++++
>  3 files changed, 204 insertions(+), 149 deletions(-)
>  create mode 100644 newlib/libc/include/machine/_time.h
>  create mode 100644 newlib/libc/sys/rtems/include/machine/_time.h
>
> diff --git a/newlib/libc/include/machine/_time.h
> b/newlib/libc/include/machine/_time.h
> new file mode 100644
> index 0000000..476760c
> --- /dev/null
> +++ b/newlib/libc/include/machine/_time.h
> @@ -0,0 +1,3 @@
> +#ifndef _SYS_TIME_H_
> +#error "must be included via <sys/time.h>"
> +#endif /* !_SYS_TIME_H_ */
> diff --git a/newlib/libc/include/sys/time.h
> b/newlib/libc/include/sys/time.h
> index 326d1a6..84c2ad2 100644
> --- a/newlib/libc/include/sys/time.h
> +++ b/newlib/libc/include/sys/time.h
> @@ -251,47 +251,6 @@ tvtosbt(struct timeval _tv)
>  }
>  #endif /* __BSD_VISIBLE */
>
> -#ifdef _KERNEL
> -
> -/* Operations on timespecs */
> -#define        timespecclear(tvp)      ((tvp)->tv_sec = (tvp)->tv_nsec =
> 0)
> -#define        timespecisset(tvp)      ((tvp)->tv_sec || (tvp)->tv_nsec)
> -#define        timespeccmp(tvp, uvp, cmp)
>       \
> -       (((tvp)->tv_sec == (uvp)->tv_sec) ?                             \
> -           ((tvp)->tv_nsec cmp (uvp)->tv_nsec) :                       \
> -           ((tvp)->tv_sec cmp (uvp)->tv_sec))
> -#define        timespecadd(vvp, uvp)
>      \
> -       do {                                                            \
> -               (vvp)->tv_sec += (uvp)->tv_sec;                         \
> -               (vvp)->tv_nsec += (uvp)->tv_nsec;                       \
> -               if ((vvp)->tv_nsec >= 1000000000) {                     \
> -                       (vvp)->tv_sec++;                                \
> -                       (vvp)->tv_nsec -= 1000000000;                   \
> -               }                                                       \
> -       } while (0)
> -#define        timespecsub(vvp, uvp)
>      \
> -       do {                                                            \
> -               (vvp)->tv_sec -= (uvp)->tv_sec;                         \
> -               (vvp)->tv_nsec -= (uvp)->tv_nsec;                       \
> -               if ((vvp)->tv_nsec < 0) {                               \
> -                       (vvp)->tv_sec--;                                \
> -                       (vvp)->tv_nsec += 1000000000;                   \
> -               }                                                       \
> -       } while (0)
> -
> -/* Operations on timevals. */
> -
> -#define        timevalclear(tvp)               ((tvp)->tv_sec =
> (tvp)->tv_usec = 0)
> -#define        timevalisset(tvp)               ((tvp)->tv_sec ||
> (tvp)->tv_usec)
> -#define        timevalcmp(tvp, uvp, cmp)
>      \
> -       (((tvp)->tv_sec == (uvp)->tv_sec) ?                             \
> -           ((tvp)->tv_usec cmp (uvp)->tv_usec) :                       \
> -           ((tvp)->tv_sec cmp (uvp)->tv_sec))
> -
> -/* timevaladd and timevalsub are not inlined */
> -
> -#endif /* _KERNEL */
> -
>  /*
>   * Names of the interval timers, and structure
>   * defining a timer setting.
> @@ -305,116 +264,9 @@ struct itimerval {
>         struct  timeval it_value;       /* current value */
>  };
>
> -#ifdef _KERNEL
> -
> -/*
> - * Kernel to clock driver interface.
> - */
> -void   inittodr(time_t base);
> -void   resettodr(void);
> -
> -extern volatile time_t time_second;
> -extern volatile time_t time_uptime;
> -extern struct bintime boottimebin;
> -extern struct timeval boottime;
> -extern struct bintime tc_tick_bt;
> -extern sbintime_t tc_tick_sbt;
> -extern struct bintime tick_bt;
> -extern sbintime_t tick_sbt;
> -extern int tc_precexp;
> -extern int tc_timepercentage;
> -extern struct bintime bt_timethreshold;
> -extern struct bintime bt_tickthreshold;
> -extern sbintime_t sbt_timethreshold;
> -extern sbintime_t sbt_tickthreshold;
> -
> -/*
> - * Functions for looking at our clock: [get]{bin,nano,micro}[up]time()
> - *
> - * Functions without the "get" prefix returns the best timestamp
> - * we can produce in the given format.
> - *
> - * "bin"   == struct bintime  == seconds + 64 bit fraction of seconds.
> - * "nano"  == struct timespec == seconds + nanoseconds.
> - * "micro" == struct timeval  == seconds + microseconds.
> - *
> - * Functions containing "up" returns time relative to boot and
> - * should be used for calculating time intervals.
> - *
> - * Functions without "up" returns UTC time.
> - *
> - * Functions with the "get" prefix returns a less precise result
> - * much faster than the functions without "get" prefix and should
> - * be used where a precision of 1/hz seconds is acceptable or where
> - * performance is priority. (NB: "precision", _not_ "resolution" !)
> - */
> -
> -void   binuptime(struct bintime *bt);
> -void   nanouptime(struct timespec *tsp);
> -void   microuptime(struct timeval *tvp);
> -
> -static __inline sbintime_t
> -sbinuptime(void)
> -{
> -       struct bintime _bt;
> -
> -       binuptime(&_bt);
> -       return (bttosbt(_bt));
> -}
> -
> -void   bintime(struct bintime *bt);
> -void   nanotime(struct timespec *tsp);
> -void   microtime(struct timeval *tvp);
> -
> -void   getbinuptime(struct bintime *bt);
> -void   getnanouptime(struct timespec *tsp);
> -void   getmicrouptime(struct timeval *tvp);
> -
> -static __inline sbintime_t
> -getsbinuptime(void)
> -{
> -       struct bintime _bt;
> -
> -       getbinuptime(&_bt);
> -       return (bttosbt(_bt));
> -}
> -
> -void   getbintime(struct bintime *bt);
> -void   getnanotime(struct timespec *tsp);
> -void   getmicrotime(struct timeval *tvp);
> -
> -/* Other functions */
> -int    itimerdecr(struct itimerval *itp, int usec);
> -int    itimerfix(struct timeval *tv);
> -int    ppsratecheck(struct timeval *, int *, int);
> -int    ratecheck(struct timeval *, const struct timeval *);
> -void   timevaladd(struct timeval *t1, const struct timeval *t2);
> -void   timevalsub(struct timeval *t1, const struct timeval *t2);
> -int    tvtohz(struct timeval *tv);
> -
> -#define        TC_DEFAULTPERC          5
> -
> -#define        BT2FREQ(bt)
>      \
> -       (((uint64_t)0x8000000000000000 + ((bt)->frac >> 2)) /           \
> -           ((bt)->frac >> 1))
> -
> -#define        SBT2FREQ(sbt)   ((SBT_1S + ((sbt) >> 1)) / (sbt))
> -
> -#define        FREQ2BT(freq, bt)
>      \
> -{                                                                      \
> -       (bt)->sec = 0;                                                  \
> -       (bt)->frac = ((uint64_t)0x8000000000000000  / (freq)) << 1;     \
> -}
> -
> -#define        TIMESEL(sbt, sbt2)
>       \
> -       (((sbt2) >= sbt_timethreshold) ?                                \
> -           ((*(sbt) = getsbinuptime()), 1) : ((*(sbt) = sbinuptime()), 0))
> -
> -#else /* !_KERNEL */
> +#ifndef _KERNEL
>  #include <time.h>
>
> -#include <sys/cdefs.h>
> -
>  __BEGIN_DECLS
>  int _EXFUN(utimes, (const char *__path, const struct timeval *__tvp));
>
> @@ -444,5 +296,6 @@ int _EXFUN(_gettimeofday, (struct timeval *__p, void
> *__tz));
>  __END_DECLS
>
>  #endif /* !_KERNEL */
> +#include <machine/_time.h>
>
>  #endif /* !_SYS_TIME_H_ */
> diff --git a/newlib/libc/sys/rtems/include/machine/_time.h
> b/newlib/libc/sys/rtems/include/machine/_time.h
> new file mode 100644
> index 0000000..44a220d
> --- /dev/null
> +++ b/newlib/libc/sys/rtems/include/machine/_time.h
> @@ -0,0 +1,199 @@
> +/*-
> + * Copyright (c) 1982, 1986, 1993
> + *     The Regents of the University of California.  All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 4. Neither the name of the University nor the names of its contributors
> + *    may be used to endorse or promote products derived from this
> software
> + *    without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
> LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
> STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
> WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + *     @(#)time.h      8.5 (Berkeley) 5/4/95
> + * $FreeBSD$
> + */
> +
> +#ifndef _SYS_TIME_H_
> +#error "must be included via <sys/time.h>"
> +#else /* _SYS_TIME_H_ */
> +
> +__BEGIN_DECLS
> +extern volatile time_t _Timecounter_Time_second;
> +extern volatile time_t _Timecounter_Time_uptime;
> +extern struct bintime _Timecounter_Boottimebin;
> +
> +void   _Timecounter_Binuptime(struct bintime *);
> +void   _Timecounter_Nanouptime(struct timespec *);
> +void   _Timecounter_Microuptime(struct timeval *);
> +void   _Timecounter_Bintime(struct bintime *);
> +void   _Timecounter_Nanotime(struct timespec *);
> +void   _Timecounter_Microtime(struct timeval *);
> +void   _Timecounter_Getbinuptime(struct bintime *);
> +void   _Timecounter_Getnanouptime(struct timespec *);
> +void   _Timecounter_Getmicrouptime(struct timeval *);
> +void   _Timecounter_Getbintime(struct bintime *);
> +void   _Timecounter_Getnanotime(struct timespec *);
> +void   _Timecounter_Getmicrotime(struct timeval *);
> +__END_DECLS
> +
> +#ifdef _KERNEL
> +
> +/* Operations on timespecs */
> +#define        timespecclear(tvp)      ((tvp)->tv_sec = (tvp)->tv_nsec =
> 0)
> +#define        timespecisset(tvp)      ((tvp)->tv_sec || (tvp)->tv_nsec)
> +#define        timespeccmp(tvp, uvp, cmp)
>       \
> +       (((tvp)->tv_sec == (uvp)->tv_sec) ?                             \
> +           ((tvp)->tv_nsec cmp (uvp)->tv_nsec) :                       \
> +           ((tvp)->tv_sec cmp (uvp)->tv_sec))
> +#define        timespecadd(vvp, uvp)
>      \
> +       do {                                                            \
> +               (vvp)->tv_sec += (uvp)->tv_sec;                         \
> +               (vvp)->tv_nsec += (uvp)->tv_nsec;                       \
> +               if ((vvp)->tv_nsec >= 1000000000) {                     \
> +                       (vvp)->tv_sec++;                                \
> +                       (vvp)->tv_nsec -= 1000000000;                   \
> +               }                                                       \
> +       } while (0)
> +#define        timespecsub(vvp, uvp)
>      \
> +       do {                                                            \
> +               (vvp)->tv_sec -= (uvp)->tv_sec;                         \
> +               (vvp)->tv_nsec -= (uvp)->tv_nsec;                       \
> +               if ((vvp)->tv_nsec < 0) {                               \
> +                       (vvp)->tv_sec--;                                \
> +                       (vvp)->tv_nsec += 1000000000;                   \
> +               }                                                       \
> +       } while (0)
> +
> +/* Operations on timevals. */
> +
> +#define        timevalclear(tvp)               ((tvp)->tv_sec =
> (tvp)->tv_usec = 0)
> +#define        timevalisset(tvp)               ((tvp)->tv_sec ||
> (tvp)->tv_usec)
> +#define        timevalcmp(tvp, uvp, cmp)
>      \
> +       (((tvp)->tv_sec == (uvp)->tv_sec) ?                             \
> +           ((tvp)->tv_usec cmp (uvp)->tv_usec) :                       \
> +           ((tvp)->tv_sec cmp (uvp)->tv_sec))
> +
> +/* timevaladd and timevalsub are not inlined */
> +
> +/*
> + * Kernel to clock driver interface.
> + */
> +void   inittodr(time_t base);
> +void   resettodr(void);
> +
> +#define        time_second _Timecounter_Time_second
> +#define        time_uptime _Timecounter_Time_uptime
> +#define        boottimebin _Timecounter_Boottimebin
> +extern struct timeval boottime;
> +extern struct bintime tc_tick_bt;
> +extern sbintime_t tc_tick_sbt;
> +extern struct bintime tick_bt;
> +extern sbintime_t tick_sbt;
> +extern int tc_precexp;
> +extern int tc_timepercentage;
> +extern struct bintime bt_timethreshold;
> +extern struct bintime bt_tickthreshold;
> +extern sbintime_t sbt_timethreshold;
> +extern sbintime_t sbt_tickthreshold;
> +
> +/*
> + * Functions for looking at our clock: [get]{bin,nano,micro}[up]time()
> + *
> + * Functions without the "get" prefix returns the best timestamp
> + * we can produce in the given format.
> + *
> + * "bin"   == struct bintime  == seconds + 64 bit fraction of seconds.
> + * "nano"  == struct timespec == seconds + nanoseconds.
> + * "micro" == struct timeval  == seconds + microseconds.
> + *
> + * Functions containing "up" returns time relative to boot and
> + * should be used for calculating time intervals.
> + *
> + * Functions without "up" returns UTC time.
> + *
> + * Functions with the "get" prefix returns a less precise result
> + * much faster than the functions without "get" prefix and should
> + * be used where a precision of 1/hz seconds is acceptable or where
> + * performance is priority. (NB: "precision", _not_ "resolution" !)
> + */
> +
> +#define        binuptime(_bt) _Timecounter_Binuptime(_bt)
> +#define        nanouptime(_tsp) _Timecounter_Nanouptime(_tsp)
> +#define        microuptime(_tvp) _Timecounter_Microuptime(_tvp)
> +
> +static __inline sbintime_t
> +sbinuptime(void)
> +{
> +       struct bintime _bt;
> +
> +       binuptime(&_bt);
> +       return (bttosbt(_bt));
> +}
> +
> +#define        bintime(_bt) _Timecounter_Bintime(_bt)
> +#define        nanotime(_tsp) _Timecounter_Nanotime(_tsp)
> +#define        microtime(_tvp) _Timecounter_Microtime(_tvp)
> +
> +#define        getbinuptime(_bt) _Timecounter_Getbinuptime(_bt)
> +#define        getnanouptime(_tsp) _Timecounter_Getnanouptime(_tsp)
> +#define        getmicrouptime(_tvp) _Timecounter_Getmicrouptime(_tvp)
> +
> +static __inline sbintime_t
> +getsbinuptime(void)
> +{
> +       struct bintime _bt;
> +
> +       getbinuptime(&_bt);
> +       return (bttosbt(_bt));
> +}
> +
> +#define        getbintime(_bt) _Timecounter_Getbintime(_bt)
> +#define        getnanotime(_tsp) _Timecounter_Getnanotime(_tsp)
> +#define        getmicrotime(_tvp) _Timecounter_Getmicrotime(_tvp)
> +
> +/* Other functions */
> +int    itimerdecr(struct itimerval *itp, int usec);
> +int    itimerfix(struct timeval *tv);
> +int    ppsratecheck(struct timeval *, int *, int);
> +int    ratecheck(struct timeval *, const struct timeval *);
> +void   timevaladd(struct timeval *t1, const struct timeval *t2);
> +void   timevalsub(struct timeval *t1, const struct timeval *t2);
> +int    tvtohz(struct timeval *tv);
> +
> +#define        TC_DEFAULTPERC          5
> +
> +#define        BT2FREQ(bt)
>      \
> +       (((uint64_t)0x8000000000000000 + ((bt)->frac >> 2)) /           \
> +           ((bt)->frac >> 1))
> +
> +#define        SBT2FREQ(sbt)   ((SBT_1S + ((sbt) >> 1)) / (sbt))
> +
> +#define        FREQ2BT(freq, bt)
>      \
> +{                                                                      \
> +       (bt)->sec = 0;                                                  \
> +       (bt)->frac = ((uint64_t)0x8000000000000000  / (freq)) << 1;     \
> +}
> +
> +#define        TIMESEL(sbt, sbt2)
>       \
> +       (((sbt2) >= sbt_timethreshold) ?                                \
> +           ((*(sbt) = getsbinuptime()), 1) : ((*(sbt) = sbinuptime()), 0))
> +
> +#endif /* _KERNEL */
> +#endif /* _SYS_TIME_H_ */
> --
> 1.8.4.5
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20160407/a6f04203/attachment-0001.html>


More information about the devel mailing list