[+] Initial Linux exit signal handler
[*] Linux Semaphore bug (apparently I can't write loops) [*] Linux sleep bug
This commit is contained in:
parent
d3428f4cd9
commit
d81d4564e9
50
Source/Exit/Exit.Unix.cpp
Normal file
50
Source/Exit/Exit.Unix.cpp
Normal file
@ -0,0 +1,50 @@
|
||||
/***
|
||||
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
File: Exit.Unix.cpp
|
||||
Date: 2022-4-7
|
||||
Author: Reece
|
||||
***/
|
||||
#include <Source/RuntimeInternal.hpp>
|
||||
#include "Exit.hpp"
|
||||
#include "Exit.Unix.hpp"
|
||||
#include <Source/Grug/Grug.hpp>
|
||||
|
||||
namespace Aurora::Exit
|
||||
{
|
||||
static void SendExitSignal(Grug::Arrow *)
|
||||
{
|
||||
PostLevel(AuThreads::GetThread(), Exit::ETriggerLevel::eSigTerminate);
|
||||
}
|
||||
|
||||
static void HandleSigTerminate(int sig)
|
||||
{
|
||||
Grug::Arrow arrow;
|
||||
Grug::HurlArrow(&arrow, SendExitSignal, {});
|
||||
Grug::ArrowWait(&arrow);
|
||||
}
|
||||
|
||||
void InitUnix()
|
||||
{
|
||||
struct sigaction action =
|
||||
{
|
||||
.sa_handler = HandleSigTerminate,
|
||||
.sa_flags = SA_ONSTACK
|
||||
};
|
||||
sigemptyset(&action.sa_mask);
|
||||
|
||||
sigaction(SIGINT, &action, nullptr);
|
||||
}
|
||||
|
||||
void DeinitUnix()
|
||||
{
|
||||
struct sigaction action =
|
||||
{
|
||||
.sa_handler = SIG_DFL,
|
||||
.sa_flags = SA_ONSTACK
|
||||
};
|
||||
|
||||
sigemptyset(&action.sa_mask);
|
||||
|
||||
sigaction(SIGINT, &action, nullptr);
|
||||
}
|
||||
}
|
13
Source/Exit/Exit.Unix.hpp
Normal file
13
Source/Exit/Exit.Unix.hpp
Normal file
@ -0,0 +1,13 @@
|
||||
/***
|
||||
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
File: Exit.Unix.hpp
|
||||
Date: 2022-4-7
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Exit
|
||||
{
|
||||
void InitUnix();
|
||||
void DeinitUnix();
|
||||
}
|
@ -9,6 +9,7 @@
|
||||
#include "Exit.hpp"
|
||||
#include <Source/Grug/Grug.hpp>
|
||||
#include "MTWatchDog.hpp"
|
||||
#include "Exit.Unix.hpp"
|
||||
|
||||
namespace Aurora::Exit
|
||||
{
|
||||
@ -126,10 +127,18 @@ namespace Aurora::Exit
|
||||
{
|
||||
gMutex = AuThreadPrimitives::MutexUnique();
|
||||
InitWatchdog();
|
||||
|
||||
#if defined(AURORA_IS_LINUX_DERIVED)
|
||||
InitUnix();
|
||||
#endif
|
||||
}
|
||||
|
||||
void DeinitExit()
|
||||
{
|
||||
#if defined(AURORA_IS_LINUX_DERIVED)
|
||||
DeinitUnix();
|
||||
#endif
|
||||
|
||||
gMutex.reset();
|
||||
}
|
||||
}
|
@ -154,6 +154,7 @@ namespace Aurora::Grug
|
||||
return;
|
||||
}
|
||||
|
||||
//AU_LOCK_GUARD(gMutex);
|
||||
gCondVar->Signal();
|
||||
}
|
||||
|
||||
|
@ -42,11 +42,10 @@ namespace Aurora::Threading::Primitives
|
||||
}
|
||||
else
|
||||
{
|
||||
struct timespec tspec;
|
||||
struct timespec tspec, start;
|
||||
Time::ms2tsabs(&tspec, timeout);
|
||||
|
||||
auto ret = pthread_cond_timedwait(&pthreadCv_, mutex, &tspec);
|
||||
|
||||
if (ret != 0)
|
||||
{
|
||||
SysAssert(errno == ETIMEDOUT, "conditional timed wait failed");
|
||||
|
@ -74,7 +74,7 @@ namespace Aurora::Threading::Primitives
|
||||
|
||||
void Semaphore::Unlock(long count)
|
||||
{
|
||||
for (int i = 0; i++; i < count)
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
Unlock();
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ namespace Aurora::Threading
|
||||
AUKN_SYM void Sleep(AuUInt64 timeout)
|
||||
{
|
||||
#if defined(AURORA_IS_LINUX_DERIVED)
|
||||
usleep(timeout * 1000000);
|
||||
usleep(timeout * 1000);
|
||||
#elif defined(AURORA_IS_MODERNNT_DERIVED)
|
||||
::Sleep(timeout);
|
||||
#else
|
||||
@ -31,7 +31,7 @@ namespace Aurora::Threading
|
||||
AUKN_SYM void SleepNs(AuUInt64 timeout)
|
||||
{
|
||||
#if defined(AURORA_IS_LINUX_DERIVED) || defined(AURORA_IS_BSD_DERIVED)
|
||||
usleep(timeout);
|
||||
usleep(timeout / 1000);
|
||||
#else
|
||||
auto status = YieldPollNs(true, timeout + Time::CurrentInternalClockNS(), [=]()
|
||||
{
|
||||
|
@ -7,6 +7,10 @@
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#if defined(AURORA_IS_POSIX_DERIVED)
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
namespace Aurora::Time
|
||||
{
|
||||
#if defined(AURORA_PLATFORM_WIN32)
|
||||
@ -35,9 +39,13 @@ namespace Aurora::Time
|
||||
|
||||
static void ms2tsabs(struct timespec *ts, unsigned long ms)
|
||||
{
|
||||
ms += ConvertAuroraToUnixMS(CurrentClockMS());
|
||||
ts->tv_sec = ms / 1000;
|
||||
ts->tv_nsec = (ms % 1000) * 1000000;
|
||||
clock_gettime(CLOCK_REALTIME, ts);
|
||||
|
||||
auto baseNS = ((AuUInt64)ms * (AuUInt64)1'000'000) + (AuUInt64)ts->tv_nsec;
|
||||
auto remainderNS = (AuUInt64)baseNS % (AuUInt64)1'000'000'000;
|
||||
|
||||
ts->tv_sec += baseNS / 1'000'000'000ull;
|
||||
ts->tv_nsec = remainderNS;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user