From 48c2ba5ee339487ef56ba58d861cb923e3d0c432 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Tue, 8 Nov 2011 23:42:26 +0100
Subject: JOGL: Add 'struct timespec' (POSIX) utils for native time handling

---
 src/jogl/native/timespec.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++
 src/jogl/native/timespec.h | 19 ++++++++++++++
 2 files changed, 82 insertions(+)
 create mode 100644 src/jogl/native/timespec.c
 create mode 100644 src/jogl/native/timespec.h

(limited to 'src/jogl')

diff --git a/src/jogl/native/timespec.c b/src/jogl/native/timespec.c
new file mode 100644
index 000000000..74c1a6901
--- /dev/null
+++ b/src/jogl/native/timespec.c
@@ -0,0 +1,63 @@
+#include "timespec.h"
+#include <sys/time.h>
+
+void timespec_now(struct timespec *ts)
+{
+    struct timeval  tv;
+
+    // not using clock_gettime() [of rt library] due to portability
+    gettimeofday(&tv, NULL);
+    ts->tv_sec  = tv.tv_sec;
+    ts->tv_nsec = tv.tv_usec*1000;  
+}
+
+void timespec_addms(struct timespec *ts, long ms)
+{
+    int sec=ms/1000;
+    ms=ms-sec*1000;
+
+    // perform the addition
+    ts->tv_nsec+=ms*1000000;
+
+    // adjust the time
+    ts->tv_sec+=ts->tv_nsec/1000000000 + sec;
+    ts->tv_nsec=ts->tv_nsec%1000000000;
+}
+
+void timespec_addns(struct timespec *ts, long ns)
+{
+    int sec=ns/1000000000;
+    ns=ns - sec*1000000000;
+
+    // perform the addition
+    ts->tv_nsec+=ns;
+
+    // adjust the time
+    ts->tv_sec+=ts->tv_nsec/1000000000 + sec;
+    ts->tv_nsec=ts->tv_nsec%1000000000;
+
+}
+
+int timespec_compare(struct timespec *a, struct timespec *b)
+{
+    if (a->tv_sec!=b->tv_sec)
+        return a->tv_sec-b->tv_sec;
+    return a->tv_nsec-b->tv_nsec;
+}
+
+void timespec_subtract(struct timespec *r, struct timespec *a, struct timespec *b)
+{
+    r->tv_sec = a->tv_sec;
+    r->tv_nsec = a->tv_nsec - b->tv_nsec;
+    if (r->tv_nsec < 0) {
+        // borrow.
+        r->tv_nsec += 1000000000;
+        r->tv_sec --;
+    }
+    r->tv_sec = r->tv_sec - b->tv_sec;
+}
+
+long timespec_milliseconds(struct timespec *a) 
+{
+    return a->tv_sec*1000 + a->tv_nsec/1000000;
+}
diff --git a/src/jogl/native/timespec.h b/src/jogl/native/timespec.h
new file mode 100644
index 000000000..671eb4716
--- /dev/null
+++ b/src/jogl/native/timespec.h
@@ -0,0 +1,19 @@
+#ifndef _timespec_h
+#define _timespec_h
+
+#include <time.h>
+
+void timespec_now(struct timespec *ts);
+void timespec_addms(struct timespec *ts, long ms);
+void timespec_addns(struct timespec *ts, long ns);
+
+/** returns 0: a==b, >0: a>b, <0: a<b */
+int timespec_compare(struct timespec *a, struct timespec *b);
+
+/** computes r = a - b */
+void timespec_subtract(struct timespec *r, struct timespec *a, struct timespec *b);
+
+/** convert the timespec into milliseconds (may overflow) */
+long timespec_milliseconds(struct timespec *a);
+
+#endif /* _timespec_h */
-- 
cgit v1.2.3