This commit is contained in:
smf- 2018-07-29 15:54:34 +01:00
parent c295fc4daa
commit c41cf669b8

View File

@ -452,12 +452,7 @@ void device_scheduler::timeslice()
{ {
// only process if this CPU is executing or truly halted (not yielding) // only process if this CPU is executing or truly halted (not yielding)
// and if our target is later than the CPU's current time (coarse check) // and if our target is later than the CPU's current time (coarse check)
if (exec->m_suspend != 0) if (EXPECTED((exec->m_suspend == 0 || exec->m_eatcycles) && target.seconds() >= exec->m_localtime.seconds()))
{
if (exec->m_eatcycles)
exec->m_localtime = target;
}
else if (target.seconds() >= exec->m_localtime.seconds())
{ {
// compute how many attoseconds to execute this CPU // compute how many attoseconds to execute this CPU
attoseconds_t delta = target.attoseconds() - exec->m_localtime.attoseconds(); attoseconds_t delta = target.attoseconds() - exec->m_localtime.attoseconds();
@ -472,6 +467,9 @@ void device_scheduler::timeslice()
int ran = exec->m_cycles_running = divu_64x32(u64(delta) >> exec->m_divshift, exec->m_divisor); int ran = exec->m_cycles_running = divu_64x32(u64(delta) >> exec->m_divshift, exec->m_divisor);
LOG((" cpu '%s': %d (%d cycles)\n", exec->device().tag(), delta, exec->m_cycles_running)); LOG((" cpu '%s': %d (%d cycles)\n", exec->device().tag(), delta, exec->m_cycles_running));
// if we're not suspended, actually execute
if (exec->m_suspend == 0)
{
g_profiler.start(exec->m_profiler); g_profiler.start(exec->m_profiler);
// note that this global variable cycles_stolen can be modified // note that this global variable cycles_stolen can be modified
@ -494,6 +492,7 @@ void device_scheduler::timeslice()
assert(ran >= exec->m_cycles_stolen); assert(ran >= exec->m_cycles_stolen);
ran -= exec->m_cycles_stolen; ran -= exec->m_cycles_stolen;
g_profiler.stop(); g_profiler.stop();
}
// account for these cycles // account for these cycles
exec->m_totalcycles += ran; exec->m_totalcycles += ran;