[+] ConsoleTTY.hpp write cmd history every 10 seconds under sys tick
This commit is contained in:
parent
97938fcaeb
commit
a59fc20d56
@ -11,8 +11,25 @@ namespace Aurora::Utility
|
||||
{
|
||||
struct RateLimiter
|
||||
{
|
||||
AuUInt64 nextTriggerTime;
|
||||
AuUInt64 nsTimeStep;
|
||||
AuUInt64 nextTriggerTime {};
|
||||
AuUInt64 nsTimeStep {};
|
||||
bool noCatchUp {};
|
||||
|
||||
inline RateLimiter()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
inline RateLimiter(AuUInt64 nsTimeStep)
|
||||
{
|
||||
SetNextStep(nsTimeStep);
|
||||
}
|
||||
|
||||
inline auline void SetTargetTime(AuUInt64 timeAbsNs)
|
||||
{
|
||||
this->nsTimeStep = 0;
|
||||
this->nextTriggerTime = timeAbsNs;
|
||||
}
|
||||
|
||||
inline auline void SetNextStep(AuUInt64 nsTimeStep)
|
||||
{
|
||||
@ -70,8 +87,15 @@ namespace Aurora::Utility
|
||||
private:
|
||||
|
||||
inline auline AuUInt64 GetLatch()
|
||||
{
|
||||
if (this->noCatchUp)
|
||||
{
|
||||
return this->nsTimeStep + Aurora::Time::CurrentInternalClockNS();
|
||||
}
|
||||
else
|
||||
{
|
||||
return this->nextTriggerTime + this->nsTimeStep;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
@ -30,11 +30,14 @@ namespace Aurora::Console::ConsoleTTY
|
||||
|
||||
void TTYConsole::Init()
|
||||
{
|
||||
this->historyLock = AuThreadPrimitives::RWLockUnique();
|
||||
this->HistorySetFile();
|
||||
this->HistoryLoad();
|
||||
}
|
||||
|
||||
void TTYConsole::Deinit()
|
||||
{
|
||||
|
||||
this->HistoryAppendChanges();
|
||||
}
|
||||
|
||||
bool TTYConsole::Start()
|
||||
@ -316,6 +319,8 @@ namespace Aurora::Console::ConsoleTTY
|
||||
|
||||
void TTYConsole::NoncanonicalOnEnter()
|
||||
{
|
||||
AU_LOCK_GUARD(this->historyLock->AsWritable());
|
||||
|
||||
if (this->inputField.size())
|
||||
{
|
||||
|
||||
@ -435,6 +440,8 @@ namespace Aurora::Console::ConsoleTTY
|
||||
|
||||
void TTYConsole::NoncanonicalOnHistoryDown()
|
||||
{
|
||||
AU_LOCK_GUARD(this->historyLock->AsReadable());
|
||||
|
||||
bool locked {};
|
||||
|
||||
if (this->history.empty())
|
||||
@ -483,6 +490,84 @@ namespace Aurora::Console::ConsoleTTY
|
||||
NoncanonicalSetCursor();
|
||||
}
|
||||
|
||||
void TTYConsole::HistorySetFile()
|
||||
{
|
||||
AuString path;
|
||||
AuProcess::GetProcFullPath(path);
|
||||
auto hash = AuFnv1a64Runtime(path.data(), path.size());
|
||||
AuIOFS::NormalizePath(this->historyFileName, fmt::format("~/TTYHistory/{}.txt", hash));
|
||||
}
|
||||
|
||||
AuString TTYConsole::HistoryGetFile()
|
||||
{
|
||||
return this->historyFileName;
|
||||
}
|
||||
|
||||
void TTYConsole::HistoryAppendChanges()
|
||||
{
|
||||
if (!this->historyLock)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AU_LOCK_GUARD(this->historyLock->AsWritable());
|
||||
|
||||
if (this->history.size() <= this->iHistoryWritePos)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
auto file = AuIOFS::OpenUnique(this->historyFileName, AuIOFS::EFileOpenMode::eReadWrite);
|
||||
if (!file)
|
||||
{
|
||||
SysPushErrorIO(this->historyFileName);
|
||||
return;
|
||||
}
|
||||
|
||||
file->SetOffset(file->GetLength());
|
||||
|
||||
AuString buffer;
|
||||
auto line = AuLocale::NewLine();
|
||||
line.reserve(4096);
|
||||
|
||||
for (int i = this->iHistoryWritePos; i < this->history.size(); i++)
|
||||
{
|
||||
buffer += (i == 0 ? "" : line);
|
||||
buffer += this->history[i];
|
||||
}
|
||||
|
||||
AuUInt bytesWritten;
|
||||
file->Write(AuMemoryViewStreamRead(AuMemory::MemoryViewRead(buffer), bytesWritten));
|
||||
|
||||
this->iHistoryWritePos = this->history.size();
|
||||
}
|
||||
|
||||
void TTYConsole::HistoryLoad()
|
||||
{
|
||||
AU_LOCK_GUARD(this->historyLock->AsWritable());
|
||||
|
||||
if (this->historyFileName.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!AuIOFS::FileExists(this->historyFileName))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AuString buffer;
|
||||
if (!AuIOFS::ReadString(this->historyFileName, buffer))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AuParse::SplitNewlines(buffer, [&](const AuString &in)
|
||||
{
|
||||
this->history.push_back(in);
|
||||
});
|
||||
}
|
||||
|
||||
void TTYConsole::NoncanonicalOnPageUp()
|
||||
{
|
||||
this->Scroll(this->GetLogBoxLines());
|
||||
@ -523,6 +608,24 @@ namespace Aurora::Console::ConsoleTTY
|
||||
this->bTriggerRedraw = true;
|
||||
}
|
||||
|
||||
void TTYConsole::PumpHistory()
|
||||
{
|
||||
static Aurora::Utility::RateLimiter limiter;
|
||||
|
||||
if (!limiter.nextTriggerTime)
|
||||
{
|
||||
limiter.noCatchUp = true;
|
||||
limiter.SetNextStep(AuMSToNS<AuUInt64>(10'000));
|
||||
}
|
||||
|
||||
if (!limiter.CheckExchangePass())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
HistoryAppendChanges();
|
||||
}
|
||||
|
||||
void TTYConsole::Pump()
|
||||
{
|
||||
if (!gTTYConsoleEnabled)
|
||||
@ -536,6 +639,8 @@ namespace Aurora::Console::ConsoleTTY
|
||||
}
|
||||
|
||||
Flush();
|
||||
|
||||
PumpHistory();
|
||||
}
|
||||
|
||||
void TTYConsole::OnEnter()
|
||||
@ -763,6 +868,8 @@ namespace Aurora::Console::ConsoleTTY
|
||||
continue;
|
||||
}
|
||||
|
||||
bool redrawEntireBox {};
|
||||
|
||||
if (bChangedSize || bRedrawWindowRequired || bHasMesasgesPending)
|
||||
{
|
||||
bRedrawn = true;
|
||||
@ -781,11 +888,11 @@ namespace Aurora::Console::ConsoleTTY
|
||||
TTYStorePos();
|
||||
}
|
||||
|
||||
|
||||
if (bChangedSize || this->bTriggerRedraw)
|
||||
{
|
||||
TTYClearScreen();
|
||||
// bRefresh = true;
|
||||
bRefresh = true;
|
||||
redrawEntireBox = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -797,11 +904,18 @@ namespace Aurora::Console::ConsoleTTY
|
||||
if (RegenerateBuffer(bChangedSize, redrawBox) || this->bTriggerRedraw)
|
||||
{
|
||||
bRefresh = true;
|
||||
redrawEntireBox = true;
|
||||
RedrawLogBox();
|
||||
}
|
||||
|
||||
bRefresh |= redrawBox;
|
||||
}
|
||||
|
||||
if (redrawEntireBox)
|
||||
{
|
||||
RedrawLogBox();
|
||||
}
|
||||
|
||||
if (bRefresh)
|
||||
{
|
||||
RedrawBanner();
|
||||
|
@ -15,6 +15,7 @@ namespace Aurora::Console::ConsoleTTY
|
||||
{
|
||||
void BufferMessage(const AuConsole::ConsoleMessage &msg);
|
||||
void Pump();
|
||||
void PumpHistory();
|
||||
|
||||
bool RedrawWindow();
|
||||
void OnEnter();
|
||||
@ -67,8 +68,14 @@ namespace Aurora::Console::ConsoleTTY
|
||||
void NoncanonicalOnHistoryUp();
|
||||
void NoncanonicalOnHistoryDown();
|
||||
|
||||
void HistorySetFile();
|
||||
AuString HistoryGetFile();
|
||||
void HistoryAppendChanges();
|
||||
void HistoryLoad();
|
||||
void HistoryUpdateCursor();
|
||||
|
||||
AuString historyFileName;
|
||||
|
||||
int noncanonicalCursorPos {};
|
||||
int noncanonicalCursorPosInBytes {};
|
||||
|
||||
@ -163,8 +170,12 @@ namespace Aurora::Console::ConsoleTTY
|
||||
|
||||
|
||||
int iHistoryPos {-1};
|
||||
int iHistoryWritePos {0};
|
||||
AuList<AuString> history;
|
||||
|
||||
AuThreadPrimitives::RWLockUnique_t historyLock;
|
||||
|
||||
|
||||
AuThreadPrimitives::SpinLock messageLock;
|
||||
AuList<AuConsole::ConsoleMessage> messagesPending;
|
||||
|
||||
|
@ -92,7 +92,7 @@ namespace Aurora::IPC
|
||||
return {};
|
||||
}
|
||||
|
||||
auto map = MapViewOfFile(file,
|
||||
auto map = ::MapViewOfFile(file,
|
||||
FILE_MAP_ALL_ACCESS,
|
||||
0,
|
||||
0,
|
||||
@ -128,7 +128,7 @@ namespace Aurora::IPC
|
||||
|
||||
auto length = handle.word;
|
||||
auto path = handle.ToNTPath();
|
||||
auto file = OpenFileMappingA(FILE_MAP_ALL_ACCESS,
|
||||
auto file = ::OpenFileMappingA(FILE_MAP_ALL_ACCESS,
|
||||
FALSE,
|
||||
path.c_str());
|
||||
|
||||
@ -138,7 +138,7 @@ namespace Aurora::IPC
|
||||
return {};
|
||||
}
|
||||
|
||||
auto map = MapViewOfFile(file,
|
||||
auto map = ::MapViewOfFile(file,
|
||||
FILE_MAP_ALL_ACCESS,
|
||||
0,
|
||||
0,
|
||||
|
Loading…
Reference in New Issue
Block a user