MCPcopy Create free account
hub / github.com/decaf-emu/decaf-emu / startTimer

Function startTimer

src/libdecaf/src/ios/kernel/ios_kernel_timer.cpp:312–364  ·  view source on GitHub ↗

* Put the timer into the running timer list. * * \return * Returns the position of the timer in the queue, if the position is 0 then * the new timer will be the first one to trigger in which case the caller * is responsbile for updating the next interrupt time. */

Source from the content-addressed store, hash-verified

310 * is responsbile for updating the next interrupt time.
311 */
312uint32_t
313startTimer(phys_ptr<Timer> timer)
314{
315 auto &timerManager = sData->timerManager;
316 auto timerQueuePosition = 0u;
317
318 // Insert timer into the running timer list ordered by nextTriggerTime.
319 if (timerManager.firstRunningTimerIdx < 0) {
320 timerManager.firstRunningTimerIdx = timer->index;
321 timerManager.lastRunningTimerIdx = timer->index;
322
323 timer->prevTimerIdx = int16_t { -1 };
324 timer->nextTimerIdx = int16_t { -1 };
325 } else {
326 auto prevTimerIdx = int16_t { -1 };
327 auto nextTimerIdx = int16_t { -1 };
328 auto itrTimerIdx = timerManager.firstRunningTimerIdx;
329
330 while (itrTimerIdx >= 0) {
331 const auto &itrTimer = timerManager.timers[itrTimerIdx];
332 if (itrTimer.nextTriggerTime >= timer->nextTriggerTime) {
333 break;
334 }
335
336 itrTimerIdx = itrTimer.nextTimerIdx;
337 timerQueuePosition++;
338 }
339
340 if (prevTimerIdx < 0) {
341 nextTimerIdx = timerManager.firstRunningTimerIdx;
342 timerManager.firstRunningTimerIdx = timer->index;
343 } else {
344 auto &prevTimer = timerManager.timers[prevTimerIdx];
345 nextTimerIdx = prevTimer.nextTimerIdx;
346 prevTimer.nextTimerIdx = timer->index;
347 }
348
349 if (nextTimerIdx < 0) {
350 decaf_check(timerManager.lastRunningTimerIdx == prevTimerIdx);
351 timerManager.lastRunningTimerIdx = timer->index;
352 } else {
353 auto &nextTimer = timerManager.timers[nextTimerIdx];
354 nextTimer.prevTimerIdx = timer->index;
355 }
356
357 timer->prevTimerIdx = prevTimerIdx;
358 timer->nextTimerIdx = nextTimerIdx;
359 }
360
361 timer->state = TimerState::Running;
362 timerManager.numRunningTimers++;
363 return timerQueuePosition;
364}
365
366Error
367stopTimer(phys_ptr<Timer> timer)

Callers 3

IOS_CreateTimerFunction · 0.85
IOS_RestartTimerFunction · 0.85
timerThreadEntryFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected