Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
added gtimer check framework
  • Loading branch information
perexg committed Apr 24, 2015
1 parent 79e5ff8 commit 4112e4b
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 19 deletions.
1 change: 1 addition & 0 deletions configure
Expand Up @@ -48,6 +48,7 @@ OPTIONS=(
"dbus_1:auto"
"android:no"
"tsdebug:no"
"gtimer_check:no"
)

#
Expand Down
43 changes: 34 additions & 9 deletions src/main.c
Expand Up @@ -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);

Expand All @@ -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);

Expand All @@ -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
}

/**
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 */
Expand All @@ -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);
}
Expand Down
40 changes: 30 additions & 10 deletions src/tvheadend.h
Expand Up @@ -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
Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit 4112e4b

Please sign in to comment.