]> rtime.felk.cvut.cz Git - frescor/frsh-include.git/blobdiff - timespec_operations.h
etimedout
[frescor/frsh-include.git] / timespec_operations.h
index 8ae46f0df0417951b3d6b93203629c8bc628c3fc..2a4cf272774e09a18a87377aabed39ab5787b589 100644 (file)
  * executable file might be covered by the GNU Public License.
  *
  *---------------------------------------------------------------------------*/
+// 16-Jul-2007 SANGORRIN corrections to msec_addto_timespec and msec2timespec
+// 23-Jul-2007 SANGORRIN moved t2d and d2t from frsh_time_operations
+// (TODO: test for __ALL__ the functions)
+// -----------------------------------------------------------------------
 
 #ifndef        _MARTE_MISC_TIMESPEC_OPERATIONS_H_
 #define _MARTE_MISC_TIMESPEC_OPERATIONS_H_
  * @file timespec_operations.h
  **/
 
-#include <time.h>
+#include <time.h> // for timespec
+#include <string.h> // for memset
 
 #define smaller_timespec(t1, t2) \
  ( \
   (t1)->tv_sec < (t2)->tv_sec || ((t1)->tv_sec == (t2)->tv_sec &&   \
-                                    (t1)->tv_nsec < (t2)->tv_nsec) \
+  (t1)->tv_nsec < (t2)->tv_nsec) \
  )
 
 #define smaller_or_equal_timespec(t1, t2) \
  ( \
   (t1)->tv_sec < (t2)->tv_sec || ((t1)->tv_sec == (t2)->tv_sec &&    \
-                                    (t1)->tv_nsec <= (t2)->tv_nsec) \
+  (t1)->tv_nsec <= (t2)->tv_nsec) \
  )
 
 #define incr_timespec(t1, t2) \
@@ -137,7 +142,6 @@ do { \
   } \
 } while (0)
 
-
 #define  add_timespec( sum , t1 , t2 ) \
 do { \
   (sum)->tv_sec  = (t1)->tv_sec  + (t2)->tv_sec; \
@@ -162,52 +166,104 @@ do { \
   (t1) \
 )
 
-#include <string.h> /* for memset */
+//---------------//
+// msec2timespec //
+//---------------//
 
-static void inline msec2timespec(long msec, struct timespec *timespec)
+static inline struct timespec msec2timespec(long msec)
 {
+    struct timespec result = {-1, -1};
 
-    memset(timespec, 0, sizeof(struct timespec) );
-
-    if (msec >= 1000)
-    {
-        timespec->tv_sec = msec/1000;
-        timespec->tv_nsec = (msec % 1000) * 1000000;
+    if (msec >= 1000) {
+        result.tv_sec = msec/1000;
+        result.tv_nsec = (msec % 1000) * 1000000;
+    } else {
+        result.tv_sec = 0;
+        result.tv_nsec = msec * 1000000;
     }
 
+    return result;
+}
 
-    return;
+static inline long timespec2msec(const struct timespec *timespec)
+{
+    
+    return (timespec->tv_sec % 2147482) * 1000 + timespec->tv_nsec/1000000;
 }
 
-/* ------------------------------------------------------------ */
 
-static int inline timespec_lessthan_msec(struct timespec timespec, long msec)
+#define HOURS_IN_MSECS 3600000
+#define MINUTES_IN_MSECS 60000
+
+#define HOURS_IN_TS     1000000
+#define MINUTES_IN_TS    100000
+
+static inline long timespec2msects(const struct timespec *timespec)
 {
+    long msec_total = -1;
+    long minutes = -1;
+    long hours = -1;
 
-    long long total_timespec = 0;
-    long long total_msec = 0;
-    int result = 0;
+    long remainder_msecs = -1;
+    long timestamp = -1;
 
-    /* We pass to to ns in a long long */
-    total_timespec = timespec.tv_sec*1000000000 + timespec.tv_nsec;
-    total_msec = msec*1000000;
+    msec_total = (timespec->tv_sec % 2147482) * 1000 + timespec->tv_nsec/1000000;
 
-    result = total_timespec < total_msec;
+    hours = msec_total / HOURS_IN_MSECS;
+    minutes = (msec_total % HOURS_IN_MSECS) / MINUTES_IN_MSECS;
+    remainder_msecs = ( (msec_total % HOURS_IN_MSECS) % MINUTES_IN_MSECS);
+    
+    timestamp = hours*HOURS_IN_TS + minutes*MINUTES_IN_TS + remainder_msecs;
 
-    return result;
+    return timestamp;
+}
+    
+
+//------------------------//
+// timespec_lessthan_msec //
+//------------------------//
+
+static inline int timespec_lessthan_msec(struct timespec *timespec, long msec)
+{
+    struct timespec msec_timespec = {0, 0};
+
+    msec_timespec = msec2timespec(msec);
+    return smaller_timespec(timespec, &msec_timespec);
+}
+
+//---------------------//
+// msec_addto_timespec //
+//---------------------//
+
+static inline void msec_addto_timespec(long msec, struct timespec *timespec)
+{
+    struct timespec msec_timespec = {0, 0};
+
+    msec_timespec = msec2timespec(msec);
+    incr_timespec(timespec, &msec_timespec);
+}
+
+//--------------------------//
+// t2d (timespec to double) //
+//--------------------------//
+
+static inline double t2d(struct timespec time)
+{
+    return time.tv_nsec*0.000000001 + (double)time.tv_sec;
 }
 
-/* ------------------------------------------------------------ */
+//--------------------------//
+// d2t (double to timespec) //
+//--------------------------//
 
-static void inline msec_addto_timespec(long msec, struct timespec *timespec)
+static inline struct timespec d2t(double time)
 {
-    long long total_timespec = 0;
+    struct timespec tmp;
 
-    total_timespec = timespec->tv_sec * 1000000000 + timespec->tv_nsec;
-    total_timespec += msec*1000000;
+    tmp.tv_sec = (long) time;
+    tmp.tv_nsec = (long)((time - (double)tmp.tv_sec) * 1000000000);
 
-    timespec->tv_sec = total_timespec / 1000000000;
-    timespec->tv_nsec = (long) total_timespec % 1000000000;
+    return tmp;
 }
 
 #endif /* _MARTE_MISC_TIMESPEC_OPERATIONS_H_ */