AuroraRuntime/Source/Logging/Sinks/IPCSink.cpp

119 lines
2.8 KiB
C++
Raw Normal View History

2022-06-16 23:05:32 +00:00
/***
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: IPCSink.cpp
Date: 2022-6-16
Author: Reece
***/
#include <Source/RuntimeInternal.hpp>
#include "IPCSink.hpp"
namespace Aurora::Logging::Sinks
{
IPCSink::IPCSink(const AuSPtr<Aurora::IO::IPC::IPCPipe> &pPipe,
bool bLengthPrefixed) :
pPipe_(pPipe),
bLengthPrefixed_(bLengthPrefixed)
2022-06-16 23:05:32 +00:00
{
}
bool IPCSink::Init()
{
return static_cast<bool>(this->pPipe_);
2022-06-16 23:05:32 +00:00
}
AuSPtr<IO::IPC::IPCPipe> IPCSink::ToPipe()
{
return this->pPipe_;
}
void IPCSink::OnMessageBlocking(AuUInt8 uLevel, const ConsoleMessage &msg)
2022-06-16 23:05:32 +00:00
{
AU_LOCK_GUARD(this->logMutex_);
auto startOffset = this->logBuffer_.GetWriteOffset();
if (this->bLengthPrefixed_)
{
if (this->logBuffer_.readPtr != this->logBuffer_.base)
{
SysPushErrorConcurrentAborted();
return;
}
if (this->logBuffer_.base == this->logBuffer_.writePtr)
{
this->logBuffer_.Write<AuUInt32>(0);
}
}
2022-06-16 23:05:32 +00:00
msg.Write(this->logBuffer_);
if (!this->logBuffer_)
{
this->logBuffer_.writePtr = this->logBuffer_.base + startOffset;
}
}
bool IPCSink::OnMessageNonblocking(AuUInt8 level, const ConsoleMessage &msg)
{
return true;
}
void IPCSink::OnFlush()
{
AU_LOCK_GUARD(this->logMutex_);
if (!this->logBuffer_.RemainingBytes())
{
return;
}
if (this->bLengthPrefixed_ &&
this->logBuffer_.readPtr == this->logBuffer_.base)
{
auto len = this->logBuffer_.writePtr - this->logBuffer_.base;
this->logBuffer_.writePtr = this->logBuffer_.base;
this->logBuffer_.Write<AuUInt32>(len);
this->logBuffer_.writePtr = this->logBuffer_.base + len;
}
AuUInt uWritten {};
this->pPipe_->Write(AuMemoryViewStreamRead(this->logBuffer_, uWritten));
this->logBuffer_.readPtr += uWritten;
if (this->logBuffer_.readPtr == this->logBuffer_.writePtr)
{
this->logBuffer_.ResetPositions();
}
2022-06-16 23:05:32 +00:00
}
IIPCLogger *NewIPCSinkNew(const AuString &str, bool lengthPrefixed)
2022-06-16 23:05:32 +00:00
{
auto pipe = AuIPC::ImportPipe(str);
if (!pipe)
{
return nullptr;
}
auto logger = _new IPCSink(pipe, lengthPrefixed);
2022-06-16 23:05:32 +00:00
if (!logger)
{
return nullptr;
}
if (!logger->Init())
{
return nullptr;
}
return logger;
}
void NewIPCSinkRelease(IIPCLogger *logger)
2022-06-16 23:05:32 +00:00
{
AuSafeDelete<IPCSink *>(logger);
}
}