void FTimerManager::InternalUnPauseTimer(FTimerUnifiedDelegate const& InDelegate) { // not currently threadsafe check(IsInGameThread()); int32 PausedTimerIdx = FindTimerInList(PausedTimerList, InDelegate); if (PausedTimerIdx != INDEX_NONE) { FTimerData& TimerToUnPause = PausedTimerList[PausedTimerIdx]; check(TimerToUnPause.Status == ETimerStatus::Paused); // Move it out of paused list and into proper TArray if( HasBeenTickedThisFrame() ) { // Convert from time remaining back to a valid ExpireTime TimerToUnPause.ExpireTime += InternalTime; TimerToUnPause.Status = ETimerStatus::Active; ActiveTimerHeap.HeapPush(TimerToUnPause); } else { TimerToUnPause.Status = ETimerStatus::Pending; PendingTimerList.Add(TimerToUnPause); } // remove from paused list PausedTimerList.RemoveAtSwap(PausedTimerIdx); } }
/** Will find and return a timer if it exists, regardless whether it is paused. */ FTimerData const* FTimerManager::FindTimer(FTimerUnifiedDelegate const& InDelegate, int32* OutTimerIndex) const { int32 ActiveTimerIdx = FindTimerInList(ActiveTimerHeap, InDelegate); if (ActiveTimerIdx != INDEX_NONE) { // found it in the active heap if (OutTimerIndex) { *OutTimerIndex = ActiveTimerIdx; } return &ActiveTimerHeap[ActiveTimerIdx]; } int32 PausedTimerIdx = FindTimerInList(PausedTimerList, InDelegate); if (PausedTimerIdx != INDEX_NONE) { // found it in the paused list if (OutTimerIndex) { *OutTimerIndex = PausedTimerIdx; } return &PausedTimerList[PausedTimerIdx]; } int32 PendingTimerIdx = FindTimerInList(PendingTimerList, InDelegate); if (PendingTimerIdx != INDEX_NONE) { // found it in the paused list if (OutTimerIndex) { *OutTimerIndex = PendingTimerIdx; } return &PendingTimerList[PendingTimerIdx]; } return NULL; }
FTimerData const* FTimerManager::FindTimer(FTimerHandle const& InHandle, int32* OutTimerIndex) const { int32 ActiveTimerIdx = FindTimerInList(ActiveTimerHeap, InHandle); if (ActiveTimerIdx != INDEX_NONE) { // found it in the active heap if (OutTimerIndex) { *OutTimerIndex = ActiveTimerIdx; } return &ActiveTimerHeap[ActiveTimerIdx]; } int32 PausedTimerIdx = FindTimerInList(PausedTimerList, InHandle); if (PausedTimerIdx != INDEX_NONE) { // found it in the paused list if (OutTimerIndex) { *OutTimerIndex = PausedTimerIdx; } return &PausedTimerList[PausedTimerIdx]; } int32 PendingTimerIdx = FindTimerInList(PendingTimerList, InHandle); if (PendingTimerIdx != INDEX_NONE) { // found it in the pending list if (OutTimerIndex) { *OutTimerIndex = PendingTimerIdx; } return &PendingTimerList[PendingTimerIdx]; } return nullptr; }