public void Dispose() { // remove all timers while (m_timer_list != null) { m_timer_allocator.reclaim(m_timer_list.release()); } m_isDisposed = true; }
//------------------------------------------------- // postload - after loading a save state //------------------------------------------------- void postload() { // remove all timers and make a private list of permanent ones simple_list <emu_timer> private_list = new simple_list <emu_timer>(); while (m_timer_list != null) { emu_timer timer = m_timer_list; // temporary timers go away entirely (except our special never-expiring one) if (timer.m_temporary && !timer.expire().is_never()) { m_timer_allocator.reclaim(timer.release()); } // permanent ones get added to our private list else { private_list.append(timer_list_remove(timer)); } } { // now re-insert them; this effectively re-sorts them by time emu_timer timer; while ((timer = private_list.detach_head()) != null) { timer_list_insert(timer); } } m_suspend_changes_pending = true; rebuild_execute_list(); // report the timer state after a log LOG("After resetting/reordering timers:\n"); #if VERBOSE dump_timers(); #endif }
//------------------------------------------------- // execute_timers - execute timers that are due //------------------------------------------------- void execute_timers() { if (machine().video().frame_update_count() % 400 == 0) { LOG("execute_timers: new={0} head->expire={1}\n", m_basetime.as_string(), m_timer_list.expire().as_string()); } // now process any timers that are overdue while (m_timer_list.expire() <= m_basetime) { // if this is a one-shot timer, disable it now emu_timer timer = m_timer_list; bool was_enabled = timer.enabled(); if (timer.m_period.is_zero() || timer.m_period.is_never()) { timer.m_enabled = false; } // set the global state of which callback we're in m_callback_timer_modified = false; m_callback_timer = timer; m_callback_timer_expire_time = timer.expire(); // call the callback if (was_enabled) { g_profiler.start(profile_type.PROFILER_TIMER_CALLBACK); if (timer.m_callback != null) { if (timer.m_device != null) { LOG("execute_timers: expired: {0} timer device {1} timer {2}\n", timer.expire().attoseconds(), timer.m_device.tag(), timer.m_id); } else { LOG("execute_timers: expired: {0} timer callback {1}\n", timer.expire().attoseconds(), timer.m_callback.ToString()); } timer.m_callback(timer.m_ptr, timer.m_param); } g_profiler.stop(); } // reset or remove the timer, but only if it wasn't modified during the callback if (!m_callback_timer_modified) { // if the timer is temporary, remove it now if (timer.m_temporary) { m_timer_allocator.reclaim(timer.release()); } // otherwise, reschedule it else { timer.schedule_next_period(); } } } // clear the callback timer global m_callback_timer = null; }