Browse Source

FileChooser: Avoid throwing bad_weak_ptr

It seems like shared_from_this may not be enabled when a unique_ptr is
assigned to a shared_ptr (although it *should* be enabled when
constructing a new shared_ptr from a unique_ptr). Functions that return
objects that may need to use shared_from_this now return shared_ptr,
just to be safe.

Additionally, in some cases, shared_from_this was being called from
Thread::run after the last reference to the shared object had been
released. We now call shared_from_this during 'open', which will always
run on the message thread while at least once reference to the shared
object is alive.
tags/2021-05-28
reuk 4 years ago
parent
commit
fd2f866dd1
7 changed files with 19 additions and 16 deletions
  1. +1
    -1
      modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp
  2. +2
    -2
      modules/juce_gui_basics/filebrowser/juce_FileChooser.h
  3. +2
    -2
      modules/juce_gui_basics/native/juce_android_FileChooser.cpp
  4. +2
    -2
      modules/juce_gui_basics/native/juce_ios_FileChooser.mm
  5. +2
    -2
      modules/juce_gui_basics/native/juce_linux_FileChooser.cpp
  6. +2
    -2
      modules/juce_gui_basics/native/juce_mac_FileChooser.mm
  7. +8
    -5
      modules/juce_gui_basics/native/juce_win32_FileChooser.cpp

+ 1
- 1
modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp View File

@@ -184,7 +184,7 @@ void FileChooser::launchAsync (int flags, std::function<void (const FileChooser&
}
std::unique_ptr<FileChooser::Pimpl> FileChooser::createPimpl (int flags, FilePreviewComponent* previewComp)
std::shared_ptr<FileChooser::Pimpl> FileChooser::createPimpl (int flags, FilePreviewComponent* previewComp)
{
results.clear();


+ 2
- 2
modules/juce_gui_basics/filebrowser/juce_FileChooser.h View File

@@ -328,8 +328,8 @@ private:
std::shared_ptr<Pimpl> pimpl;
//==============================================================================
std::unique_ptr<Pimpl> createPimpl (int, FilePreviewComponent*);
static std::unique_ptr<Pimpl> showPlatformDialog (FileChooser&, int, FilePreviewComponent*);
std::shared_ptr<Pimpl> createPimpl (int, FilePreviewComponent*);
static std::shared_ptr<Pimpl> showPlatformDialog (FileChooser&, int, FilePreviewComponent*);
class NonNative;
friend class NonNative;


+ 2
- 2
modules/juce_gui_basics/native/juce_android_FileChooser.cpp View File

@@ -219,11 +219,11 @@ private:
FileChooser::Native* FileChooser::Native::currentFileChooser = nullptr;
std::unique_ptr<FileChooser::Pimpl> FileChooser::showPlatformDialog (FileChooser& owner, int flags,
std::shared_ptr<FileChooser::Pimpl> FileChooser::showPlatformDialog (FileChooser& owner, int flags,
FilePreviewComponent*)
{
if (FileChooser::Native::currentFileChooser == nullptr)
return std::make_unique<FileChooser::Native> (owner, flags);
return std::make_shared<FileChooser::Native> (owner, flags);
// there can only be one file chooser on Android at a once
jassertfalse;


+ 2
- 2
modules/juce_gui_basics/native/juce_ios_FileChooser.mm View File

@@ -379,10 +379,10 @@ bool FileChooser::isPlatformDialogAvailable()
#endif
}
std::unique_ptr<FileChooser::Pimpl> FileChooser::showPlatformDialog (FileChooser& owner, int flags,
std::shared_ptr<FileChooser::Pimpl> FileChooser::showPlatformDialog (FileChooser& owner, int flags,
FilePreviewComponent*)
{
return std::make_unique<FileChooser::Native> (owner, flags);
return std::make_shared<FileChooser::Native> (owner, flags);
}
#if JUCE_DEPRECATION_IGNORED


+ 2
- 2
modules/juce_gui_basics/native/juce_linux_FileChooser.cpp View File

@@ -256,9 +256,9 @@ bool FileChooser::isPlatformDialogAvailable()
#endif
}
std::unique_ptr<FileChooser::Pimpl> FileChooser::showPlatformDialog (FileChooser& owner, int flags, FilePreviewComponent*)
std::shared_ptr<FileChooser::Pimpl> FileChooser::showPlatformDialog (FileChooser& owner, int flags, FilePreviewComponent*)
{
return std::make_unique<Native> (owner, flags);
return std::make_shared<Native> (owner, flags);
}
} // namespace juce

+ 2
- 2
modules/juce_gui_basics/native/juce_mac_FileChooser.mm View File

@@ -377,10 +377,10 @@ private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Native)
};
std::unique_ptr<FileChooser::Pimpl> FileChooser::showPlatformDialog (FileChooser& owner, int flags,
std::shared_ptr<FileChooser::Pimpl> FileChooser::showPlatformDialog (FileChooser& owner, int flags,
FilePreviewComponent* preview)
{
return std::make_unique<FileChooser::Native> (owner, flags, preview);
return std::make_shared<FileChooser::Native> (owner, flags, preview);
}
bool FileChooser::isPlatformDialogAvailable()


+ 8
- 5
modules/juce_gui_basics/native/juce_win32_FileChooser.cpp View File

@@ -82,6 +82,8 @@ public:
// the thread should not be running
nativeDialogRef.set (nullptr);
weakThis = shared_from_this();
if (async)
{
jassert (! isThreadRunning());
@@ -140,6 +142,7 @@ private:
//==============================================================================
const Component::SafePointer<Component> owner;
std::weak_ptr<Win32NativeFileChooser> weakThis;
String title, filtersString;
std::unique_ptr<CustomComponentHolder> customComponent;
String initialPath, returnedString;
@@ -481,11 +484,11 @@ private:
auto resultsCopy = openDialog (true);
auto safeOwner = owner;
std::weak_ptr<Win32NativeFileChooser> weakThis = shared_from_this();
auto weakThisCopy = weakThis;
MessageManager::callAsync ([resultsCopy, safeOwner, weakThis]
MessageManager::callAsync ([resultsCopy, safeOwner, weakThisCopy]
{
if (auto locked = weakThis.lock())
if (auto locked = weakThisCopy.lock())
locked->results = resultsCopy;
if (safeOwner != nullptr)
@@ -812,10 +815,10 @@ bool FileChooser::isPlatformDialogAvailable()
#endif
}
std::unique_ptr<FileChooser::Pimpl> FileChooser::showPlatformDialog (FileChooser& owner, int flags,
std::shared_ptr<FileChooser::Pimpl> FileChooser::showPlatformDialog (FileChooser& owner, int flags,
FilePreviewComponent* preview)
{
return std::make_unique<FileChooser::Native> (owner, flags, preview);
return std::make_shared<FileChooser::Native> (owner, flags, preview);
}
} // namespace juce

Loading…
Cancel
Save