1use std::sync::atomic::Ordering;
2
3use nu_protocol::engine::EngineState;
4
5pub fn cleanup_exit<T>(tag: T, engine_state: &EngineState, exit_code: i32) -> T {
13 let mut jobs = engine_state.jobs.lock().expect("failed to lock job table");
14
15 if engine_state.is_interactive
16 && jobs.iter().next().is_some()
17 && !engine_state.exit_warning_given.load(Ordering::SeqCst)
18 {
19 let job_count = jobs.iter().count();
20
21 println!("There are still background jobs running ({}).", job_count);
22
23 println!("Running `exit` a second time will kill all of them.");
24
25 engine_state
26 .exit_warning_given
27 .store(true, Ordering::SeqCst);
28
29 return tag;
30 }
31
32 let _ = jobs.kill_all();
33
34 drop(tag);
35
36 std::process::exit(exit_code);
37}