Files
EASTL/test/packages/EAMain/source/internal/kettle/EAMainSubmitDone.cpp
T
jeanlemotan 48ab06b1d9 First
2024-07-02 18:10:39 +02:00

109 lines
3.1 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Copyright (c) Electronic Arts Inc. All rights reserved.
///////////////////////////////////////////////////////////////////////////////
#include <kernel.h>
#include <sceerror.h>
#include <gnm.h>
#include "EAAssert/eaassert.h"
#define SUBMIT_DEBUG_PRINT(arg)
namespace EA
{
namespace EAMain
{
namespace Internal
{
static ScePthread gSubmitDoneThread;
static SceKernelSema gSubmitDoneSema;
volatile static bool gShutdownSubmitDoneThread = false;
void* SubmitDoneThreadFunction(void *)
{
int result;
EA_UNUSED(result);
SUBMIT_DEBUG_PRINT("Started submit done thread\n");
for(;;)
{
const int microsecondsPerSecond = 1000000;
SceKernelUseconds timeout = 2 * microsecondsPerSecond;
result = sceKernelWaitSema(gSubmitDoneSema, 1, &timeout);
EA_ASSERT(result == SCE_OK || result == SCE_KERNEL_ERROR_ETIMEDOUT);
if(gShutdownSubmitDoneThread)
{
// Break out to avoid calling submitDone
break;
}
else
{
SUBMIT_DEBUG_PRINT("submitDone\n");
#if SCE_ORBIS_SDK_VERSION >= 0x01000051u && SCE_ORBIS_SDK_VERSION != 0x01000071u
// Only perform the submitDone call if we are above SDK version 1.00.051
// but not 1.00.071 since the requirement was temporarily removed in that release.
// This is not required in previous or later SDK versions.
sce::Gnm::submitDone();
#endif
}
}
SUBMIT_DEBUG_PRINT("Ending submit done thread\n");
return nullptr;
}
void StartSubmitDoneThread()
{
int result;
EA_UNUSED(result);
SUBMIT_DEBUG_PRINT("Starting submit done thread\n");
result = sceKernelCreateSema(&gSubmitDoneSema, "submit done semaphore", 0, 0, 1, nullptr);
EA_ASSERT(result == SCE_OK);
result = scePthreadCreate(&gSubmitDoneThread, NULL, SubmitDoneThreadFunction, NULL, "submit done thread");
EA_ASSERT(result == SCE_OK);
}
void ShutdownSubmitDoneThread()
{
if(!gShutdownSubmitDoneThread)
{
SUBMIT_DEBUG_PRINT("Disabling submit done thread\n");
int result;
EA_UNUSED(result);
// Indicate that the submit done thread should exit
gShutdownSubmitDoneThread = true;
// Signal semaphore to unblock the submit done thread
result = sceKernelSignalSema(gSubmitDoneSema, 1);
EA_ASSERT(result == SCE_OK);
// Wait for the thread to exit
result = scePthreadJoin(gSubmitDoneThread, nullptr);
EA_ASSERT(result == SCE_OK);
// Free up kernel resources
result = sceKernelDeleteSema(gSubmitDoneSema);
EA_ASSERT(result == SCE_OK);
}
}
}
void DisableSubmitDoneThread()
{
using namespace EA::EAMain::Internal;
ShutdownSubmitDoneThread();
}
}
}
#undef SUBMIT_DEBUG_PRINT