[+] Added Linux signal configuration and separate LinuxConfig type (LinuxConfig)

[*] Fix Linux regressions in previous NT commit
This commit is contained in:
Reece Wilson 2023-08-29 01:58:48 +01:00
parent ac0981ac1b
commit 3503d0ec68
7 changed files with 41 additions and 35 deletions

View File

@ -389,6 +389,14 @@ namespace Aurora
}; };
struct LinuxConfig
{
bool bFIODisableBatching { false };
bool bIOLinuxHasProcIpcPerms { false };
AuUInt8 uSignalTerminate { 27 };
AuUInt8 uSignalGAIOWorkerThreadDone { 28 };
};
struct RuntimeStartInfo struct RuntimeStartInfo
{ {
ConsoleConfig console; ConsoleConfig console;
@ -398,9 +406,8 @@ namespace Aurora
AuAlignTo<32, FIOConfig> fio; AuAlignTo<32, FIOConfig> fio;
AuAlignTo<64, DebugConfig> debug; AuAlignTo<64, DebugConfig> debug;
AuAlignTo<32, ThreadingConfig> threadingConfig; AuAlignTo<32, ThreadingConfig> threadingConfig;
AuAlignTo<32, LinuxConfig> linuxConfig;
AuAlignTo<32, DummyConfig> padding; AuAlignTo<32, DummyConfig> padding;
bool bFIODisableBatching { true };
bool bIOLinuxHasProcIpcPerms { false };
}; };
/** /**

View File

@ -51,10 +51,6 @@ namespace Aurora::IO
struct UnixIOHandle final : AFileHandle struct UnixIOHandle final : AFileHandle
{ {
bool InitFromPath(HandleCreate create) override; bool InitFromPath(HandleCreate create) override;
bool IsFile() override;
bool IsTTY() override;
bool IsPipe() override;
}; };
bool UnixIOHandle::InitFromPath(HandleCreate create) bool UnixIOHandle::InitFromPath(HandleCreate create)
@ -176,7 +172,7 @@ namespace Aurora::IO
AUKN_SYM bool IsHandleTTY(AuUInt uHandle) AUKN_SYM bool IsHandleTTY(AuUInt uHandle)
{ {
if ((AuInt)uHandle < 0) if ((AuSInt)uHandle < 0)
{ {
return false; return false;
} }
@ -188,7 +184,7 @@ namespace Aurora::IO
{ {
struct stat st; struct stat st;
if ((AuInt)uHandle < 0) if ((AuSInt)uHandle < 0)
{ {
return false; return false;
} }
@ -206,7 +202,7 @@ namespace Aurora::IO
{ {
struct stat st; struct stat st;
if ((AuInt)uHandle < 0) if ((AuSInt)uHandle < 0)
{ {
return false; return false;
} }

View File

@ -272,7 +272,7 @@ namespace Aurora::IO::FS
} }
else else
{ {
if (gRuntimeConfig.bFIODisableBatching) if (gRuntimeConfig.linuxConfig.bFIODisableBatching)
{ {
UNIX::SendIOBuffers(); UNIX::SendIOBuffers();
} }
@ -329,7 +329,7 @@ namespace Aurora::IO::FS
} }
else else
{ {
if (gRuntimeConfig.bFIODisableBatching) if (gRuntimeConfig.linuxConfig.bFIODisableBatching)
{ {
UNIX::SendIOBuffers(); UNIX::SendIOBuffers();
} }

View File

@ -17,7 +17,6 @@
namespace Aurora::IO::Net namespace Aurora::IO::Net
{ {
static const auto kMagicSignal = SIGRTMIN + 10 - 6 + 9;
static AuList<AuWPtr<NetResolver>> tlsResolvers; static AuList<AuWPtr<NetResolver>> tlsResolvers;
struct ThreadLocalCaughtCompletion : Loop::LSSignalCatcher struct ThreadLocalCaughtCompletion : Loop::LSSignalCatcher
@ -35,8 +34,15 @@ namespace Aurora::IO::Net
NetResolver *pParent_; NetResolver *pParent_;
}; };
// this is beyond dumb and inefficient. i think glibc just creates a singular worker thread and resolves each request in a blocking manner with no mutliplexing
// TODO: we really need to make a general purpose AuAsync IO pool and generic resolver replacer/hooking interface for net services.
static auto GetGAIAsyncIOSignal()
{
return SIGUSR1 + gRuntimeConfig.linuxConfig.uSignalGAIOWorkerThreadDone;
}
ThreadLocalCaughtCompletion::ThreadLocalCaughtCompletion(NetResolver *pParent) : ThreadLocalCaughtCompletion::ThreadLocalCaughtCompletion(NetResolver *pParent) :
LSSignalCatcher({kMagicSignal}), LSSignalCatcher({GetGAIAsyncIOSignal()}),
pParent_(pParent) pParent_(pParent)
{ {
handles_ = {this->handle, AuStaticCast<AuLoop::LSEvent>(this->pParent_->pEvent)->GetHandle()}; handles_ = {this->handle, AuStaticCast<AuLoop::LSEvent>(this->pParent_->pEvent)->GetHandle()};
@ -132,7 +138,7 @@ namespace Aurora::IO::Net
sigevent event {0}; sigevent event {0};
event.sigev_notify = SIGEV_SIGNAL; event.sigev_notify = SIGEV_SIGNAL;
event.sigev_signo = kMagicSignal; event.sigev_signo = GetGAIAsyncIOSignal();
//event._sigev_un._tid = gettid(); //event._sigev_un._tid = gettid();
auto pQueue = AuMakeShared<ThreadLocalCaughtCompletion>(this); auto pQueue = AuMakeShared<ThreadLocalCaughtCompletion>(this);
@ -353,6 +359,6 @@ namespace Aurora::IO::Net
}; };
::sigemptyset(&action.sa_mask); ::sigemptyset(&action.sa_mask);
::sigaction(kMagicSignal, &action, nullptr); ::sigaction(GetGAIAsyncIOSignal(), &action, nullptr);
} }
} }

View File

@ -82,7 +82,7 @@ namespace Aurora::IO::Net
} }
else else
{ {
if (gRuntimeConfig.bFIODisableBatching) if (gRuntimeConfig.linuxConfig.bFIODisableBatching)
{ {
UNIX::SendIOBuffers(); UNIX::SendIOBuffers();
} }
@ -150,7 +150,7 @@ namespace Aurora::IO::Net
} }
else else
{ {
if (gRuntimeConfig.bFIODisableBatching) if (gRuntimeConfig.linuxConfig.bFIODisableBatching)
{ {
UNIX::SendIOBuffers(); UNIX::SendIOBuffers();
} }

View File

@ -459,7 +459,7 @@ namespace Aurora::IO::UNIX
if ((platform.uKernelMajor > 5) || if ((platform.uKernelMajor > 5) ||
((platform.uKernelMajor == 5) && (platform.uKernelMinor >= 6))) ((platform.uKernelMajor == 5) && (platform.uKernelMinor >= 6)))
{ {
gHasProcSyscall = gRuntimeConfig.bIOLinuxHasProcIpcPerms; gHasProcSyscall = gRuntimeConfig.linuxConfig.bIOLinuxHasProcIpcPerms;
} }
#endif #endif
} }

View File

@ -68,7 +68,6 @@ namespace Aurora::Threading::Threads
static ThreadInfo gDummyThreadInfo; static ThreadInfo gDummyThreadInfo;
#if defined(AURORA_IS_POSIX_DERIVED) #if defined(AURORA_IS_POSIX_DERIVED)
static const auto kSignalAbort = SIGUSR1 + 69;
static void HandleSigAbortThread(int a) static void HandleSigAbortThread(int a)
{ {
@ -566,7 +565,7 @@ namespace Aurora::Threading::Threads
Exit(true); Exit(true);
return; return;
} }
AttachSignalKiller();
this->bSupportsAltKill = true; this->bSupportsAltKill = true;
#endif #endif
@ -747,11 +746,11 @@ namespace Aurora::Threading::Threads
#if defined(AURORA_IS_POSIX_DERIVED) #if defined(AURORA_IS_POSIX_DERIVED)
struct sigaction action = struct sigaction action =
{ {
.sa_handler = HandleSigAbortThread .sa_handler = HandleSigAbortThread,
.sa_flags = 0
}; };
::sigemptyset(&action.sa_mask); ::sigemptyset(&action.sa_mask);
::sigaction(kSignalAbort, &action, nullptr); ::sigaction(SIGRTMIN + gRuntimeConfig.linuxConfig.uSignalTerminate, &action, nullptr);
#endif #endif
} }
@ -796,11 +795,6 @@ namespace Aurora::Threading::Threads
SetAffinity(this->mask_); SetAffinity(this->mask_);
AffinityPrioThrottleTickAmendECores(); AffinityPrioThrottleTickAmendECores();
UpdateName(); UpdateName();
if (!this->bNotOwned)
{
AttachSignalKiller();
}
} }
static AuHashMap<EThreadPriority, int> kNiceMap static AuHashMap<EThreadPriority, int> kNiceMap
@ -1282,12 +1276,13 @@ namespace Aurora::Threading::Threads
void OSThread::OSDeatach() void OSThread::OSDeatach()
{ {
#if defined(AURORA_IS_POSIX_DERIVED) #if defined(AURORA_IS_POSIX_DERIVED)
struct sigaction action = this->bSupportsAltKill = false;
{ //struct sigaction action =
.sa_handler = SIG_DFL //{
}; // .sa_handler = SIG_DFL
::sigemptyset(&action.sa_mask); //};
::sigaction(kSignalAbort, &action, nullptr); //::sigemptyset(&action.sa_mask);
//::sigaction(SIGRTMIN + gRuntimeConfig.linuxConfig.uSignalTerminate, &action, nullptr);
#endif #endif
} }
@ -1417,7 +1412,7 @@ namespace Aurora::Threading::Threads
if (this->bSupportsAltKill) if (this->bSupportsAltKill)
{ {
::pthread_kill(this->handle_, kSignalAbort); ::pthread_kill(this->handle_, SIGRTMIN + gRuntimeConfig.linuxConfig.uSignalTerminate);
} }
else else
{ {
@ -1464,6 +1459,8 @@ namespace Aurora::Threading::Threads
AuxUlibInitialize(); AuxUlibInitialize();
#endif #endif
AttachSignalKiller();
if (auto pThread = GetThread()) if (auto pThread = GetThread())
{ {
AuStaticCast<OSThread>(pThread)->MakeMain(); AuStaticCast<OSThread>(pThread)->MakeMain();