From 686f7a4b4a7e154990831d13e0431190c60a335d Mon Sep 17 00:00:00 2001 From: Martin Baute Date: Sun, 3 Apr 2016 09:05:13 +0200 Subject: [PATCH] POSIX interfacing time retrieval --- includes/time.h | 9 ++++ .../example/functions/time/clock.c | 11 ++++- platform/example/functions/time/time.c | 41 ++++++++++++++++++ .../example/functions/time/timespec_get.c | 42 +++++++++++++++++++ 4 files changed, 101 insertions(+), 2 deletions(-) rename functions/time/time.c => platform/example/functions/time/clock.c (64%) create mode 100644 platform/example/functions/time/time.c create mode 100644 platform/example/functions/time/timespec_get.c diff --git a/includes/time.h b/includes/time.h index 00de956..afee4d9 100644 --- a/includes/time.h +++ b/includes/time.h @@ -19,6 +19,15 @@ typedef _PDCLIB_size_t size_t; #define NULL _PDCLIB_NULL #endif +/* These are defined to be "real types capable of representing types", with + "range and precision of times representable in [them being] implementation- + defined". + As part of struct timespec (see below), time_t is further defined as "a + linear count of seconds", with potentially different semantics from a + "normal" time_t. + For sake of simplicity, we used just that (common) definition of "seconds + since epoch" as integer. +*/ typedef _PDCLIB_time_t time_t; typedef _PDCLIB_clock_t clock_t; diff --git a/functions/time/time.c b/platform/example/functions/time/clock.c similarity index 64% rename from functions/time/time.c rename to platform/example/functions/time/clock.c index 4ef5180..825e040 100644 --- a/functions/time/time.c +++ b/platform/example/functions/time/clock.c @@ -1,4 +1,4 @@ -/* time( time_t * ) +/* clock( void ) This file is part of the Public Domain C Library (PDCLib). Permission is granted to use, modify, and / or redistribute at will. @@ -8,8 +8,15 @@ #ifndef REGTEST -time_t time( time_t * timer ) +#include + +clock_t clock( void ) { + struct tms buf; + if ( times( &buf ) != (clock_t)-1 ) + { + return buf.tms_utime + buf.tms_stime; + } return -1; } diff --git a/platform/example/functions/time/time.c b/platform/example/functions/time/time.c new file mode 100644 index 0000000..cbb29e1 --- /dev/null +++ b/platform/example/functions/time/time.c @@ -0,0 +1,41 @@ +/* time( time_t * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +#include + +/* See comments in time.h on the semantics of time_t. */ + +time_t time( time_t * timer ) +{ + struct timeval tv; + if ( gettimeofday( &tv, NULL ) == 0 ) + { + if ( timer != NULL ) + { + *timer = tv.tv_sec; + } + return tv.tv_sec; + } + return -1; +} + +#endif + +#ifdef TEST + +#include "_PDCLIB_test.h" + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/platform/example/functions/time/timespec_get.c b/platform/example/functions/time/timespec_get.c new file mode 100644 index 0000000..d8cbab7 --- /dev/null +++ b/platform/example/functions/time/timespec_get.c @@ -0,0 +1,42 @@ +/* timespec_get( struct timespec *, int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +#include + +int timespec_get( struct timespec * ts, int base ) +{ + if ( base == TIME_UTC ) + { + /* We can make do with a really thin wrapper here. */ + struct timeval tv; + if ( gettimeofday( &tv, NULL ) == 0 ) + { + ts->tv_sec = tv.tv_sec; + ts->tv_nsec = tv.tv_usec * 1000; + return base; + } + } + /* Not supporting any other time base than TIME_UTC for now. */ + return 0; +} + +#endif + +#ifdef TEST + +#include "_PDCLIB_test.h" + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif -- 2.40.0