AuroraRuntime/Source/IO/Loop/LSSignalCatcher.Linux.cpp
J Reece Wilson 4d4f5e2501 [+] ILoopSource::IsSignaledExt(...)
[+] ILoopSource::WaitOnExt(...)
[+] ILoopSource::WaitOnAbsExt(...)
2024-09-07 22:45:34 +01:00

87 lines
1.9 KiB
C++

/***
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: LSSignalCatcher.Linux.cpp
Date: 2022-8-27
Author: Reece
***/
#include <Source/RuntimeInternal.hpp>
#include "LSSignalCatcher.Linux.hpp"
#include "LSFromFdNonblocking.hpp"
namespace Aurora::IO::Loop
{
LSSignalCatcher::LSSignalCatcher(const AuList<int> &signals)
{
Init(signals);
}
LSSignalCatcher::~LSSignalCatcher()
{
if ((this->handle != 0) &&
(this->handle != -1))
{
::close(AuExchange(this->handle, -1));
}
}
void LSSignalCatcher::Init(const AuList<int> &signals)
{
sigset_t mask;
::sigemptyset(&mask);
for (const auto i : signals)
{
::sigaddset(&mask, i);
}
::sigprocmask(SIG_BLOCK, &mask, NULL);
this->handle = ::signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC);
}
void *LSSignalCatcher::GetLastSignalInfo()
{
return &this->siginfo_;
}
bool LSSignalCatcher::IsSignaledNonblocking()
{
return ::read(this->handle, &this->siginfo_, sizeof(this->siginfo_)) == 128;
}
bool LSSignalCatcher::OnTrigger(AuUInt handle)
{
return IsSignaledNonblocking();
}
bool LSSignalCatcher::IsSignaled()
{
return IsSignaledFromNonblockingImpl(this, this, &LSSignalCatcher::IsSignaledNonblocking, true);
}
bool LSSignalCatcher::WaitOn(AuUInt32 timeout)
{
return LSHandle::WaitOn(timeout);
}
ELoopSource LSSignalCatcher::GetType()
{
return ELoopSource::eSourceInternalReserved2;
}
AUKN_SYM AuSPtr<ILSSignalCatcher> NewLSSignalCatcher(const AuList<int> &signals)
{
auto pLS = AuMakeShared<LSSignalCatcher>(signals);
if (!pLS)
{
return {};
}
if (!pLS->HasValidHandle())
{
return {};
}
return pLS;
}
}