[*] Other POSIX systems (non-linux) are probably going to need this improved eSpawnChildProcessWorker awareness

This commit is contained in:
Reece Wilson 2023-12-23 03:56:09 +00:00
parent 2fd41d4142
commit 9393c17564
3 changed files with 44 additions and 5 deletions

View File

@ -12,6 +12,12 @@
#if defined(AURORA_IS_POSIX_DERIVED)
#include "AuExit.Unix.hpp"
namespace Aurora::Processes
{
void PosixProcessShutdown();
}
#endif
#include <Source/Debug/MemoryCrunch.hpp>
@ -50,6 +56,13 @@ namespace Aurora::Exit
}
}
static void UnsafeProcessShutdownHook()
{
#if defined(AURORA_IS_POSIX_DERIVED)
Processes::PosixProcessShutdown();
#endif
}
void PostLevel(AuThreads::IAuroraThread *thread, ETriggerLevel level)
{
AU_DEBUG_MEMCRUNCH;
@ -121,6 +134,13 @@ namespace Aurora::Exit
gHasSentTerminate |= isTerminate;
}
if ((level == ETriggerLevel::eSigTerminate && !gHasCanceled) ||
level == ETriggerLevel::eFatalException ||
level == ETriggerLevel::eSafeTermination)
{
UnsafeProcessShutdownHook();
}
// Force exit after calling the subscribers, should the level be eSigTerminate
if (level == ETriggerLevel::eSigTerminate)
{

View File

@ -50,7 +50,7 @@
namespace Aurora::Processes
{
static AuThreadPrimitives::RWLockUnique_t gRWLock;
static AuRWLock gRWLock;
static AuHashMap<pid_t, ProcessImpl *> gPidLookupMap;
struct ProcessAliveLoopSource : AuLoop::LSEvent
@ -716,6 +716,14 @@ namespace Aurora::Processes
return true;
}
void ProcessImpl::HookMainDeath()
{
if (this->type_ == ESpawnType::eSpawnChildProcessWorker)
{
this->Terminate();
}
}
AUKN_SYM IProcess *SpawnNew(StartupParameters &&params)
{
auto ret = _new ProcessImpl(AuMove(params));
@ -778,8 +786,6 @@ namespace Aurora::Processes
void InitUnix()
{
gRWLock = AuThreadPrimitives::RWLockUnique();
struct sigaction action =
{
.sa_handler = SigChldHandler,
@ -790,6 +796,18 @@ namespace Aurora::Processes
::sigaction(SIGCHLD, &action, nullptr);
}
void PosixProcessShutdown()
{
#if !defined(AURORA_IS_LINUX_DERIVED)
AU_LOCK_GUARD(gRWLock->AsReadable());
for (const auto &[pid, pProcess] : gPidLookupMap)
{
pProcess->Terminate();
}
#endif
}
void DeinitUnix()
{
struct sigaction action =
@ -801,6 +819,6 @@ namespace Aurora::Processes
::sigemptyset(&action.sa_mask);
::sigaction(SIGCHLD, &action, nullptr);
gRWLock.reset();
PosixProcessShutdown();
}
}

View File

@ -59,6 +59,7 @@ namespace Aurora::Processes
void ByeLol(AuSInt code);
void ForkMain();
void HookMainDeath();
private:
int pipeStdOut_[2] { -1, -1 };