2020-01-15 04:36:44 -05:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "AsioTickable.h"
|
2020-02-05 14:26:36 -05:00
|
|
|
#include "Misc/AssertionMacros.h"
|
|
|
|
|
|
|
|
|
|
#include <chrono>
|
2020-01-15 04:36:44 -05:00
|
|
|
|
2020-11-17 06:54:28 -04:00
|
|
|
namespace UE {
|
|
|
|
|
namespace Trace {
|
2020-01-15 04:36:44 -05:00
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
FAsioTickable::FAsioTickable(asio::io_context& IoContext)
|
2020-02-05 14:26:36 -05:00
|
|
|
: Timer(IoContext)
|
2020-01-15 04:36:44 -05:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
FAsioTickable::~FAsioTickable()
|
|
|
|
|
{
|
2020-02-05 14:26:36 -05:00
|
|
|
check(!IsActive());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
asio::io_context& FAsioTickable::GetIoContext()
|
|
|
|
|
{
|
|
|
|
|
return Timer.get_executor().context();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
bool FAsioTickable::IsActive() const
|
|
|
|
|
{
|
|
|
|
|
return MillisecondRate != 0;
|
2020-01-15 04:36:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-23 07:39:24 -05:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2020-06-23 18:40:00 -04:00
|
|
|
bool FAsioTickable::TickOnce(uint32 InMillisecondRate)
|
2020-01-23 07:39:24 -05:00
|
|
|
{
|
|
|
|
|
if (MillisecondRate)
|
|
|
|
|
{
|
2020-06-23 18:40:00 -04:00
|
|
|
return false;
|
2020-01-23 07:39:24 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MillisecondRate = InMillisecondRate;
|
|
|
|
|
if (MillisecondRate)
|
|
|
|
|
{
|
|
|
|
|
AsyncTick();
|
|
|
|
|
MillisecondRate = 0;
|
2020-06-23 18:40:00 -04:00
|
|
|
return true;
|
2020-01-23 07:39:24 -05:00
|
|
|
}
|
2020-06-23 18:40:00 -04:00
|
|
|
|
|
|
|
|
return false;
|
2020-01-23 07:39:24 -05:00
|
|
|
}
|
|
|
|
|
|
2020-01-15 04:36:44 -05:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
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
|
2020-11-17 06:54:28 -04:00
|
|
|
} // namespace UE
|