Files
UnrealEngineUWP/Engine/Source/Developer/TraceAnalysis/Private/Store/AsioTickable.cpp
Martin Ridgers cfd65a404f Always attempt to cancel a timer regardless of the owning FAsioTickable's state. Without this it isn't possible to cancel one-shot ticks.
#rb jb
#rnx
#jira ue-88376

#ushell-cherrypick of 11302796 by Martin.Ridgers

[CL 11303303 by Martin Ridgers in Main branch]
2020-02-10 08:53:23 -05:00

100 lines
1.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "AsioTickable.h"
#include "Misc/AssertionMacros.h"
#include <chrono>
namespace Trace
{
////////////////////////////////////////////////////////////////////////////////
FAsioTickable::FAsioTickable(asio::io_context& IoContext)
: Timer(IoContext)
{
}
////////////////////////////////////////////////////////////////////////////////
FAsioTickable::~FAsioTickable()
{
check(!IsActive());
}
////////////////////////////////////////////////////////////////////////////////
asio::io_context& FAsioTickable::GetIoContext()
{
return Timer.get_executor().context();
}
////////////////////////////////////////////////////////////////////////////////
bool FAsioTickable::IsActive() const
{
return MillisecondRate != 0;
}
////////////////////////////////////////////////////////////////////////////////
bool FAsioTickable::StartTick(uint32 InMillisecondRate)
{
if (MillisecondRate)
{
return false;
}
MillisecondRate = InMillisecondRate;
if (MillisecondRate)
{
AsyncTick();
return true;
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
bool FAsioTickable::StopTick()
{
MillisecondRate = 0;
Timer.cancel();
return true;
}
////////////////////////////////////////////////////////////////////////////////
void FAsioTickable::TickOnce(uint32 InMillisecondRate)
{
if (MillisecondRate)
{
return;
}
MillisecondRate = InMillisecondRate;
if (MillisecondRate)
{
AsyncTick();
MillisecondRate = 0;
}
}
////////////////////////////////////////////////////////////////////////////////
void FAsioTickable::AsyncTick()
{
auto StdTime = std::chrono::milliseconds(MillisecondRate);
Timer.expires_after(StdTime);
Timer.async_wait([this] (const asio::error_code& ErrorCode)
{
if (ErrorCode)
{
return;
}
OnTick();
if (MillisecondRate)
{
AsyncTick();
}
});
}
} // namespace Trace