summaryrefslogtreecommitdiff
path: root/Userland/Libraries
diff options
context:
space:
mode:
authorLucas CHOLLET <lucas.chollet@free.fr>2023-03-18 16:05:46 -0400
committerLinus Groh <mail@linusgroh.de>2023-03-19 01:26:37 +0000
commitebb9c3a4304e9860386189bc6ac43a11f84f6ec1 (patch)
tree69fd24eb4053b3413cf47cfa617d6672599bca0d /Userland/Libraries
parentb0847596907e20a78819de88fefb010d98989f5c (diff)
downloadserenity-ebb9c3a4304e9860386189bc6ac43a11f84f6ec1.zip
LibThreading: Execute `on_error` on the original `EventLoop`
As the user might want to have interactions with LibGUI while handling errors, this code should be executed in the original `EventLoop`. Similarly to what is done with the error-free path.
Diffstat (limited to 'Userland/Libraries')
-rw-r--r--Userland/Libraries/LibGUI/FileSystemModel.cpp16
-rw-r--r--Userland/Libraries/LibThreading/BackgroundAction.h8
2 files changed, 16 insertions, 8 deletions
diff --git a/Userland/Libraries/LibGUI/FileSystemModel.cpp b/Userland/Libraries/LibGUI/FileSystemModel.cpp
index ee06238e94..99a8a8a50a 100644
--- a/Userland/Libraries/LibGUI/FileSystemModel.cpp
+++ b/Userland/Libraries/LibGUI/FileSystemModel.cpp
@@ -720,12 +720,16 @@ bool FileSystemModel::fetch_thumbnail_for(Node const& node)
};
auto const on_error = [path](Error error) -> void {
- s_thumbnail_cache.with_locked([path, error = move(error)](auto& cache) {
- if (error != Error::from_errno(ECANCELED)) {
- cache.thumbnail_cache.set(path, nullptr);
- dbgln("Failed to load thumbnail for {}: {}", path, error);
- }
- cache.loading_thumbnails.remove(path);
+ // Note: We need to defer that to avoid the function removing its last reference
+ // i.e. trying to destroy itself, which is prohibited.
+ Core::EventLoop::current().deferred_invoke([&] {
+ s_thumbnail_cache.with_locked([path, error = move(error)](auto& cache) {
+ if (error != Error::from_errno(ECANCELED)) {
+ cache.thumbnail_cache.set(path, nullptr);
+ dbgln("Failed to load thumbnail for {}: {}", path, error);
+ }
+ cache.loading_thumbnails.remove(path);
+ });
});
};
diff --git a/Userland/Libraries/LibThreading/BackgroundAction.h b/Userland/Libraries/LibThreading/BackgroundAction.h
index 02aa6b3408..1d12128f8e 100644
--- a/Userland/Libraries/LibThreading/BackgroundAction.h
+++ b/Userland/Libraries/LibThreading/BackgroundAction.h
@@ -98,8 +98,12 @@ private:
error = result.release_error();
m_promise->cancel(Error::from_errno(ECANCELED));
- if (m_on_error)
- m_on_error(move(error));
+ if (m_on_error) {
+ origin_event_loop->deferred_invoke([this, error = move(error)]() mutable {
+ m_on_error(move(error));
+ });
+ origin_event_loop->wake();
+ }
remove_from_parent();
}