aboutsummaryrefslogtreecommitdiff
path: root/src/zen/cmds
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2026-02-10 12:27:00 +0100
committerDan Engelbrecht <[email protected]>2026-02-10 12:27:00 +0100
commit49b2c5aea6daadda6b3fc5edc2dff59bae3caad6 (patch)
treeb3c4d42fb2ce1d091bee5c717ab78a3f36e77012 /src/zen/cmds
parentrefactor/cleanup (diff)
downloadarchived-zen-de/download-feedback-api.tar.xz
archived-zen-de/download-feedback-api.zip
handle exception while UI is opende/download-feedback-api
Diffstat (limited to 'src/zen/cmds')
-rw-r--r--src/zen/cmds/view_cmd.cpp65
1 files changed, 54 insertions, 11 deletions
diff --git a/src/zen/cmds/view_cmd.cpp b/src/zen/cmds/view_cmd.cpp
index 8d81a6680..d43a712c9 100644
--- a/src/zen/cmds/view_cmd.cpp
+++ b/src/zen/cmds/view_cmd.cpp
@@ -173,19 +173,23 @@ namespace {
const uint64_t CurrentTimeUs = m_CurrentTimeUs.load();
if (CurrentTimeUs != m_LastRenderTimeUs)
{
- if (CurrentTimeUs < m_LastRenderTimeUs)
+ while (CurrentTimeUs < m_LastRenderTimeUs && m_LastRenderEventIndex > 0)
{
- // Slow! This will playback all state from the start if we go backwards...
- RwLock::ExclusiveLockScope _(m_Lock);
- ResetSequenceState();
- m_LastRenderTimeUs = 0;
- m_LastRenderEventIndex = 0;
+ if (m_Events[m_LastRenderEventIndex - 1].Header.TimestampUs() >= CurrentTimeUs)
+ {
+ RemoveEventFromState(m_Events[m_LastRenderEventIndex]);
+ m_LastRenderEventIndex--;
+ }
+ else
+ {
+ break;
+ }
}
while (m_LastRenderTimeUs < CurrentTimeUs && m_LastRenderEventIndex < m_Events.size())
{
if (m_Events[m_LastRenderEventIndex].Header.TimestampUs() <= CurrentTimeUs)
{
- UpdateStateWithEvent(m_Events[m_LastRenderEventIndex]);
+ AddEventToState(m_Events[m_LastRenderEventIndex]);
m_LastRenderEventIndex++;
}
else
@@ -193,10 +197,38 @@ namespace {
break;
}
}
+ m_LastRenderTimeUs = CurrentTimeUs;
+ }
+ }
+
+ void RemoveEventFromState(const UpdateFolderEventDiskStream::Event& Event)
+ {
+ switch (Event.Header.EventType)
+ {
+ case UpdateFolderEventDiskStream::Event::EventType::WroteSequence:
+ {
+ ChunkSequenceStatus& Sequence = m_RenderSequenceStatues[Event.Payload.WroteSequence.RemoteSequenceIndex];
+ ZEN_ASSERT(!Sequence.Completed);
+ Sequence.RemoveCompletedRange(
+ ChunkSequenceStatus::Range{Event.Payload.WroteSequence.Offset, Event.Payload.WroteSequence.Length});
+ }
+ break;
+ case UpdateFolderEventDiskStream::Event::EventType::CompletedSequence:
+ {
+ ChunkSequenceStatus& Sequence = m_RenderSequenceStatues[Event.Payload.CompletedSequence.RemoteSequenceIndex];
+ ZEN_ASSERT(Sequence.Completed);
+ Sequence.Completed = false;
+ }
+ break;
+ case UpdateFolderEventDiskStream::Event::EventType::WriteComplete:
+ break;
+ default:
+ // TODO
+ break;
}
}
- void UpdateStateWithEvent(const UpdateFolderEventDiskStream::Event& Event)
+ void AddEventToState(const UpdateFolderEventDiskStream::Event& Event)
{
switch (Event.Header.EventType)
{
@@ -314,6 +346,8 @@ ViewCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
throw OptionParseException(fmt::format("Unknown input format for '{}'", m_InputStream), m_Options.help());
}
+ std::atomic<bool> CloseUIFlag = false;
+
Event UiClosed;
std::thread UIThread = OpenImGuiWindow(
@@ -321,14 +355,23 @@ ViewCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
720,
UI->Title(),
[&UI](int display_w, int display_h) { UI->Render(display_w, display_h); },
- [&UiClosed]() { UiClosed.Set(); });
-
- UI->Read(m_InputStream);
+ [&UiClosed]() { UiClosed.Set(); },
+ [&CloseUIFlag]() { return CloseUIFlag.load(); });
auto CloseUI = MakeGuard([&]() {
UiClosed.Wait();
UIThread.join();
});
+
+ try
+ {
+ UI->Read(m_InputStream);
+ }
+ catch (const std::exception&)
+ {
+ CloseUIFlag.store(true);
+ throw;
+ }
}
} // namespace zen