]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
main: add gtimer/mtimer magic checks
authorJaroslav Kysela <perex@perex.cz>
Sat, 8 Dec 2018 17:54:12 +0000 (18:54 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sat, 8 Dec 2018 17:54:12 +0000 (18:54 +0100)
src/main.c
src/tvheadend.h

index 7434047287c10c419b50c6c22204def4cfed9ea7..bc2866274679ee4b02addd899277b58925e26eda 100644 (file)
@@ -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;
   }
index 0d926b5bb7b004cbbaeb0c920f831dada28e9a7c..181017a6cb77fa419a6767941266faf61308e2c7 100644 (file)
@@ -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;