fuzzy: Fixup atomic ordering (#38468)

Nia created

Hopefully partially addresses some crashes that can be triggered in this
code.

Release Notes:

- N/A

Change summary

crates/agent_ui/src/context_picker/file_context_picker.rs  | 2 +-
crates/assistant_slash_commands/src/diagnostics_command.rs | 2 +-
crates/assistant_slash_commands/src/file_command.rs        | 2 +-
crates/file_finder/src/file_finder.rs                      | 6 +++---
crates/fuzzy/src/matcher.rs                                | 2 +-
crates/fuzzy/src/paths.rs                                  | 7 +++----
crates/fuzzy/src/strings.rs                                | 2 +-
7 files changed, 11 insertions(+), 12 deletions(-)

Detailed changes

crates/file_finder/src/file_finder.rs 🔗

@@ -886,14 +886,14 @@ impl FileFinderDelegate {
             .collect::<Vec<_>>();
 
         let search_id = util::post_inc(&mut self.search_count);
-        self.cancel_flag.store(true, atomic::Ordering::Relaxed);
+        self.cancel_flag.store(true, atomic::Ordering::Release);
         self.cancel_flag = Arc::new(AtomicBool::new(false));
         let cancel_flag = self.cancel_flag.clone();
         cx.spawn_in(window, async move |picker, cx| {
             let matches = fuzzy::match_path_sets(
                 candidate_sets.as_slice(),
                 query.path_query(),
-                relative_to,
+                &relative_to,
                 false,
                 100,
                 &cancel_flag,
@@ -902,7 +902,7 @@ impl FileFinderDelegate {
             .await
             .into_iter()
             .map(ProjectPanelOrdMatch);
-            let did_cancel = cancel_flag.load(atomic::Ordering::Relaxed);
+            let did_cancel = cancel_flag.load(atomic::Ordering::Acquire);
             picker
                 .update(cx, |picker, cx| {
                     picker

crates/fuzzy/src/matcher.rs 🔗

@@ -76,7 +76,7 @@ impl<'a> Matcher<'a> {
                 continue;
             }
 
-            if cancel_flag.load(atomic::Ordering::Relaxed) {
+            if cancel_flag.load(atomic::Ordering::Acquire) {
                 break;
             }
 

crates/fuzzy/src/paths.rs 🔗

@@ -121,7 +121,7 @@ pub fn match_fixed_path_set(
 pub async fn match_path_sets<'a, Set: PathMatchCandidateSet<'a>>(
     candidate_sets: &'a [Set],
     query: &str,
-    relative_to: Option<Arc<Path>>,
+    relative_to: &Option<Arc<Path>>,
     smart_case: bool,
     max_results: usize,
     cancel_flag: &AtomicBool,
@@ -148,7 +148,6 @@ pub async fn match_path_sets<'a, Set: PathMatchCandidateSet<'a>>(
     executor
         .scoped(|scope| {
             for (segment_idx, results) in segment_results.iter_mut().enumerate() {
-                let relative_to = relative_to.clone();
                 scope.spawn(async move {
                     let segment_start = segment_idx * segment_size;
                     let segment_end = segment_start + segment_size;
@@ -157,7 +156,7 @@ pub async fn match_path_sets<'a, Set: PathMatchCandidateSet<'a>>(
 
                     let mut tree_start = 0;
                     for candidate_set in candidate_sets {
-                        if cancel_flag.load(atomic::Ordering::Relaxed) {
+                        if cancel_flag.load(atomic::Ordering::Acquire) {
                             break;
                         }
 
@@ -209,7 +208,7 @@ pub async fn match_path_sets<'a, Set: PathMatchCandidateSet<'a>>(
         })
         .await;
 
-    if cancel_flag.load(atomic::Ordering::Relaxed) {
+    if cancel_flag.load(atomic::Ordering::Acquire) {
         return Vec::new();
     }
 

crates/fuzzy/src/strings.rs 🔗

@@ -189,7 +189,7 @@ where
         })
         .await;
 
-    if cancel_flag.load(atomic::Ordering::Relaxed) {
+    if cancel_flag.load(atomic::Ordering::Acquire) {
         return Vec::new();
     }