Exemple #1
0
        public void Dispose()
        {
            // remove all timers
            while (m_timer_list != null)
            {
                m_timer_allocator.reclaim(m_timer_list.release());
            }

            m_isDisposed = true;
        }
Exemple #2
0
        //-------------------------------------------------
        //  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
        }
Exemple #3
0
        //-------------------------------------------------
        //  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;
        }