1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-30 12:37:49 +00:00

Merge pull request #3801 from niyaznigmatullin/sort_wait_for_signal_handling

sort: wait when SIGINT was raised for the program to finish properly
This commit is contained in:
Sylvestre Ledru 2022-08-10 19:26:50 +02:00 committed by GitHub
commit e304758f61
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 2 deletions

View file

@ -1267,7 +1267,11 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
settings.init_precomputed(); settings.init_precomputed();
exec(&mut files, &settings, output, &mut tmp_dir) let result = exec(&mut files, &settings, output, &mut tmp_dir);
// Wait here if `SIGINT` was received,
// for signal handler to do its work and terminate the program.
tmp_dir.wait_if_signal();
result
} }
pub fn uu_app<'a>() -> Command<'a> { pub fn uu_app<'a>() -> Command<'a> {

View file

@ -45,7 +45,8 @@ impl TmpDirWrapper {
let path = self.temp_dir.as_ref().unwrap().path().to_owned(); let path = self.temp_dir.as_ref().unwrap().path().to_owned();
let lock = self.lock.clone(); let lock = self.lock.clone();
ctrlc::set_handler(move || { ctrlc::set_handler(move || {
// Take the lock so that `next_file_path` returns no new file path. // Take the lock so that `next_file_path` returns no new file path,
// and the program doesn't terminate before the handler has finished
let _lock = lock.lock().unwrap(); let _lock = lock.lock().unwrap();
if let Err(e) = remove_tmp_dir(&path) { if let Err(e) = remove_tmp_dir(&path) {
show_error!("failed to delete temporary directory: {}", e); show_error!("failed to delete temporary directory: {}", e);
@ -69,6 +70,11 @@ impl TmpDirWrapper {
path, path,
)) ))
} }
/// Function just waits if signal handler was called
pub fn wait_if_signal(&self) {
let _lock = self.lock.lock().unwrap();
}
} }
/// Remove the directory at `path` by deleting its child files and then itself. /// Remove the directory at `path` by deleting its child files and then itself.