fix: guard StremioServer::start() with a running flag

start() unconditionally spawned a fresh stremio-runtime every time it
was called. Today only the GUI thread calls it, but the crash-restart
path can re-fire start() while the previous teardown is still in
progress, racing two runtimes for port 11470.

Track a `running: Arc<AtomicBool>` on the struct: swap(true) on entry
and bail with a log if the previous server thread has not yet flipped
it back to false. Reset to false right before sender.notice() so that
the GUI's crash handler can legitimately spawn the next instance.

Closes #57
This commit is contained in:
Claude 2026-05-10 12:37:44 +00:00
parent 51d75cfe6e
commit 46d152dfc5
No known key found for this signature in database

View file

@ -8,7 +8,10 @@ use std::{
os::windows::process::CommandExt,
path,
process::{Command, Stdio},
sync::{Arc, Mutex, Once},
sync::{
atomic::{AtomicBool, Ordering},
Arc, Mutex, Once,
},
thread,
};
use winapi::um::{
@ -71,6 +74,7 @@ pub struct StremioServer {
parent: nwg::ControlHandle,
crash_notice: nwg::Notice,
logs: Arc<Mutex<String>>,
running: Arc<AtomicBool>,
}
impl StremioServer {
@ -78,9 +82,14 @@ impl StremioServer {
if self.development {
return;
}
if self.running.swap(true, Ordering::SeqCst) {
eprintln!("StremioServer::start() called while a server is already running; skipping");
return;
}
let (tx, rx) = flume::unbounded();
let logs = self.logs.clone();
let sender = self.crash_notice.sender();
let running = self.running.clone();
ensure_parent_job_object();
@ -205,6 +214,8 @@ impl StremioServer {
let mut logs = logs.lock().unwrap();
*logs = lines.lock().unwrap().deref().to_string();
}
// Clear before sender.notice() so the next start() can pass the swap guard.
running.store(false, Ordering::SeqCst);
println!("Server terminated.");
sender.notice();
});