Cancel generation when its handle is dropped
This commit is contained in:
@@ -3,7 +3,7 @@ use crate::metrics::{Metrics, WorkSource};
|
|||||||
use crate::settings::{EngineSettings, TurnSettings};
|
use crate::settings::{EngineSettings, TurnSettings};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::sync::atomic::AtomicBool;
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::mpsc::{self, Receiver, Sender};
|
use std::sync::mpsc::{self, Receiver, Sender};
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
@@ -19,6 +19,12 @@ pub(crate) struct ActiveGeneration {
|
|||||||
pub(crate) cancel: Arc<AtomicBool>,
|
pub(crate) cancel: Arc<AtomicBool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Drop for ActiveGeneration {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
self.cancel.store(true, Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) enum CheckpointTarget {
|
pub(crate) enum CheckpointTarget {
|
||||||
Local(PathBuf),
|
Local(PathBuf),
|
||||||
Transient(PathBuf),
|
Transient(PathBuf),
|
||||||
@@ -218,3 +224,21 @@ fn run(commands: Receiver<Command>, metrics: Arc<Metrics>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn dropping_active_generation_cancels_it() {
|
||||||
|
let cancel = Arc::new(AtomicBool::new(false));
|
||||||
|
let (_, events) = mpsc::channel();
|
||||||
|
|
||||||
|
drop(ActiveGeneration {
|
||||||
|
events,
|
||||||
|
cancel: Arc::clone(&cancel),
|
||||||
|
});
|
||||||
|
|
||||||
|
assert!(cancel.load(Ordering::Relaxed));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user