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
+
/**
*
*/
{
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;
mtimer_disarm(mtimer_t *mti)
{
if(mti->mti_callback) {
+ mtimer_magic_check(mti);
LIST_REMOVE(mti, mti_link);
mti->mti_callback = NULL;
}
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
+
/**
*
*/
{
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;
gtimer_disarm(gtimer_t *gti)
{
if(gti->gti_callback) {
+ gtimer_magic_check(gti);
LIST_REMOVE(gti, gti_link);
gti->gti_callback = NULL;
}
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;
* 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;