fix(lite): probe servers without joining the thread on the UI thread

Adding a lite server from the network tab restarted the background
server probe immediately. Starting a probe while one is still running
joins the previous worker thread, and that join happened on the UI
thread, so the frame could stall until the outstanding probe finished.

- Adding a server now sets a dirty flag instead of restarting the probe
  inline; the next frame starts a fresh probe once the current pass has
  finished, so the UI thread never blocks on a join.
- The probe's libcurl transfers honor the cancel flag through a progress
  callback and abort cleanly, so a probe in flight stops promptly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-10-13 22:03:00 -05:00
co-authored by Claude Opus 4.8
parent 8168e26d93
commit 8c5bd485dd
2 changed files with 14 additions and 1 deletions
+3 -1
View File
@@ -37,6 +37,7 @@ namespace {
util::LiteServerProbe s_probe;
bool s_probeStarted = false;
bool s_probeDirty = false;
bool s_showHidden = false;
char s_addUrl[256] = "";
char s_addLabel[128] = "";
@@ -66,6 +67,7 @@ void RenderLiteNetworkTab(App* app)
const float dp = Layout::dpiScale();
if (!s_probeStarted) { startProbe(st); s_probeStarted = true; }
if (s_probeDirty && !s_probe.busy()) { startProbe(st); s_probeDirty = false; }
const auto probe = s_probe.results();
const bool randomMode = st->getLiteServerSelectionMode() == LiteMode::Random;
@@ -221,7 +223,7 @@ void RenderLiteNetworkTab(App* app)
servers.push_back(p);
st->setLiteServers(servers);
st->save();
startProbe(st);
s_probeDirty = true; // re-probe after the current pass ends (don't join the UI thread here)
s_addUrl[0] = '\0'; s_addLabel[0] = '\0'; s_addError.clear();
}
}