]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
added gtimer check framework
authorJaroslav Kysela <perex@perex.cz>
Fri, 24 Apr 2015 14:45:45 +0000 (16:45 +0200)
committerJaroslav Kysela <perex@perex.cz>
Fri, 24 Apr 2015 14:46:53 +0000 (16:46 +0200)
configure
src/main.c
src/tvheadend.h

index ecd5ed8adc72325ea3dc729201ec355f6b5fa9ff..cf3619c6ccac1efa07d5363e1078d23c4cd21e7d 100755 (executable)
--- a/configure
+++ b/configure
@@ -48,6 +48,7 @@ OPTIONS=(
   "dbus_1:auto"
   "android:no"
   "tsdebug:no"
+  "gtimer_check:no"
 )
 
 #
index 6d4d7567219658fbe80419c543dbf399325d25ef..2cdfecc06ffdc0d39217f7b790d24f4f40dd4a9f 100644 (file)
@@ -237,8 +237,8 @@ gtimercmp(gtimer_t *a, gtimer_t *b)
  *
  */
 void
-gtimer_arm_abs2
-  (gtimer_t *gti, gti_callback_t *callback, void *opaque, struct timespec *when)
+GTIMER_FCN(gtimer_arm_abs2)
+  (GTIMER_TRACEID_ gtimer_t *gti, gti_callback_t *callback, void *opaque, struct timespec *when)
 {
   lock_assert(&global_lock);
 
@@ -248,6 +248,10 @@ gtimer_arm_abs2
   gti->gti_callback = callback;
   gti->gti_opaque   = opaque;
   gti->gti_expire   = *when;
+#if ENABLE_GTIMER_CHECK
+  gti->gti_id       = id;
+  gti->gti_fcn      = fcn;
+#endif
 
   LIST_INSERT_SORTED(&gtimers, gti, gti_link, gtimercmp);
 
@@ -259,37 +263,50 @@ gtimer_arm_abs2
  *
  */
 void
-gtimer_arm_abs
-  (gtimer_t *gti, gti_callback_t *callback, void *opaque, time_t when)
+GTIMER_FCN(gtimer_arm_abs)
+  (GTIMER_TRACEID_ gtimer_t *gti, gti_callback_t *callback, void *opaque, time_t when)
 {
   struct timespec ts;
   ts.tv_nsec = 0;
   ts.tv_sec  = when;
+#if ENABLE_GTIMER_CHECK
+  GTIMER_FCN(gtimer_arm_abs2)(id, fcn, gti, callback, opaque, &ts);
+#else
   gtimer_arm_abs2(gti, callback, opaque, &ts);
+#endif
 }
 
 /**
  *
  */
 void
-gtimer_arm(gtimer_t *gti, gti_callback_t *callback, void *opaque, int delta)
+GTIMER_FCN(gtimer_arm)
+  (GTIMER_TRACEID_ gtimer_t *gti, gti_callback_t *callback, void *opaque, int delta)
 {
+#if ENABLE_GTIMER_CHECK
+  GTIMER_FCN(gtimer_arm_abs)(id, fcn, gti, callback, opaque, dispatch_clock + delta);
+#else
   gtimer_arm_abs(gti, callback, opaque, dispatch_clock + delta);
+#endif
 }
 
 /**
  *
  */
 void
-gtimer_arm_ms
-  (gtimer_t *gti, gti_callback_t *callback, void *opaque, long delta_ms )
+GTIMER_FCN(gtimer_arm_ms)
+  (GTIMER_TRACEID_ gtimer_t *gti, gti_callback_t *callback, void *opaque, long delta_ms )
 {
   struct timespec ts;
   clock_gettime(CLOCK_REALTIME, &ts);
   ts.tv_nsec += (1000000 * delta_ms);
   ts.tv_sec  += (ts.tv_nsec / 1000000000);
   ts.tv_nsec %= 1000000000;
+#if ENABLE_GTIMER_CHECK
+  GTIMER_FCN(gtimer_arm_abs2)(id, fcn, gti, callback, opaque, &ts);
+#else
   gtimer_arm_abs2(gti, callback, opaque, &ts);
+#endif
 }
 
 /**
@@ -469,6 +486,9 @@ mainloop(void)
   gtimer_t *gti;
   gti_callback_t *cb;
   struct timespec ts;
+#if ENABLE_GTIMER_CHECK
+  int64_t mtm;
+#endif
 
   while(tvheadend_running) {
     clock_gettime(CLOCK_REALTIME, &ts);
@@ -502,13 +522,19 @@ mainloop(void)
         break;
       }
 
+#if ENABLE_GTIMER_CHECK
+      mtm = getmonoclock();
+#endif
       cb = gti->gti_callback;
-      //tvhdebug("gtimer", "%p callback", gti);
 
       LIST_REMOVE(gti, gti_link);
       gti->gti_callback = NULL;
 
       cb(gti->gti_opaque);
+
+#if ENABLE_GTIMER_CHECK
+      tvhtrace("gtimer", "%s:%s duration %"PRId64"ns", gti->gti_id, gti->gti_fcn, getmonoclock() - mtm);
+#endif
     }
 
     /* Bound wait */
@@ -518,7 +544,6 @@ mainloop(void)
     }
 
     /* Wait */
