diff options
| author | 2021-09-12 15:42:41 -0700 | |
|---|---|---|
| committer | 2021-09-12 15:42:41 -0700 | |
| commit | 67c0575d9e8c502bed8bea65d26bc7a583725775 (patch) | |
| tree | 1366276894ba2248262dd3b769f9f7f8341e2734 | |
| parent | a1dde21708f6764211f7d6f0a41caef7682b2693 (diff) | |
Re-enable SCHEDULER_DEBUG. Add timer list validation.
| -rw-r--r-- | src/emu/schedule.cpp | 73 | ||||
| -rw-r--r-- | src/emu/schedule.h | 3 |
2 files changed, 75 insertions, 1 deletions
diff --git a/src/emu/schedule.cpp b/src/emu/schedule.cpp index 1250843ec11..96785fd9aba 100644 --- a/src/emu/schedule.cpp +++ b/src/emu/schedule.cpp @@ -482,6 +482,10 @@ persistent_timer &persistent_timer::adjust_internal(attotime const &delay, s32 p { m_instance.m_start = start; m_instance.m_expire = expire; + + // validate + if (SCHEDULER_DEBUG) + m_callback.scheduler().validate_timer_list(); } // mark as modified @@ -679,6 +683,54 @@ void device_scheduler::dump_timers() const //------------------------------------------------- +// validate_timer_list - validate timer list +//------------------------------------------------- + +void device_scheduler::validate_timer_list() +{ + // must always have at least one timer in the list + scheduler_assert(m_active_timers_head != nullptr); + + // check them all + for (timer_instance *timer = m_active_timers_head; timer != nullptr; timer = timer->m_next) + { + // ensure the previous link is valid + if (timer == m_active_timers_head) + scheduler_assert(timer->m_prev == nullptr); + else + { + scheduler_assert(timer->m_prev != nullptr); + scheduler_assert(timer->m_prev->m_next == timer); + } + + // ensure the next link is valid + if (timer == &m_active_timers_tail) + { + scheduler_assert(timer->m_next == nullptr); + scheduler_assert(timer->m_expire.is_never()); + } + else + { + scheduler_assert(timer->m_next != nullptr); + scheduler_assert(timer->m_next->m_prev == timer); + } + + // ensure the list is in order + if (timer != &m_active_timers_tail) + { + scheduler_assert(timer->m_active); + scheduler_assert(timer->m_callback != nullptr); + scheduler_assert(!timer->m_expire.is_never()); + if (timer->m_prev != nullptr) + scheduler_assert(timer->m_expire >= timer->m_prev->m_expire); + if (timer->m_next != nullptr) + scheduler_assert(timer->m_next->m_expire >= timer->m_expire); + } + } +} + + +//------------------------------------------------- // register_save - register all save states //------------------------------------------------- @@ -1178,6 +1230,10 @@ inline void device_scheduler::execute_timers(attotime const &basetime) m_active_timers_head->m_prev = nullptr; timer.m_active = false; + // validate + if (SCHEDULER_DEBUG) + validate_timer_list(); + // set the global state of which callback we're in m_callback_timer = &timer; m_callback_timer_expire_time = timer.m_expire; @@ -1442,6 +1498,10 @@ inline timer_instance &device_scheduler::instance_insert(timer_instance &timer) // since the head changed, the time of the first expirations changed update_first_timer_expire(); abort_timeslice(); + + // validate + if (SCHEDULER_DEBUG) + validate_timer_list(); return timer; } @@ -1456,6 +1516,10 @@ inline timer_instance &device_scheduler::instance_insert(timer_instance &timer) timer.m_next = &m_active_timers_tail; m_active_timers_tail.m_prev = m_active_timers_tail.m_prev->m_next = &timer; + // validate + if (SCHEDULER_DEBUG) + validate_timer_list(); + // no need to recompute if changing a later timer return timer; } @@ -1472,12 +1536,17 @@ inline timer_instance &device_scheduler::instance_insert(timer_instance &timer) timer.m_next = scan; scan->m_prev = scan->m_prev->m_next = &timer; + // validate + if (SCHEDULER_DEBUG) + validate_timer_list(); + // no need to recompute if changing a later timer return timer; } } // should never get here + scheduler_assert(false); return timer; } @@ -1503,6 +1572,10 @@ inline timer_instance &device_scheduler::instance_remove(timer_instance &timer) // link the next to us; we can't be the tail, so presume next is non-null timer.m_next->m_prev = timer.m_prev; + // validate + if (SCHEDULER_DEBUG) + validate_timer_list(); + // return the timer back for chaining return timer; } diff --git a/src/emu/schedule.h b/src/emu/schedule.h index fce2cd4c0dd..b647e9ee668 100644 --- a/src/emu/schedule.h +++ b/src/emu/schedule.h @@ -26,7 +26,7 @@ #ifdef MAME_DEBUG #define SCHEDULER_DEBUG (1) #else -#define SCHEDULER_DEBUG (0) +#define SCHEDULER_DEBUG (1) #endif // if SCHEDULER_DEBUG is on, make assertions fire regardless of MAME_DEBUG @@ -628,6 +628,7 @@ public: // debugging void dump_timers() const; + void validate_timer_list(); // save state registration void register_save(save_manager &save); |
