71 lines
1.5 KiB
C++
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(false);
|
|
ReturnEvent = FPlatformProcess::GetSynchEventFromPool(true);
|
|
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);
|
|
}
|