From 15bdae16b2db1db62aaebefa917690e96de82651 Mon Sep 17 00:00:00 2001 From: Oli Date: Tue, 22 Mar 2022 11:52:15 +0000 Subject: [PATCH] DirectoryContentsList: Fix a data race Fix improper use of non-atomic pointer validity to report state of background search thread state --- .../filebrowser/juce_DirectoryContentsList.cpp | 11 ++++++----- .../filebrowser/juce_DirectoryContentsList.h | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp index 6976073e85..07aef35519 100644 --- a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp @@ -66,10 +66,10 @@ void DirectoryContentsList::setDirectory (const File& directory, auto newFlags = fileTypeFlags; - if (includeDirectories) newFlags |= File::findDirectories; + if (includeDirectories) newFlags |= File::findDirectories; else newFlags &= ~File::findDirectories; - if (includeFiles) newFlags |= File::findFiles; + if (includeFiles) newFlags |= File::findFiles; else newFlags &= ~File::findFiles; setTypeFlags (newFlags); @@ -88,7 +88,7 @@ void DirectoryContentsList::stopSearching() { shouldStop = true; thread.removeTimeSliceClient (this); - fileFindHandle = nullptr; + isSearching = false; } void DirectoryContentsList::clear() @@ -110,8 +110,9 @@ void DirectoryContentsList::refresh() if (root.isDirectory()) { - fileFindHandle = std::make_unique (root, false, "*", fileTypeFlags); + fileFindHandle = std::make_unique(root, false, "*", fileTypeFlags); shouldStop = false; + isSearching = true; thread.addTimeSliceClient (this); } } @@ -165,7 +166,7 @@ bool DirectoryContentsList::contains (const File& targetFile) const bool DirectoryContentsList::isStillLoading() const { - return fileFindHandle != nullptr; + return isSearching; } void DirectoryContentsList::changed() diff --git a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h index 691155aead..a046554584 100644 --- a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h +++ b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h @@ -209,6 +209,7 @@ private: std::unique_ptr fileFindHandle; std::atomic shouldStop { true }; + bool isSearching = false; bool wasEmpty = true;