void timer_init(running_machine *machine) { timer_private *global; int i; /* allocate global data */ global = machine->timer_data = auto_alloc_clear(machine, timer_private); /* we need to wait until the first call to timer_cyclestorun before using real CPU times */ global->exec.basetime = attotime_zero; global->exec.nextfire = attotime_never; global->exec.curquantum = DEFAULT_MINIMUM_QUANTUM; global->callback_timer = NULL; global->callback_timer_modified = FALSE; /* register with the save state system */ state_save_register_item(machine, "timer", NULL, 0, global->exec.basetime.seconds); state_save_register_item(machine, "timer", NULL, 0, global->exec.basetime.attoseconds); state_save_register_postload(machine, timer_postload, NULL); /* initialize the lists */ global->activelist = NULL; global->freelist = &global->timers[0]; for (i = 0; i < MAX_TIMERS-1; i++) global->timers[i].next = &global->timers[i+1]; global->timers[MAX_TIMERS-1].next = NULL; global->freelist_tail = &global->timers[MAX_TIMERS-1]; /* reset the quanta */ global->quantum_list[0].requested = DEFAULT_MINIMUM_QUANTUM; global->quantum_list[0].actual = DEFAULT_MINIMUM_QUANTUM; global->quantum_list[0].expire = attotime_never; global->quantum_current = &global->quantum_list[0]; global->quantum_minimum = ATTOSECONDS_IN_NSEC(1) / 1000; }
device_scheduler::device_scheduler(running_machine &machine) : m_machine(machine), m_executing_device(NULL), m_execute_list(NULL), m_basetime(attotime::zero), m_timer_list(NULL), m_callback_timer(NULL), m_callback_timer_modified(false), m_callback_timer_expire_time(attotime::zero), m_suspend_changes_pending(true), m_quantum_minimum(ATTOSECONDS_IN_NSEC(1) / 1000) { // append a single never-expiring timer so there is always one in the list m_timer_list = &m_timer_allocator.alloc()->init(machine, timer_expired_delegate(), NULL, true); m_timer_list->adjust(attotime::never); // register global states machine.save().save_item(NAME(m_basetime)); machine.save().register_presave(save_prepost_delegate(FUNC(device_scheduler::presave), this)); machine.save().register_postload(save_prepost_delegate(FUNC(device_scheduler::postload), this)); }