]> pd.if.org Git - pdclib/commitdiff
POSIX interfacing time retrieval
authorMartin Baute <solar@rootdirectory.de>
Sun, 3 Apr 2016 07:05:13 +0000 (09:05 +0200)
committerMartin Baute <solar@rootdirectory.de>
Sun, 3 Apr 2016 07:05:13 +0000 (09:05 +0200)
includes/time.h
platform/example/functions/time/clock.c [moved from functions/time/time.c with 64% similarity]
platform/example/functions/time/time.c [new file with mode: 0644]
platform/example/functions/time/timespec_get.c [new file with mode: 0644]

index 00de956bfaf21f665fcbb35f92263c297cf69231..afee4d9d9b13f55273af826054738433bc9b70ea 100644 (file)
@@ -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;
 
similarity index 64%
rename from functions/time/time.c
rename to platform/example/functions/time/clock.c
index 4ef5180cf6aba918e291cf00330c03148e4544f2..825e040e9e62ffaad8585972f9b4df508918f35a 100644 (file)
@@ -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 <sys/times.h>
+
+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 (file)
index 0000000..cbb29e1
--- /dev/null
@@ -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 <time.h>
+
+#ifndef REGTEST
+
+#include <sys/time.h>
+
+/* 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 (file)
index 0000000..d8cbab7
--- /dev/null
@@ -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 <time.h>
+
+#ifndef REGTEST
+
+#include <sys/time.h>
+
+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