From: Jaroslav Kysela Date: Sat, 8 Dec 2018 17:54:12 +0000 (+0100) Subject: main: add gtimer/mtimer magic checks X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1b41c315d8919a264f3de57989805e6ffc227070;p=thirdparty%2Ftvheadend.git main: add gtimer/mtimer magic checks --- diff --git a/src/main.c b/src/main.c index 743404728..bc2866274 100644 --- a/src/main.c +++ b/src/main.c @@ -259,6 +259,21 @@ mtimercmp(mtimer_t *a, mtimer_t *b) return safecmp(a->mti_expire, b->mti_expire); } +#if ENABLE_TRACE +static void mtimer_magic_check(mtimer_t *mti) +{ + if (mti->mti_magic1 != MTIMER_MAGIC1) { + tvhdbg(LS_MAIN, "mtimer magic check failed for %p", mti); + tvherror(LS_MAIN, "mtimer magic check failed for %p", mti); + abort(); + } +} +#else +static inline void mtimer_magic_check(mtimer_t *mti) +{ +} +#endif + /** * */ @@ -268,9 +283,14 @@ GTIMER_FCN(mtimer_arm_abs) { lock_assert(&global_lock); - if (mti->mti_callback != NULL) + if (mti->mti_callback != NULL) { + mtimer_magic_check(mti); LIST_REMOVE(mti, mti_link); + } +#if ENABLE_TRACE + mti->mti_magic1 = MTIMER_MAGIC1; +#endif mti->mti_callback = callback; mti->mti_opaque = opaque; mti->mti_expire = when; @@ -305,6 +325,7 @@ void mtimer_disarm(mtimer_t *mti) { if(mti->mti_callback) { + mtimer_magic_check(mti); LIST_REMOVE(mti, mti_link); mti->mti_callback = NULL; } @@ -319,6 +340,21 @@ gtimercmp(gtimer_t *a, gtimer_t *b) return safecmp(a->gti_expire, b->gti_expire); } +#if ENABLE_TRACE +static void gtimer_magic_check(gtimer_t *gti) +{ + if (gti->gti_magic1 != GTIMER_MAGIC1) { + tvhdbg(LS_MAIN, "gtimer magic check failed for %p", gti); + tvherror(LS_MAIN, "gtimer magic check failed for %p", gti); + abort(); + } +} +#else +static inline void gtimer_magic_check(mtimer_t *gti) +{ +} +#endif + /** * */ @@ -328,9 +364,14 @@ GTIMER_FCN(gtimer_arm_absn) { lock_assert(&global_lock); - if (gti->gti_callback != NULL) + if (gti->gti_callback != NULL) { + gtimer_magic_check(gti); LIST_REMOVE(gti, gti_link); + } +#if ENABLE_TRACE + gti->gti_magic1 = GTIMER_MAGIC1; +#endif gti->gti_callback = callback; gti->gti_opaque = opaque; gti->gti_expire = when; @@ -365,6 +406,7 @@ void gtimer_disarm(gtimer_t *gti) { if(gti->gti_callback) { + gtimer_magic_check(gti); LIST_REMOVE(gti, gti_link); gti->gti_callback = NULL; } diff --git a/src/tvheadend.h b/src/tvheadend.h index 0d926b5bb..181017a6c 100644 --- a/src/tvheadend.h +++ b/src/tvheadend.h @@ -127,8 +127,13 @@ extern int tvheadend_htsp_port; typedef void (mti_callback_t)(void *opaque); +#define MTIMER_MAGIC1 0x0d62a9de + typedef struct mtimer { LIST_ENTRY(mtimer) mti_link; +#if ENABLE_TRACE + uint32_t mti_magic1; +#endif mti_callback_t *mti_callback; void *mti_opaque; int64_t mti_expire; @@ -155,10 +160,15 @@ void mtimer_disarm(mtimer_t *mti); * global timer (based on the current system time - time()) */ +#define GTIMER_MAGIC1 0x8a6f238f + typedef void (gti_callback_t)(void *opaque); typedef struct gtimer { LIST_ENTRY(gtimer) gti_link; +#if ENABLE_TRACE + uint32_t gti_magic1; +#endif gti_callback_t *gti_callback; void *gti_opaque; time_t gti_expire;