-    //tvhdebug("gtimer", "wait till %ld.%09ld", ts.tv_sec, ts.tv_nsec);
     pthread_cond_timedwait(&gtimer_cond, &global_lock, &ts);
     pthread_mutex_unlock(&global_lock);
   }
index 246a135dd917edf9e85b4a42ab0e681322194034..444114e616741d38749829643d573e361e8fb829 100644 (file)
 
 #include "redblack.h"
 
+#define STRINGIFY(s) # s
+#define SRCLINEID() SRCLINEID2(__FILE__, __LINE__)
+#define SRCLINEID2(f,l) f ":" STRINGIFY(l)
+
 #define ERRNO_AGAIN(e) ((e) == EAGAIN || (e) == EINTR || (e) == EWOULDBLOCK)
 
 #if ENABLE_ANDROID
@@ -156,19 +160,35 @@ typedef struct gtimer {
   gti_callback_t *gti_callback;
   void *gti_opaque;
   struct timespec gti_expire;
+#if ENABLE_GTIMER_CHECK
+  const char *gti_id;
+  const char *gti_fcn;
+#endif
 } gtimer_t;
 
-void gtimer_arm(gtimer_t *gti, gti_callback_t *callback, void *opaque,
-               int delta);
-
-void gtimer_arm_ms(gtimer_t *gti, gti_callback_t *callback, void *opaque,
-  long delta_ms);
-
-void gtimer_arm_abs(gtimer_t *gti, gti_callback_t *callback, void *opaque,
-                   time_t when);
+#if ENABLE_GTIMER_CHECK
+#define GTIMER_TRACEID_ const char *id, const char *fcn,
+#define GTIMER_FCN(n) check_##n
+#else
+#define GTIMER_TRACEID_
+#define GTIMER_FCN(n) n
+#endif
 
-void gtimer_arm_abs2(gtimer_t *gti, gti_callback_t *callback, void *opaque,
-  struct timespec *when);
+void GTIMER_FCN(gtimer_arm)
+  (GTIMER_TRACEID_ gtimer_t *gti, gti_callback_t *callback, void *opaque, int delta);
+void GTIMER_FCN(gtimer_arm_ms)
+  (GTIMER_TRACEID_ gtimer_t *gti, gti_callback_t *callback, void *opaque, long delta_ms);
+void GTIMER_FCN(gtimer_arm_abs)
+  (GTIMER_TRACEID_ gtimer_t *gti, gti_callback_t *callback, void *opaque, time_t when);
+void GTIMER_FCN(gtimer_arm_abs2)
+  (GTIMER_TRACEID_ gtimer_t *gti, gti_callback_t *callback, void *opaque, struct timespec *when);
+
+#if ENABLE_GTIMER_CHECK
+#define gtimer_arm(a, b, c, d) GTIMER_FCN(gtimer_arm)(SRCLINEID(), __func__, a, b, c, d)
+#define gtimer_arm_ms(a, b, c, d) GTIMER_FCN(gtimer_arm)(SRCLINEID(), __func__, a, b, c, d)
+#define gtimer_arm_abs(a, b, c, d) GTIMER_FCN(gtimer_arm)(SRCLINEID(), __func__, a, b, c, d)
+#define gtimer_arm_abs2(a, b, c, d) GTIMER_FCN(gtimer_arm)(SRCLINEID(), __func__, a, b, c, d)
+#endif
 
 void gtimer_disarm(gtimer_t *gti);