*
*/
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);
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(>imers, gti, gti_link, gtimercmp);
*
*/
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
}
/**
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);
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 */
}
/* Wait */
- //tvhdebug("gtimer", "wait till %ld.%09ld", ts.tv_sec, ts.tv_nsec);
pthread_cond_timedwait(>imer_cond, &global_lock, &ts);
pthread_mutex_unlock(&global_lock);
}
#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
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);