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;
}
Example #3
0
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;
}