1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-29 11:55:10 +00:00

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.
This commit is contained in:
Lucas CHOLLET 2023-03-18 16:05:46 -04:00 committed by Linus Groh
parent b084759690
commit ebb9c3a430
2 changed files with 16 additions and 8 deletions

View file

@ -720,12 +720,16 @@ bool FileSystemModel::fetch_thumbnail_for(Node const& node)
}; };
auto const on_error = [path](Error error) -> void { auto const on_error = [path](Error error) -> void {
s_thumbnail_cache.with_locked([path, error = move(error)](auto& cache) { // Note: We need to defer that to avoid the function removing its last reference
if (error != Error::from_errno(ECANCELED)) { // i.e. trying to destroy itself, which is prohibited.
cache.thumbnail_cache.set(path, nullptr); Core::EventLoop::current().deferred_invoke([&] {
dbgln("Failed to load thumbnail for {}: {}", path, error); s_thumbnail_cache.with_locked([path, error = move(error)](auto& cache) {
} if (error != Error::from_errno(ECANCELED)) {
cache.loading_thumbnails.remove(path); cache.thumbnail_cache.set(path, nullptr);
dbgln("Failed to load thumbnail for {}: {}", path, error);
}
cache.loading_thumbnails.remove(path);
});
}); });
}; };

View file

@ -98,8 +98,12 @@ private:
error = result.release_error(); error = result.release_error();
m_promise->cancel(Error::from_errno(ECANCELED)); m_promise->cancel(Error::from_errno(ECANCELED));
if (m_on_error) if (m_on_error) {
m_on_error(move(error)); origin_event_loop->deferred_invoke([this, error = move(error)]() mutable {
m_on_error(move(error));
});
origin_event_loop->wake();
}
remove_from_parent(); remove_from_parent();
} }