aboutsummaryrefslogtreecommitdiff
path: root/src/app/session.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/session.rs')
-rw-r--r--src/app/session.rs25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/app/session.rs b/src/app/session.rs
index 49dca914..08c4cd44 100644
--- a/src/app/session.rs
+++ b/src/app/session.rs
@@ -70,14 +70,15 @@ impl App {
let job = self.capture_session_save_job();
self.pane_exit_checkpoint_pending = false;
self.session_save_deadline = None;
+ let writer = self.session_writer.clone();
match std::thread::Builder::new()
.name("herdr-session-save".into())
- .spawn(move || run_session_save_job(job))
+ .spawn(move || run_session_save_job(job, &writer))
{
Ok(thread) => self.session_save_thread = Some(thread),
Err(err) => {
tracing::warn!(err = %err, "failed to spawn session save thread; saving inline");
- run_session_save_job(self.capture_session_save_job());
+ run_session_save_job(self.capture_session_save_job(), &self.session_writer);
}
}
}
@@ -92,7 +93,7 @@ impl App {
return;
}
- run_session_save_job(self.capture_session_save_job());
+ run_session_save_job(self.capture_session_save_job(), &self.session_writer);
self.pane_exit_checkpoint_pending = false;
self.session_save_deadline = None;
}
@@ -124,11 +125,19 @@ impl App {
}
}
-fn run_session_save_job(job: SessionSaveJob) {
- match job {
- SessionSaveJob::Clear => crate::persist::clear(),
- SessionSaveJob::Save { snapshot, history } => {
- crate::persist::save(&snapshot, history.as_ref());
+fn run_session_save_job(
+ job: SessionSaveJob,
+ writer: &std::sync::Mutex<crate::persist::SessionWriter>,
+) {
+ let mut writer = match writer.lock() {
+ Ok(writer) => writer,
+ Err(err) => {
+ tracing::warn!(err = %err, "session writer is poisoned; refusing to modify session");
+ return;
}
+ };
+ match job {
+ SessionSaveJob::Clear => writer.clear(),
+ SessionSaveJob::Save { snapshot, history } => writer.save(&snapshot, history.as_ref()),
}
}