From: Jaroslav Kysela Date: Fri, 24 Apr 2015 14:45:45 +0000 (+0200) Subject: added gtimer check framework X-Git-Tag: v4.1~112 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4112e4b30bb20716ce32c5b8931e9942822e163c;p=thirdparty%2Ftvheadend.git added gtimer check framework --- diff --git a/configure b/configure index ecd5ed8ad..cf3619c6c 100755 --- a/configure +++ b/configure @@ -48,6 +48,7 @@ OPTIONS=( "dbus_1:auto" "android:no" "tsdebug:no" + "gtimer_check:no" ) # diff --git a/src/main.c b/src/main.c index 6d4d75672..2cdfecc06 100644 --- a/src/main.c +++ b/src/main.c @@ -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(>imers, 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(>imer_cond, &global_lock, &ts); pthread_mutex_unlock(&global_lock); } diff --git a/src/tvheadend.h b/src/tvheadend.h index 246a135dd..444114e61 100644 --- a/src/tvheadend.h +++ b/src/tvheadend.h @@ -44,6 +44,10 @@ #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);