[+] AuLog.LogClassGetNext
[+] AuLog.LogClassRelease [+] AuLog.LogClassAssociateName [+] AuLog.LogClassGetNameSafe [+] AuLog.LogClassGetNameUnsafe [+] AuLog.LogClassInUse [+] AuLog.LogClassTotalInUse [+] AuLog.LogClassTotalAvailable
This commit is contained in:
parent
3fe1bc38d2
commit
a60c1e9503
28
Include/Aurora/Logging/LogClasses.hpp
Normal file
28
Include/Aurora/Logging/LogClasses.hpp
Normal file
@ -0,0 +1,28 @@
|
||||
/***
|
||||
Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: LogClasses.hpp
|
||||
Date: 2023-3-22
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Logging
|
||||
{
|
||||
/**
|
||||
* @brief Allocates a number between kLogLevelUsr and kLogLevelMax
|
||||
* @return
|
||||
*/
|
||||
AUKN_SYM AuResult<AuUInt8> LogClassGetNext();
|
||||
AUKN_SYM void LogClassRelease(AuUInt8 uIndex);
|
||||
|
||||
AUKN_SYM void LogClassAssociateName(AuUInt8 uIndex, const AuString &str);
|
||||
|
||||
AUKN_SYM AuString LogClassGetNameSafe(AuUInt8 uIndex);
|
||||
AUKN_SYM const AuString &LogClassGetNameUnsafe(AuUInt8 uIndex);
|
||||
|
||||
AUKN_SYM bool LogClassInUse(AuUInt8 uIndex);
|
||||
|
||||
AUKN_SYM AuUInt8 LogClassTotalInUse();
|
||||
AUKN_SYM AuUInt8 LogClassTotalAvailable();
|
||||
}
|
@ -15,6 +15,7 @@
|
||||
#include "IBasicSinkRB.hpp"
|
||||
#include "IIPCLogger.hpp"
|
||||
#include "Sinks.hpp"
|
||||
#include "LogClasses.hpp"
|
||||
|
||||
namespace Aurora::Debug
|
||||
{
|
||||
|
125
Source/Logging/AuLogClasses.cpp
Normal file
125
Source/Logging/AuLogClasses.cpp
Normal file
@ -0,0 +1,125 @@
|
||||
/***
|
||||
Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: AuLogClasses.cpp
|
||||
Date: 2023-3-22
|
||||
Author: Reece
|
||||
***/
|
||||
#include <Source/RuntimeInternal.hpp>
|
||||
#include "AuLogClasses.hpp"
|
||||
|
||||
namespace Aurora::Logging
|
||||
{
|
||||
static const AuUInt8 kAvailableSlots = AuLog::kLogLevelMax - AuLog::kLogLevelUsr;
|
||||
static AuUInt32 gAtomicInUseCount {};
|
||||
static AuUInt32 gInUseMap[kAvailableSlots / 8] {};
|
||||
static AuString gStringMap[kAvailableSlots];
|
||||
static AuUInt32 gIterator {};
|
||||
static AuThreadPrimitives::MutexSOO gMutex;
|
||||
|
||||
AUKN_SYM bool LogClassInUse(AuUInt8 uIndex);
|
||||
|
||||
static bool TryAcquire(AuUInt8 uIdx)
|
||||
{
|
||||
if (AuAtomicSet(&gInUseMap[uIdx / (8 * sizeof(*gInUseMap))], uIdx % (8 * sizeof(*gInUseMap))))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
AuAtomicAdd(&gAtomicInUseCount, 1u);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void Release(AuUInt8 uIdx)
|
||||
{
|
||||
if (AuAtomicUnset(&gInUseMap[uIdx / (8 * sizeof(*gInUseMap))], uIdx % (8 * sizeof(*gInUseMap))))
|
||||
{
|
||||
AuAtomicSub(&gAtomicInUseCount, 1u);
|
||||
|
||||
AU_LOCK_GUARD(gMutex);
|
||||
|
||||
if (!LogClassInUse(uIdx + AuLog::kLogLevelUsr))
|
||||
{
|
||||
gStringMap[uIdx].clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void SetString(AuUInt8 uIdx, const AuString &str)
|
||||
{
|
||||
AU_LOCK_GUARD(gMutex);
|
||||
gStringMap[uIdx] = str;
|
||||
}
|
||||
|
||||
static AuResult<AuUInt8> TryAcquire()
|
||||
{
|
||||
auto uFirstGuess = (AuAtomicAdd(&gIterator, 1u) - 1) % kAvailableSlots;
|
||||
|
||||
if (!TryAcquire(uFirstGuess))
|
||||
{
|
||||
for (AU_ITERATE_N(i, kAvailableSlots))
|
||||
{
|
||||
auto uIndex = (i + uFirstGuess) % kAvailableSlots;
|
||||
if (TryAcquire(uIndex))
|
||||
{
|
||||
gIterator = uIndex;
|
||||
return AuUInt8(i);
|
||||
}
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
else
|
||||
{
|
||||
return AuUInt8(uFirstGuess);
|
||||
}
|
||||
}
|
||||
|
||||
AUKN_SYM void LogClassAssociateName(AuUInt8 uIndex, const AuString &str)
|
||||
{
|
||||
SetString(uIndex - AuLog::kLogLevelUsr, str);
|
||||
}
|
||||
|
||||
AUKN_SYM const AuString &LogClassGetNameUnsafe(AuUInt8 uIndex)
|
||||
{
|
||||
return gStringMap[uIndex - AuLog::kLogLevelUsr];
|
||||
}
|
||||
|
||||
AUKN_SYM AuString LogClassGetNameSafe(AuUInt8 uIndex)
|
||||
{
|
||||
AU_LOCK_GUARD(gMutex);
|
||||
return gStringMap[uIndex - AuLog::kLogLevelUsr];
|
||||
}
|
||||
|
||||
AUKN_SYM void LogClassRelease(AuUInt8 uIndex)
|
||||
{
|
||||
Release(uIndex - AuLog::kLogLevelUsr);
|
||||
}
|
||||
|
||||
AUKN_SYM AuResult<AuUInt8> LogClassGetNext()
|
||||
{
|
||||
auto uRes = TryAcquire();
|
||||
if (uRes)
|
||||
{
|
||||
return AuUInt8(uRes.value() + AuLog::kLogLevelUsr);
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
AUKN_SYM bool LogClassInUse(AuUInt8 uIndex)
|
||||
{
|
||||
uIndex -= AuLog::kLogLevelUsr;
|
||||
return gInUseMap[uIndex / (8 * sizeof(*gInUseMap))] & (1u << (uIndex % (8 * sizeof(*gInUseMap))));
|
||||
}
|
||||
|
||||
AUKN_SYM AuUInt8 LogClassTotalAvailable()
|
||||
{
|
||||
return kAvailableSlots;
|
||||
}
|
||||
|
||||
AUKN_SYM AuUInt8 LogClassTotalInUse()
|
||||
{
|
||||
return gAtomicInUseCount;
|
||||
}
|
||||
}
|
14
Source/Logging/AuLogClasses.hpp
Normal file
14
Source/Logging/AuLogClasses.hpp
Normal file
@ -0,0 +1,14 @@
|
||||
/***
|
||||
Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: AuLogClasses.hpp
|
||||
Date: 2023-3-22
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Logging
|
||||
{
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user