diff --git a/czkawka_core/src/bad_extensions.rs b/czkawka_core/src/bad_extensions.rs index e8fc5ec..c19367f 100644 --- a/czkawka_core/src/bad_extensions.rs +++ b/czkawka_core/src/bad_extensions.rs @@ -315,17 +315,7 @@ impl BadExtensions { fn look_for_bad_extensions_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender>) -> bool { let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common( - progress_sender, - &progress_thread_run, - &atomic_counter, - 1, - 1, - self.files_to_check.len(), - CheckingMethod::None, - ); + let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 1, 1, self.files_to_check.len(), CheckingMethod::None); let files_to_check = mem::take(&mut self.files_to_check); diff --git a/czkawka_core/src/big_file.rs b/czkawka_core/src/big_file.rs index 61be7db..d4547da 100644 --- a/czkawka_core/src/big_file.rs +++ b/czkawka_core/src/big_file.rs @@ -3,7 +3,7 @@ use std::fs; use std::fs::{DirEntry, File, Metadata}; use std::io::{BufWriter, Write}; use std::path::{Path, PathBuf}; -use std::sync::atomic::AtomicBool; + use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; @@ -148,9 +148,7 @@ impl BigFile { folders_to_check.push(id.clone()); } - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 0, 0, 0, CheckingMethod::None); + let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 0, 0, 0, CheckingMethod::None); while !folders_to_check.is_empty() { if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { diff --git a/czkawka_core/src/broken_files.rs b/czkawka_core/src/broken_files.rs index b03e692..36e97d1 100644 --- a/czkawka_core/src/broken_files.rs +++ b/czkawka_core/src/broken_files.rs @@ -3,7 +3,7 @@ use std::fs::{DirEntry, File, Metadata}; use std::io::prelude::*; use std::io::{BufReader, BufWriter}; use std::path::{Path, PathBuf}; -use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; +use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; use std::{fs, mem, panic}; @@ -200,9 +200,7 @@ impl BrokenFiles { folders_to_check.push(id.clone()); } - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 0, 1, 0, CheckingMethod::None); + let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 0, 1, 0, CheckingMethod::None); while !folders_to_check.is_empty() { if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { @@ -437,17 +435,8 @@ impl BrokenFiles { non_cached_files_to_check = files_to_check; } - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common( - progress_sender, - &progress_thread_run, - &atomic_counter, - 1, - 1, - non_cached_files_to_check.len(), - CheckingMethod::None, - ); + let (progress_thread_handle, progress_thread_run, atomic_counter) = + prepare_thread_handler_common(progress_sender, 1, 1, non_cached_files_to_check.len(), CheckingMethod::None); let mut vec_file_entry: Vec = non_cached_files_to_check .into_par_iter() diff --git a/czkawka_core/src/common.rs b/czkawka_core/src/common.rs index 3dc0c83..14a7654 100644 --- a/czkawka_core/src/common.rs +++ b/czkawka_core/src/common.rs @@ -385,16 +385,17 @@ where .collect::)>>() } +#[must_use] pub fn prepare_thread_handler_common( progress_sender: Option<&UnboundedSender>, - progress_thread_run: &Arc, - atomic_counter: &Arc, current_stage: u8, max_stage: u8, max_value: usize, checking_method: CheckingMethod, -) -> JoinHandle<()> { - if let Some(progress_sender) = progress_sender { +) -> (JoinHandle<()>, Arc, Arc) { + let progress_thread_run = Arc::new(AtomicBool::new(true)); + let atomic_counter = Arc::new(AtomicUsize::new(0)); + let progress_thread_sender = if let Some(progress_sender) = progress_sender { let progress_send = progress_sender.clone(); let progress_thread_run = progress_thread_run.clone(); let atomic_counter = atomic_counter.clone(); @@ -415,7 +416,8 @@ pub fn prepare_thread_handler_common( }) } else { thread::spawn(|| {}) - } + }; + (progress_thread_sender, progress_thread_run, atomic_counter) } pub fn send_info_and_wait_for_ending_all_threads(progress_thread_run: &Arc, progress_thread_handle: JoinHandle<()>) { diff --git a/czkawka_core/src/common_dir_traversal.rs b/czkawka_core/src/common_dir_traversal.rs index 0ae9342..b291a5e 100644 --- a/czkawka_core/src/common_dir_traversal.rs +++ b/czkawka_core/src/common_dir_traversal.rs @@ -2,8 +2,8 @@ use std::collections::BTreeMap; use std::fs; use std::fs::{DirEntry, Metadata, ReadDir}; use std::path::{Path, PathBuf}; -use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; -use std::sync::Arc; +use std::sync::atomic::Ordering; + use std::time::UNIX_EPOCH; use crossbeam_channel::Receiver; @@ -338,9 +338,7 @@ where // Add root folders for finding folders_to_check.extend(self.root_dirs); - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common(self.progress_sender, &progress_thread_run, &atomic_counter, 0, self.max_stage, 0, self.checking_method); + let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(self.progress_sender, 0, self.max_stage, 0, self.checking_method); let DirTraversal { collect, diff --git a/czkawka_core/src/duplicate.rs b/czkawka_core/src/duplicate.rs index 742702e..a059968 100644 --- a/czkawka_core/src/duplicate.rs +++ b/czkawka_core/src/duplicate.rs @@ -9,8 +9,7 @@ use std::io::{BufReader, BufWriter}; #[cfg(target_family = "unix")] use std::os::unix::fs::MetadataExt; use std::path::{Path, PathBuf}; -use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; -use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; use std::{fs, mem}; @@ -678,17 +677,8 @@ impl DuplicateFinder { let check_type = self.hash_type; let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common( - progress_sender, - &progress_thread_run, - &atomic_counter, - 1, - 2, - self.files_with_identical_size.values().map(Vec::len).sum(), - self.check_method, - ); + let (progress_thread_handle, progress_thread_run, atomic_counter) = + prepare_thread_handler_common(progress_sender, 1, 2, self.files_with_identical_size.values().map(Vec::len).sum(), self.check_method); let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.prehash_load_cache_at_start(); @@ -844,18 +834,8 @@ impl DuplicateFinder { let check_type = self.hash_type; - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - - let progress_thread_handle = prepare_thread_handler_common( - progress_sender, - &progress_thread_run, - &atomic_counter, - 2, - 2, - pre_checked_map.values().map(Vec::len).sum(), - self.check_method, - ); + let (progress_thread_handle, progress_thread_run, atomic_counter) = + prepare_thread_handler_common(progress_sender, 2, 2, pre_checked_map.values().map(Vec::len).sum(), self.check_method); ///////////////////////////////////////////////////////////////////////////// HASHING START { diff --git a/czkawka_core/src/same_music.rs b/czkawka_core/src/same_music.rs index 5b13bb0..b71dd4b 100644 --- a/czkawka_core/src/same_music.rs +++ b/czkawka_core/src/same_music.rs @@ -394,17 +394,7 @@ impl SameMusic { let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common( - progress_sender, - &progress_thread_run, - &atomic_counter, - 1, - 2, - non_cached_files_to_check.len(), - self.check_type, - ); + let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 1, 2, non_cached_files_to_check.len(), self.check_type); let configuration = &self.hash_preset_config; // Clean for duplicate files @@ -451,17 +441,7 @@ impl SameMusic { let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common( - progress_sender, - &progress_thread_run, - &atomic_counter, - 1, - 2, - non_cached_files_to_check.len(), - self.check_type, - ); + let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 1, 2, non_cached_files_to_check.len(), self.check_type); // Clean for duplicate files let mut vec_file_entry = non_cached_files_to_check @@ -591,9 +571,7 @@ impl SameMusic { fn check_for_duplicate_tags(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender>) -> bool { assert_ne!(MusicSimilarity::NONE, self.music_similarity, "This can't be none"); - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 2, 2, self.music_to_check.len(), self.check_type); + let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 2, 2, self.music_to_check.len(), self.check_type); let mut old_duplicates: Vec> = vec![self.music_entries.clone()]; let mut new_duplicates: Vec> = Vec::new(); @@ -711,7 +689,7 @@ impl SameMusic { stop_receiver: Option<&Receiver<()>>, atomic_counter: &Arc, base_files: Vec, - files_to_compare: Vec, + files_to_compare: &[MusicEntry], ) -> Option>> { let mut used_paths: HashSet = Default::default(); @@ -767,13 +745,10 @@ impl SameMusic { fn check_for_duplicate_fingerprints(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender>) -> bool { assert_ne!(MusicSimilarity::NONE, self.music_similarity, "This can't be none"); - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let (base_files, files_to_compare) = self.split_fingerprints_to_check(); - let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 2, 2, base_files.len(), self.check_type); + let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 2, 2, base_files.len(), self.check_type); - let Some(duplicated_music_entries) = self.compare_fingerprints(stop_receiver, &atomic_counter, base_files, files_to_compare) else { + let Some(duplicated_music_entries) = self.compare_fingerprints(stop_receiver, &atomic_counter, base_files, &files_to_compare) else { send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle); return false; }; diff --git a/czkawka_core/src/similar_images.rs b/czkawka_core/src/similar_images.rs index 31d0e80..fd4bd40 100644 --- a/czkawka_core/src/similar_images.rs +++ b/czkawka_core/src/similar_images.rs @@ -300,9 +300,7 @@ impl SimilarImages { folders_to_check.push(id.clone()); } - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 0, 2, 0, CheckingMethod::None); + let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 0, 2, 0, CheckingMethod::None); while !folders_to_check.is_empty() { if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { @@ -437,17 +435,8 @@ impl SimilarImages { let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.hash_images_load_cache(); let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common( - progress_sender, - &progress_thread_run, - &atomic_counter, - 1, - 2, - non_cached_files_to_check.len(), - CheckingMethod::None, - ); + let (progress_thread_handle, progress_thread_run, atomic_counter) = + prepare_thread_handler_common(progress_sender, 1, 2, non_cached_files_to_check.len(), CheckingMethod::None); let mut vec_file_entry: Vec<(FileEntry, ImHash)> = non_cached_files_to_check .into_par_iter() @@ -828,9 +817,9 @@ impl SimilarImages { } } else { let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 2, 2, all_hashes.len(), CheckingMethod::None); + let _progress_thread_run = Arc::new(AtomicBool::new(true)); + let _atomic_counter = Arc::new(AtomicUsize::new(0)); + let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 2, 2, all_hashes.len(), CheckingMethod::None); // Don't use hashes with multiple images in bktree, because they will always be master of group and cannot be find by other hashes diff --git a/czkawka_core/src/similar_videos.rs b/czkawka_core/src/similar_videos.rs index 213847c..598d582 100644 --- a/czkawka_core/src/similar_videos.rs +++ b/czkawka_core/src/similar_videos.rs @@ -262,9 +262,7 @@ impl SimilarVideos { folders_to_check.push(id.clone()); } - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 0, 1, 0, CheckingMethod::None); + let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 0, 1, 0, CheckingMethod::None); while !folders_to_check.is_empty() { if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { @@ -393,18 +391,11 @@ impl SimilarVideos { let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.load_cache_at_start(); let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread - let progress_thread_run = Arc::new(AtomicBool::new(true)); + let _progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common( - progress_sender, - &progress_thread_run, - &atomic_counter, - 1, - 1, - non_cached_files_to_check.len(), - CheckingMethod::None, - ); + let _atomic_counter = Arc::new(AtomicUsize::new(0)); + let (progress_thread_handle, progress_thread_run, atomic_counter) = + prepare_thread_handler_common(progress_sender, 1, 1, non_cached_files_to_check.len(), CheckingMethod::None); let mut vec_file_entry: Vec = non_cached_files_to_check .par_iter() diff --git a/czkawka_core/src/temporary.rs b/czkawka_core/src/temporary.rs index cf5846e..d09c550 100644 --- a/czkawka_core/src/temporary.rs +++ b/czkawka_core/src/temporary.rs @@ -3,7 +3,7 @@ use std::fs::{DirEntry, File, Metadata}; use std::io::prelude::*; use std::io::BufWriter; use std::path::{Path, PathBuf}; -use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; +use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; use crossbeam_channel::Receiver; @@ -149,9 +149,7 @@ impl Temporary { folders_to_check.push(id.clone()); } - let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); - let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 0, 0, 0, CheckingMethod::None); + let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 0, 0, 0, CheckingMethod::None); while !folders_to_check.is_empty() { if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {