[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-0002.html>
More information about the devel
mailing list