Files
integration/Source/Integration/TriggeredTask.cpp

71 lines
1.5 KiB
C++

#include "TriggeredTask.h"
FTriggeredTask::FTriggeredTask() {
Client = nullptr;
Thread = nullptr;
ThreadStopRequested = false;
CallEvent = nullptr;
ReturnEvent = nullptr;
}
uint32 FTriggeredTask::Run() {
while (true)
{
CallEvent->Wait();
if (ThreadStopRequested) {
break;
}
// The payload.
Client->Run();
ReturnEvent->Trigger();
}
return 0;
}
void FTriggeredTask::Startup(FRunnable *client) {
FScopeLock lock(&Mutex);
if (Thread == nullptr) {
Client = client;
CallEvent = FPlatformProcess::GetSynchEventFromPool(true);
ReturnEvent = FPlatformProcess::GetSynchEventFromPool(false);
ReturnEvent->Trigger();
Thread = FRunnableThread::Create(this, TEXT("Worker Thread"));
}
}
void FTriggeredTask::Shutdown() {
FScopeLock lock(&Mutex);
if (Thread != nullptr) {
ReturnEvent->Wait();
ThreadStopRequested = true;
CallEvent->Trigger();
delete Thread; // This waits for the thread to complete.
Thread = nullptr;
FPlatformProcess::ReturnSynchEventToPool(CallEvent);
FPlatformProcess::ReturnSynchEventToPool(ReturnEvent);
CallEvent = nullptr;
ReturnEvent = nullptr;
}
ThreadStopRequested = false;
}
void FTriggeredTask::Trigger() {
FScopeLock lock(&Mutex);
if (Thread != nullptr) {
ReturnEvent->Reset();
CallEvent->Trigger();
}
}
void FTriggeredTask::Wait() {
FScopeLock lock(&Mutex);
if (Thread != nullptr) {
ReturnEvent->Wait();
}
}
bool FTriggeredTask::IsRunning() {
FScopeLock lock(&Mutex);
return (Thread != nullptr);
}