2020-01-15 04:36:44 -05:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "AsioContext.h"
|
|
|
|
|
|
2020-11-17 06:54:28 -04:00
|
|
|
namespace UE {
|
|
|
|
|
namespace Trace {
|
2020-01-15 04:36:44 -05:00
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
FAsioContext::FAsioContext(int32 ThreadCount)
|
|
|
|
|
{
|
|
|
|
|
if (ThreadCount < 1)
|
|
|
|
|
{
|
|
|
|
|
ThreadCount = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IoContext = new asio::io_context(ThreadCount);
|
|
|
|
|
|
|
|
|
|
ThreadPool.SetNum(ThreadCount);
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-22 04:58:56 -05:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
FAsioContext::~FAsioContext()
|
|
|
|
|
{
|
2020-01-28 04:11:19 -05:00
|
|
|
Wait();
|
2020-01-22 04:58:56 -05:00
|
|
|
delete IoContext;
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-15 04:36:44 -05:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
void FAsioContext::Start()
|
|
|
|
|
{
|
2020-01-22 04:58:56 -05:00
|
|
|
if (bRunning)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-15 04:36:44 -05:00
|
|
|
for (std::thread& Thread : ThreadPool)
|
|
|
|
|
{
|
|
|
|
|
std::thread TempThread([this] () { IoContext->run(); });
|
|
|
|
|
Thread = MoveTemp(TempThread);
|
|
|
|
|
}
|
2020-01-22 04:58:56 -05:00
|
|
|
|
|
|
|
|
bRunning = true;
|
2020-01-15 04:36:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2020-01-28 04:11:19 -05:00
|
|
|
void FAsioContext::Stop(bool bWait)
|
2020-01-15 04:36:44 -05:00
|
|
|
{
|
2020-01-22 04:58:56 -05:00
|
|
|
if (!bRunning)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-15 04:36:44 -05:00
|
|
|
IoContext->stop();
|
|
|
|
|
|
2020-01-28 04:11:19 -05:00
|
|
|
if (bWait)
|
|
|
|
|
{
|
|
|
|
|
Wait();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
void FAsioContext::Wait()
|
|
|
|
|
{
|
2020-01-15 04:36:44 -05:00
|
|
|
for (std::thread& Thread : ThreadPool)
|
|
|
|
|
{
|
2020-01-28 04:11:19 -05:00
|
|
|
if (Thread.joinable())
|
|
|
|
|
{
|
|
|
|
|
Thread.join();
|
|
|
|
|
}
|
2020-01-15 04:36:44 -05:00
|
|
|
}
|
|
|
|
|
|
2020-01-22 04:58:56 -05:00
|
|
|
bRunning = false;
|
2020-01-15 04:36:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
asio::io_context& FAsioContext::Get()
|
|
|
|
|
{
|
|
|
|
|
return *IoContext;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Trace
|
2020-11-17 06:54:28 -04:00
|
|
|
} // namespace UE
|