diff options
Diffstat (limited to 'src/emu/schedule.cpp')
| -rw-r--r-- | src/emu/schedule.cpp | 73 |
1 files changed, 73 insertions, 0 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; } |
