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