[+] IPC: Mutex + Pipe | (manual) cross-process tests
[+] Test 25: address space [*] Update IO test to use proper allocation alignment [*] Refactor compression and system [*] Update Aurora Runtime [*] Update ROXTL [*] Update Googletest
This commit is contained in:
parent
7257cf8df1
commit
ebd25e85f9
@ -1 +1 @@
|
|||||||
Subproject commit f81f99f45ea1d1ecde580b44fd4b35d21f9a2e41
|
Subproject commit 85c85d1a1beec3ff0a7d40b3524201b02f1e3d63
|
@ -1 +1 @@
|
|||||||
Subproject commit b8bcab1bdca221c305b420f30700a30045f91aed
|
Subproject commit 1341f805b0bd14e85d9c74d75c6cfb722d7c42c6
|
@ -43,20 +43,20 @@ static void PrintCPUSpecs()
|
|||||||
static void PrintRamSpecs()
|
static void PrintRamSpecs()
|
||||||
{
|
{
|
||||||
auto val = AuHwInfo::GetMemStatProcessBlamed().value_or(AuHwInfo::RamStat {});
|
auto val = AuHwInfo::GetMemStatProcessBlamed().value_or(AuHwInfo::RamStat {});
|
||||||
AuLogInfo("RamInfo Private Allocation: {}/{}", val.used, val.available);
|
AuLogInfo("RamInfo Private Allocation: {}/{}", val.qwUsed, val.qwAvailable);
|
||||||
|
|
||||||
val = AuHwInfo::GetMemStatProcess().value_or(AuHwInfo::RamStat {});
|
val = AuHwInfo::GetMemStatProcess().value_or(AuHwInfo::RamStat {});
|
||||||
AuLogInfo("RamInfo Address Space: {}/{}", val.used, val.available);
|
AuLogInfo("RamInfo Address Space: {}/{}", val.qwUsed, val.qwAvailable);
|
||||||
|
|
||||||
val = AuHwInfo::GetMemStatSystem().value_or(AuHwInfo::RamStat {});
|
val = AuHwInfo::GetMemStatSystem().value_or(AuHwInfo::RamStat {});
|
||||||
AuLogInfo("RamInfo System Commit Charge: {}/{}", val.used, val.available);
|
AuLogInfo("RamInfo System Commit Charge: {}/{}", val.qwUsed, val.qwAvailable);
|
||||||
AuLogInfo(" if high compared to phys, expand page file");
|
AuLogInfo(" if high compared to phys, expand page file");
|
||||||
|
|
||||||
val = AuHwInfo::GetMemStatStartup().value_or(AuHwInfo::RamStat {});
|
val = AuHwInfo::GetMemStatStartup().value_or(AuHwInfo::RamStat {});
|
||||||
AuLogInfo("RamInfo Startup Commit: {}/{}", val.used, val.available);
|
AuLogInfo("RamInfo Startup Commit: {}/{}", val.qwUsed, val.qwAvailable);
|
||||||
|
|
||||||
val = AuHwInfo::GetMemStatPhysical().value_or(AuHwInfo::RamStat {});
|
val = AuHwInfo::GetMemStatPhysical().value_or(AuHwInfo::RamStat {});
|
||||||
AuLogInfo("RamInfo Physical RAM: {}/{}", val.used, val.available);
|
AuLogInfo("RamInfo Physical RAM: {}/{}", val.qwUsed, val.qwAvailable);
|
||||||
|
|
||||||
AuLogInfo("");
|
AuLogInfo("");
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include <AuroraRuntime.hpp>
|
#include <AuroraRuntime.hpp>
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
|
||||||
TEST(Echo, HelloReplacedGlobalLogger)
|
TEST(Echo, HelloReplacedGlobalLogger)
|
||||||
{
|
{
|
||||||
auto logger = AuLog::NewLoggerShared(AuList<AuSPtr<AuLog::IBasicSink>>{
|
auto logger = AuLog::NewLoggerShared(AuList<AuSPtr<AuLog::IBasicSink>>{
|
||||||
@ -92,7 +91,7 @@ TEST(Echo, RingBuffer)
|
|||||||
* 1000 / 0.00022505837 = 4'443'291 entries per second
|
* 1000 / 0.00022505837 = 4'443'291 entries per second
|
||||||
* at 225ns per formatted LogInfo
|
* at 225ns per formatted LogInfo
|
||||||
*/
|
*/
|
||||||
TEST(Echo, BenchmarckRingbuffer)
|
TEST(Echo, BenchmarkRingbuffer)
|
||||||
{
|
{
|
||||||
AuList<AuSPtr<AuLog::IBasicSink>> sinks;
|
AuList<AuSPtr<AuLog::IBasicSink>> sinks;
|
||||||
|
|
||||||
@ -118,7 +117,7 @@ TEST(Echo, BenchmarckRingbuffer)
|
|||||||
// terminal hosts, character devices, and so on to keep up
|
// terminal hosts, character devices, and so on to keep up
|
||||||
// Benchmark data is unreliable, though the relevant profiled user-code seems to be limited to a spinlock
|
// Benchmark data is unreliable, though the relevant profiled user-code seems to be limited to a spinlock
|
||||||
#if 0
|
#if 0
|
||||||
TEST(Echo, BenchmarckMain)
|
TEST(Echo, BenchmarkMain)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
SysBenchmark("Push a boat-load of messages to a stdout");
|
SysBenchmark("Push a boat-load of messages to a stdout");
|
||||||
@ -140,7 +139,7 @@ TEST(Echo, BenchmarckMain)
|
|||||||
* 1000 / 0.000206834 = 4'834'795 entries per second
|
* 1000 / 0.000206834 = 4'834'795 entries per second
|
||||||
* at 206.834ns per formatted AuLogInfo
|
* at 206.834ns per formatted AuLogInfo
|
||||||
*/
|
*/
|
||||||
TEST(Echo, BenchmarckLite)
|
TEST(Echo, BenchmarkLite)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
SysBenchmark("Push a few messages to a stdout and friends");
|
SysBenchmark("Push a few messages to a stdout and friends");
|
||||||
|
@ -132,7 +132,7 @@ TEST(IO, Proceessor_FailAbort)
|
|||||||
TEST(IO, ReadFileThroughPipeProcessor2MBReadsEQ)
|
TEST(IO, ReadFileThroughPipeProcessor2MBReadsEQ)
|
||||||
{
|
{
|
||||||
// Write 20MB of RNG asynchronously
|
// Write 20MB of RNG asynchronously
|
||||||
AuByteBuffer rngbuffer(512 * 1024 * 40);
|
AuByteBuffer rngbuffer(512 * 1024 * 40, AuUInt(AuHwInfo::GetPageSize()));
|
||||||
{
|
{
|
||||||
auto stream = AuIOFS::OpenAsyncUnique("./AsyncFilePIPE", AuIOFS::EFileOpenMode::eReadWrite, true);
|
auto stream = AuIOFS::OpenAsyncUnique("./AsyncFilePIPE", AuIOFS::EFileOpenMode::eReadWrite, true);
|
||||||
ASSERT_TRUE(bool(stream));
|
ASSERT_TRUE(bool(stream));
|
||||||
@ -142,9 +142,10 @@ TEST(IO, ReadFileThroughPipeProcessor2MBReadsEQ)
|
|||||||
auto transaction = stream->NewTransaction();
|
auto transaction = stream->NewTransaction();
|
||||||
ASSERT_TRUE(bool(transaction));
|
ASSERT_TRUE(bool(transaction));
|
||||||
|
|
||||||
transaction->SetCallback(AuMakeShared<AuIO::IAsyncFinishedSubscriberFunctional>([](AuUInt64 offset, AuUInt32 length)
|
transaction->SetCallback(AuMakeShared<AuIO::IAsyncFinishedSubscriberFunctional>([=](AuUInt64 offset, AuUInt32 length)
|
||||||
{
|
{
|
||||||
AuLogDbg("AIO 1 callback: {} {}", offset, length);
|
AuLogDbg("AIO 1 callback: {} {} {}", offset, length, transaction->GetOSErrorCode());
|
||||||
|
SysAssert(length == 512 * 1024 * 40);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
AuMemoryViewRead readView(rngbuffer);
|
AuMemoryViewRead readView(rngbuffer);
|
||||||
@ -244,7 +245,7 @@ TEST(IO, ReadFileThroughPipeProcessor2MBReadsEQ)
|
|||||||
TEST(IO, ReadFileThroughPipeProcessorDefaultConfigEQ)
|
TEST(IO, ReadFileThroughPipeProcessorDefaultConfigEQ)
|
||||||
{
|
{
|
||||||
// Write 20MB of RNG asynchronously
|
// Write 20MB of RNG asynchronously
|
||||||
AuByteBuffer rngbuffer(512 * 1024 * 40);
|
AuByteBuffer rngbuffer(512 * 1024 * 40, AuUInt(AuHwInfo::GetPageSize()));
|
||||||
{
|
{
|
||||||
auto stream = AuIOFS::OpenAsyncUnique("./AsyncFilePIPE", AuIOFS::EFileOpenMode::eReadWrite, true);
|
auto stream = AuIOFS::OpenAsyncUnique("./AsyncFilePIPE", AuIOFS::EFileOpenMode::eReadWrite, true);
|
||||||
ASSERT_TRUE(bool(stream));
|
ASSERT_TRUE(bool(stream));
|
||||||
@ -254,7 +255,7 @@ TEST(IO, ReadFileThroughPipeProcessorDefaultConfigEQ)
|
|||||||
auto transaction = stream->NewTransaction();
|
auto transaction = stream->NewTransaction();
|
||||||
ASSERT_TRUE(bool(transaction));
|
ASSERT_TRUE(bool(transaction));
|
||||||
|
|
||||||
transaction->SetCallback(AuMakeShared<AuIO::IAsyncFinishedSubscriberFunctional>([](AuUInt64 offset, AuUInt32 length)
|
transaction->SetCallback(AuMakeShared<AuIO::IAsyncFinishedSubscriberFunctional>([=](AuUInt64 offset, AuUInt32 length)
|
||||||
{
|
{
|
||||||
AuLogDbg("AIO 1 callback: {} {}", offset, length);
|
AuLogDbg("AIO 1 callback: {} {}", offset, length);
|
||||||
}));
|
}));
|
||||||
@ -352,15 +353,16 @@ static void ReadFileThroughPipeProcessorCongested(int i)
|
|||||||
auto stream = AuIOFS::OpenAsyncUnique("./AsyncFilePIPE", AuIOFS::EFileOpenMode::eReadWrite, true);
|
auto stream = AuIOFS::OpenAsyncUnique("./AsyncFilePIPE", AuIOFS::EFileOpenMode::eReadWrite, true);
|
||||||
ASSERT_TRUE(bool(stream));
|
ASSERT_TRUE(bool(stream));
|
||||||
|
|
||||||
AuByteBuffer rngbuffer(512 * 1024 * 40);
|
AuByteBuffer rngbuffer(512 * 1024 * 40, AuUInt(AuHwInfo::GetPageSize()));
|
||||||
AuRng::RngFillRange(rngbuffer);
|
AuRng::RngFillRange(rngbuffer);
|
||||||
|
|
||||||
auto transaction = stream->NewTransaction();
|
auto transaction = stream->NewTransaction();
|
||||||
ASSERT_TRUE(bool(transaction));
|
ASSERT_TRUE(bool(transaction));
|
||||||
|
|
||||||
transaction->SetCallback(AuMakeShared<AuIO::IAsyncFinishedSubscriberFunctional>([](AuUInt64 offset, AuUInt32 length)
|
transaction->SetCallback(AuMakeShared<AuIO::IAsyncFinishedSubscriberFunctional>([=](AuUInt64 offset, AuUInt32 length)
|
||||||
{
|
{
|
||||||
AuLogDbg("AIO 1 callback: {} {}", offset, length);
|
AuLogDbg("AIO 1 callback: {} {}", offset, length);
|
||||||
|
SysAssert(length == 512 * 1024 * 40);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
AuMemoryViewRead readView(rngbuffer);
|
AuMemoryViewRead readView(rngbuffer);
|
||||||
|
153
Tests/Public/25. Hello Address Map/Main.cpp
Normal file
153
Tests/Public/25. Hello Address Map/Main.cpp
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: Main.cpp
|
||||||
|
Date: 2022-2-18
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
#include <AuroraRuntime.hpp>
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
TEST(Map, FSNoLock)
|
||||||
|
{
|
||||||
|
int size = 4096 * 4;
|
||||||
|
AuByteBuffer rngbuffer(size);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto fsInit = AuIOFS::OpenShared("./FSMap", AuIOFS::EFileOpenMode::eWrite);
|
||||||
|
ASSERT_TRUE(bool(fsInit));
|
||||||
|
|
||||||
|
AuRng::RngFillRange(rngbuffer);
|
||||||
|
fsInit->Write(AuMemoryViewStreamRead(rngbuffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto fsMap = AuIOFS::OpenShared("./FSMap", AuIOFS::EFileOpenMode::eReadWrite, AuFS::EFileAdvisoryLockLevel::eNoSafety);
|
||||||
|
ASSERT_TRUE(bool(fsMap));
|
||||||
|
|
||||||
|
auto shared = AuProcess::GetGlobalProcessSpace();
|
||||||
|
SysAssert(shared);
|
||||||
|
|
||||||
|
auto obj = shared->MapFileByObject(fsMap, 0, size, AuIOFS::EFileOpenMode::eRead, AuFS::EFileAdvisoryLockLevel::eBlockWrite);
|
||||||
|
ASSERT_TRUE(bool(obj));
|
||||||
|
|
||||||
|
ASSERT_TRUE(memcmp(obj->GetBasePointer(), rngbuffer.base, size) == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(Map, FSNestedReadLock)
|
||||||
|
{
|
||||||
|
int size = 4096 * 4;
|
||||||
|
AuByteBuffer rngbuffer(size);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto fsInit = AuIOFS::OpenShared("./FSMap", AuIOFS::EFileOpenMode::eWrite);
|
||||||
|
ASSERT_TRUE(bool(fsInit));
|
||||||
|
|
||||||
|
AuRng::RngFillRange(rngbuffer);
|
||||||
|
fsInit->Write(AuMemoryViewStreamRead(rngbuffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto fsMap = AuIOFS::OpenShared("./FSMap", AuIOFS::EFileOpenMode::eReadWrite, AuFS::EFileAdvisoryLockLevel::eBlockWrite);
|
||||||
|
ASSERT_TRUE(bool(fsMap));
|
||||||
|
|
||||||
|
auto shared = AuProcess::GetGlobalProcessSpace();
|
||||||
|
SysAssert(shared);
|
||||||
|
|
||||||
|
auto obj = shared->MapFileByObject(fsMap, 0, size, AuIOFS::EFileOpenMode::eRead, AuFS::EFileAdvisoryLockLevel::eBlockWrite);
|
||||||
|
ASSERT_TRUE(bool(obj));
|
||||||
|
|
||||||
|
ASSERT_TRUE(memcmp(obj->GetBasePointer(), rngbuffer.base, size) == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST(Map, FSNestedReadLock2)
|
||||||
|
{
|
||||||
|
int size = 4096 * 4;
|
||||||
|
AuByteBuffer rngbuffer(size);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto fsInit = AuIOFS::OpenShared("./FSMap", AuIOFS::EFileOpenMode::eWrite);
|
||||||
|
ASSERT_TRUE(bool(fsInit));
|
||||||
|
|
||||||
|
AuRng::RngFillRange(rngbuffer);
|
||||||
|
fsInit->Write(AuMemoryViewStreamRead(rngbuffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto fsMap = AuIOFS::OpenShared("./FSMap", AuIOFS::EFileOpenMode::eRead, AuFS::EFileAdvisoryLockLevel::eBlockWrite);
|
||||||
|
ASSERT_TRUE(bool(fsMap));
|
||||||
|
|
||||||
|
auto shared = AuProcess::GetGlobalProcessSpace();
|
||||||
|
SysAssert(shared);
|
||||||
|
|
||||||
|
auto obj = shared->MapFileByObject(fsMap, 0, size, AuIOFS::EFileOpenMode::eRead, AuFS::EFileAdvisoryLockLevel::eBlockWrite);
|
||||||
|
ASSERT_TRUE(bool(obj));
|
||||||
|
|
||||||
|
ASSERT_TRUE(memcmp(obj->GetBasePointer(), rngbuffer.base, size) == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST(Map, FSNestedReadLockFail1)
|
||||||
|
{
|
||||||
|
int size = 4096 * 4;
|
||||||
|
AuByteBuffer rngbuffer(size);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto fsInit = AuIOFS::OpenShared("./FSMap", AuIOFS::EFileOpenMode::eWrite);
|
||||||
|
ASSERT_TRUE(bool(fsInit));
|
||||||
|
|
||||||
|
AuRng::RngFillRange(rngbuffer);
|
||||||
|
fsInit->Write(AuMemoryViewStreamRead(rngbuffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto fsMap = AuIOFS::OpenShared("./FSMap", AuIOFS::EFileOpenMode::eRead, AuFS::EFileAdvisoryLockLevel::eBlockWrite);
|
||||||
|
ASSERT_TRUE(bool(fsMap));
|
||||||
|
|
||||||
|
auto shared = AuProcess::GetGlobalProcessSpace();
|
||||||
|
SysAssert(shared);
|
||||||
|
|
||||||
|
auto obj = shared->MapFileByObject(fsMap, 0, size, AuIOFS::EFileOpenMode::eWrite, AuFS::EFileAdvisoryLockLevel::eBlockWrite);
|
||||||
|
ASSERT_TRUE(!bool(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(Map, IPC)
|
||||||
|
{
|
||||||
|
static const AuString kHelloWorld = "Hello IPC";
|
||||||
|
|
||||||
|
auto memory = AuIPC::NewSharedMemory(4096);
|
||||||
|
ASSERT_TRUE(bool(memory));
|
||||||
|
|
||||||
|
AuMemcpy(memory->GetMemory().ptr, kHelloWorld.c_str(), kHelloWorld.size() + 1);
|
||||||
|
|
||||||
|
auto handleString = memory->ExportToString();
|
||||||
|
ASSERT_TRUE(bool(handleString.size()));
|
||||||
|
AuLogDbg("Exported shared view handle: {}", handleString);
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
auto shared = AuProcess::GetGlobalProcessSpace();
|
||||||
|
SysAssert(shared);
|
||||||
|
|
||||||
|
auto obj = shared->MapIPCMemory(handleString, 0, 4096, AuIOFS::EFileOpenMode::eWrite);
|
||||||
|
ASSERT_TRUE(bool(obj));
|
||||||
|
|
||||||
|
AuLogDbg("Shared Memory String: {}", (char *)obj->GetBasePointer());
|
||||||
|
|
||||||
|
ASSERT_TRUE(memcmp(obj->GetBasePointer(), obj->GetBasePointer(), kHelloWorld.size() - 1) == 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RunTests()
|
||||||
|
{
|
||||||
|
Aurora::RuntimeStartInfo info;
|
||||||
|
info.console.fio.enableLogging = false;
|
||||||
|
info.console.asyncVSLog = false;
|
||||||
|
Aurora::RuntimeStart(info);
|
||||||
|
}
|
@ -101,8 +101,8 @@ static void TestBasicCompression(AuCompression::ECompressionType type)
|
|||||||
AuCompression::CompressionInfo info;
|
AuCompression::CompressionInfo info;
|
||||||
|
|
||||||
info.type = type;
|
info.type = type;
|
||||||
pipe.inPipe = AuUnsafeRaiiToShared(&reader);
|
pipe.pReadPipe = AuUnsafeRaiiToShared(&reader);
|
||||||
pipe.writePipe = AuUnsafeRaiiToShared(&compressed);
|
pipe.pWritePipe = AuUnsafeRaiiToShared(&compressed);
|
||||||
|
|
||||||
info.compressionLevel = 4;
|
info.compressionLevel = 4;
|
||||||
ASSERT_TRUE(AuCompression::Compress(pipe, info));
|
ASSERT_TRUE(AuCompression::Compress(pipe, info));
|
||||||
@ -115,8 +115,8 @@ static void TestBasicCompression(AuCompression::ECompressionType type)
|
|||||||
AuIO::Buffered::BlobReader reader(compressed.GetBuffer());
|
AuIO::Buffered::BlobReader reader(compressed.GetBuffer());
|
||||||
AuCompression::CompressionPipe pipe;
|
AuCompression::CompressionPipe pipe;
|
||||||
|
|
||||||
pipe.inPipe = AuUnsafeRaiiToShared(&reader);
|
pipe.pReadPipe = AuUnsafeRaiiToShared(&reader);
|
||||||
pipe.writePipe = AuUnsafeRaiiToShared(&decompressed);
|
pipe.pWritePipe = AuUnsafeRaiiToShared(&decompressed);
|
||||||
|
|
||||||
ASSERT_TRUE(AuCompression::Decompress(pipe, {type, 1024 * 64 * 2}));
|
ASSERT_TRUE(AuCompression::Decompress(pipe, {type, 1024 * 64 * 2}));
|
||||||
}
|
}
|
||||||
|
29
Tests/Public/A. New Mutex/Main.cpp
Normal file
29
Tests/Public/A. New Mutex/Main.cpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: Main.cpp
|
||||||
|
Date: 2022-2-18
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
#include <AuroraRuntime.hpp>
|
||||||
|
|
||||||
|
static void NewHandle()
|
||||||
|
{
|
||||||
|
static auto mutex = AuIO::IPC::NewMutex();
|
||||||
|
AuLogDbg("Got mutex: {}", mutex->ExportToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
void RunTests()
|
||||||
|
{
|
||||||
|
Aurora::RuntimeStartInfo info;
|
||||||
|
info.console.fio.enableLogging = false;
|
||||||
|
|
||||||
|
Aurora::RuntimeStart(info);
|
||||||
|
|
||||||
|
NewHandle();
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
AuThreading::Sleep(20000);
|
||||||
|
}
|
||||||
|
}
|
145
Tests/Public/A. New PIPE/Main.cpp
Normal file
145
Tests/Public/A. New PIPE/Main.cpp
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: Main.cpp
|
||||||
|
Date: 2022-2-18
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
#include <AuroraRuntime.hpp>
|
||||||
|
|
||||||
|
static AuByteBuffer outBuffer;
|
||||||
|
|
||||||
|
static void doAcceptTick(const AuSPtr<AuIOIPC::IPCPipe> &pipe, const AuSPtr<AuIO::IIOProcessor> &ioDrivenQueue)
|
||||||
|
{
|
||||||
|
ioDrivenQueue->StartSimpleLSWatchEx(pipe->AsReadChannelIsOpen(), AuMakeShared<AuIO::IIOSimpleEventListenerFunctional>([&]
|
||||||
|
{
|
||||||
|
AuLogDbg("TICK");
|
||||||
|
auto transaction = pipe->NewAsyncTransaction();
|
||||||
|
|
||||||
|
// Create an event listener for the callbacks
|
||||||
|
auto listener = AuMakeShared<AuIO::IIOPipeEventListenerFunctional>();
|
||||||
|
SysAssert(bool(listener));
|
||||||
|
|
||||||
|
listener->OnPipeSuccessEventFunctional = [&]()
|
||||||
|
{
|
||||||
|
AuLogInfo("File IO pipe complete");
|
||||||
|
doAcceptTick(pipe, ioDrivenQueue);
|
||||||
|
};
|
||||||
|
|
||||||
|
listener->OnPipeFailureEventFunctional = []()
|
||||||
|
{
|
||||||
|
AuLogInfo("File IO pipe failure");
|
||||||
|
};
|
||||||
|
|
||||||
|
listener->OnPipePartialEventFunctional = [](AuUInt tranferred)
|
||||||
|
{
|
||||||
|
AuLogInfo("on part: {}", tranferred);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Setup the IOPipeRequest
|
||||||
|
AuIO::IOPipeRequestAIO aio;
|
||||||
|
aio.asyncTransaction = transaction;
|
||||||
|
aio.listener = listener;
|
||||||
|
aio.isStream = true;
|
||||||
|
aio.output.type = AuIO::EPipeCallbackType::eTryHandleBufferedPart;
|
||||||
|
|
||||||
|
auto onData = AuMakeShared<AuIO::IIOBufferedStreamAvailableFunctional>();
|
||||||
|
onData->OnDataAvailableFunctional = [&](AuByteBuffer &view)
|
||||||
|
{
|
||||||
|
AuLogDbg("Pipe processing: {}", view.RemainingBytes());
|
||||||
|
outBuffer.Write(view.readPtr, view.RemainingBytes());
|
||||||
|
view.Skip(view.RemainingBytes());
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
aio.output.handleBufferedStream.onData = onData;
|
||||||
|
|
||||||
|
auto filePipe = ioDrivenQueue->ToPipeProcessor()->NewAIOPipe(aio);
|
||||||
|
SysAssert(bool(filePipe));
|
||||||
|
|
||||||
|
SysAssert(filePipe->Start());
|
||||||
|
|
||||||
|
AuLogDbg("TICK");
|
||||||
|
},
|
||||||
|
[&]
|
||||||
|
{
|
||||||
|
AuLogDbg("FAIL");
|
||||||
|
},
|
||||||
|
[&]
|
||||||
|
{
|
||||||
|
AuLogDbg("OK");
|
||||||
|
|
||||||
|
|
||||||
|
}), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void NewHandle()
|
||||||
|
{
|
||||||
|
auto pipe = AuIPC::NewPipe();
|
||||||
|
SysAssert(bool(pipe));
|
||||||
|
|
||||||
|
SysAssert(!pipe->AsReadChannelIsOpen()->IsSignaled());
|
||||||
|
|
||||||
|
auto handleString = pipe->ExportToString();
|
||||||
|
SysAssert(bool(handleString.size()));
|
||||||
|
AuLogDbg("Exported pipe handle: {}", handleString);
|
||||||
|
|
||||||
|
|
||||||
|
static const AuString kHelloWorldClient = "Hello Client";
|
||||||
|
static const AuString kHelloWorldServer = "Hello Server";
|
||||||
|
|
||||||
|
{
|
||||||
|
// Create the io processor
|
||||||
|
|
||||||
|
auto ioDrivenQueue = AuIO::NewIOProcessorNoQueue(false);
|
||||||
|
SysAssert(bool(ioDrivenQueue));
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
// Finally create the damn pipe
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
AuLogInfo("Iteration: {}/5", i + 1);
|
||||||
|
|
||||||
|
doAcceptTick();
|
||||||
|
|
||||||
|
// Main loop
|
||||||
|
while (ioDrivenQueue->HasItems())
|
||||||
|
{
|
||||||
|
// Since we aren't using an external loop queue, we manually pump the processor in here under this spinloop
|
||||||
|
// If we were using a loop queue, we wouldn't need to do anything at all. You could still technically
|
||||||
|
// use ioDrivenQueue->ToQueue()->WaitAny() to trigger the tick.
|
||||||
|
|
||||||
|
ioDrivenQueue->RunTick(); // also: TryTick and ManualTick
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
doAcceptTick(pipe, ioDrivenQueue);
|
||||||
|
|
||||||
|
while (ioDrivenQueue->HasItems())
|
||||||
|
{
|
||||||
|
// Since we aren't using an external loop queue, we manually pump the processor in here under this spinloop
|
||||||
|
// If we were using a loop queue, we wouldn't need to do anything at all. You could still technically
|
||||||
|
// use ioDrivenQueue->ToQueue()->WaitAny() to trigger the tick.
|
||||||
|
|
||||||
|
ioDrivenQueue->RunTick(); // also: TryTick and ManualTick
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RunTests()
|
||||||
|
{
|
||||||
|
Aurora::RuntimeStartInfo info;
|
||||||
|
info.console.fio.enableLogging = false;
|
||||||
|
|
||||||
|
Aurora::RuntimeStart(info);
|
||||||
|
|
||||||
|
NewHandle();
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
AuThreading::Sleep(20000);
|
||||||
|
}
|
||||||
|
}
|
56
Tests/Public/B. Open Mutex/Main.cpp
Normal file
56
Tests/Public/B. Open Mutex/Main.cpp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: Main.cpp
|
||||||
|
Date: 2022-2-18
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
#include <AuroraRuntime.hpp>
|
||||||
|
|
||||||
|
static void TestPath(const AuString &path)
|
||||||
|
{
|
||||||
|
auto mutex = AuIO::IPC::ImportMutex(path);
|
||||||
|
AuLogDbg("Got mutex: {}", fmt::ptr(mutex.get()));
|
||||||
|
mutex->WaitOn(0);
|
||||||
|
AuThreading::Sleep(2000);
|
||||||
|
AuLogDbg("Exiting");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Read()
|
||||||
|
{
|
||||||
|
AuLogInfo("Awaiting input (10s)");
|
||||||
|
|
||||||
|
auto loop = AuLoop::NewLoopQueue();
|
||||||
|
auto source = AuConsole::StdInBufferLoopSource();
|
||||||
|
|
||||||
|
SysAssert(loop->SourceAdd(source));
|
||||||
|
|
||||||
|
SysAssert(loop->Commit());
|
||||||
|
|
||||||
|
if (loop->WaitAll(10 * 1000))
|
||||||
|
{
|
||||||
|
char binary[512];
|
||||||
|
int length = AuConsole::ReadStdIn(binary, AuArraySize(binary));
|
||||||
|
AuString path(binary, binary + length - AuLocale::NewLine().size());
|
||||||
|
|
||||||
|
SysAssert(!source->IsSignaled());
|
||||||
|
SysAssert(!source->WaitOn(100));
|
||||||
|
|
||||||
|
TestPath(path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AuLogInfo("Got nothing");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RunTests()
|
||||||
|
{
|
||||||
|
Aurora::RuntimeStartInfo info;
|
||||||
|
info.console.enableStdPassthrough = true; // for ReadStdIn
|
||||||
|
info.console.enableStdOut = false; // give back stdout to the logger
|
||||||
|
info.console.fio.enableLogging = false;
|
||||||
|
Aurora::RuntimeStart(info);
|
||||||
|
|
||||||
|
Read();
|
||||||
|
}
|
91
Tests/Public/B. Open PIPE/Main.cpp
Normal file
91
Tests/Public/B. Open PIPE/Main.cpp
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: Main.cpp
|
||||||
|
Date: 2022-2-18
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
#include <AuroraRuntime.hpp>
|
||||||
|
|
||||||
|
static void TestPath(const AuString &handleString)
|
||||||
|
{
|
||||||
|
auto pipeImported = AuIPC::ImportPipe(handleString);
|
||||||
|
SysAssert(bool(pipeImported));
|
||||||
|
new decltype(pipeImported)(pipeImported); // Leak :S
|
||||||
|
|
||||||
|
//SysAssert(pipeImported->AsReadChannelIsOpen()->IsSignaled());
|
||||||
|
|
||||||
|
static const AuString kHelloWorldServer = "Hello Server";
|
||||||
|
|
||||||
|
auto transactionB = pipeImported->NewAsyncTransaction();
|
||||||
|
|
||||||
|
// Set callback
|
||||||
|
|
||||||
|
transactionB->SetCallback(AuMakeShared<AuIO::IAsyncFinishedSubscriberFunctional>([](AuUInt64 offset, AuUInt32 length)
|
||||||
|
{
|
||||||
|
AuLogDbg("IPC client callback: {} {}", offset, length);
|
||||||
|
}));
|
||||||
|
|
||||||
|
//
|
||||||
|
AuByteBuffer writeBuffer(512);
|
||||||
|
AuMemoryViewRead writeView(writeBuffer);
|
||||||
|
AuRng::RngFillRange(writeBuffer);
|
||||||
|
|
||||||
|
SysAssert(transactionB->StartWrite(0, AuUnsafeRaiiToShared(&writeView)));
|
||||||
|
|
||||||
|
// Create loop to sync against the two outstanding IO requests
|
||||||
|
auto loop = AuLoop::NewLoopQueue();
|
||||||
|
|
||||||
|
// Add initial loop sources
|
||||||
|
SysAssert(loop->SourceAdd(transactionB->NewLoopSource()));
|
||||||
|
|
||||||
|
SysAssert(loop->Commit());
|
||||||
|
|
||||||
|
// Wait for 100 MS
|
||||||
|
SysAssert(loop->WaitAll(100));
|
||||||
|
|
||||||
|
//SysAssert(writeBuffer == readBuffer);
|
||||||
|
|
||||||
|
// Reset client pipe
|
||||||
|
transactionB.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void Read()
|
||||||
|
{
|
||||||
|
AuLogInfo("Awaiting input (10s)");
|
||||||
|
|
||||||
|
auto loop = AuLoop::NewLoopQueue();
|
||||||
|
auto source = AuConsole::StdInBufferLoopSource();
|
||||||
|
|
||||||
|
SysAssert(loop->SourceAdd(source));
|
||||||
|
|
||||||
|
SysAssert(loop->Commit());
|
||||||
|
|
||||||
|
if (loop->WaitAll(10 * 1000))
|
||||||
|
{
|
||||||
|
char binary[512];
|
||||||
|
int length = AuConsole::ReadStdIn(binary, AuArraySize(binary));
|
||||||
|
AuString path(binary, binary + length - AuLocale::NewLine().size());
|
||||||
|
|
||||||
|
SysAssert(!source->IsSignaled());
|
||||||
|
SysAssert(!source->WaitOn(100));
|
||||||
|
|
||||||
|
TestPath(path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AuLogInfo("Got nothing");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RunTests()
|
||||||
|
{
|
||||||
|
Aurora::RuntimeStartInfo info;
|
||||||
|
info.console.enableStdPassthrough = true; // for ReadStdIn
|
||||||
|
info.console.enableStdOut = false; // give back stdout to the logger
|
||||||
|
info.console.fio.enableLogging = false;
|
||||||
|
Aurora::RuntimeStart(info);
|
||||||
|
|
||||||
|
Read();
|
||||||
|
}
|
@ -1 +1 @@
|
|||||||
Subproject commit 7735334a46da480a749945c0f645155d90d73855
|
Subproject commit 7274ec186442c96e4c7dcc99c684a03e5db2ff48
|
Loading…
Reference in New Issue
Block a user