diff clock.pyx @ 0:1c0396a8fff4 default tip

Import
author Daniele Nicolodi <daniele.nicolodi@obspm.fr>
date Fri, 03 Jul 2015 21:00:16 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/clock.pyx	Fri Jul 03 21:00:16 2015 +0200
@@ -0,0 +1,80 @@
+from libc.errno cimport *
+from libc.stdio cimport snprintf
+
+cdef extern from "time.h":
+    ctypedef long time_t
+    cdef struct _timespec "timespec":
+        time_t tv_sec
+        long tv_nsec
+    cdef enum:
+        CLOCK_MONOTONIC
+        CLOCK_REALTIME
+    cdef enum:
+        TIMER_ABSTIME
+    int clock_gettime(int id, _timespec *tp) nogil
+    int clock_nanosleep(int id, int flags,
+                        _timespec *request,
+                        _timespec *remain) nogil
+
+
+cdef class timespec:
+    cdef _timespec t
+
+    def __init__(self, long sec=0, long nsec=0):
+        self.t.tv_sec = sec
+        self.t.tv_nsec = nsec
+
+    property sec:
+        def __get__(self):
+            return self.t.tv_sec
+        def __set__(self, long v):
+            self.t.tv_sec = v
+
+    property nsec:
+        def __get__(self):
+            return self.t.tv_nsec
+        def __set__(self, long v):
+            self.t.tv_nsec = v
+            while self.t.tv_nsec >= 1000000000:
+                self.t.tv_sec += 1
+                self.t.tv_nsec -= 1000000000
+
+    def __add__(self, long v):
+        self.sec += v
+        return self
+
+    def __float__(self):
+        return self.t.tv_sec + self.t.tv_nsec * 1e-9
+        
+    def __repr__(self):
+        cdef char[64] s
+        snprintf(s, 64, "{ sec=%ld nsec=%ld }", self.t.tv_sec, self.t.tv_nsec)
+        return s
+        
+
+def gettime(clockid=CLOCK_REALTIME):
+    t = timespec()
+    clock_gettime(clockid, &t.t)
+    return t
+
+
+def nanosleep(timespec request, int clockid=CLOCK_REALTIME, bint absolute=False):
+    cdef _timespec remain
+    cdef int flags = 0
+    cdef int r
+    cdef _timespec *t = &request.t
+
+    if absolute:
+        flags = flags | TIMER_ABSTIME
+
+    with nogil:
+        while 1:
+            r = clock_nanosleep(clockid, flags, t, &remain)
+            if r == EINTR:
+                if not absolute:
+                    t = &remain
+                continue
+            break
+
+    if r != 0:
+        raise ValueError