Browse Source

CrashReporter: Dispatch backtrace progress callbacks on the main thread

We can't fiddle with GUI widgets off the main thread, so let's use
Core::EventLoop::deferred_invoke() to dispatch the work.

The progress bar doesn't visibly update yet, but at least we're not
crashing anymore.
Andreas Kling 3 years ago
parent
commit
58b5aede65
1 changed files with 7 additions and 4 deletions
  1. 7 4
      Userland/Applications/CrashReporter/main.cpp

+ 7 - 4
Userland/Applications/CrashReporter/main.cpp

@@ -297,10 +297,13 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
             size_t thread_index = 0;
             size_t thread_index = 0;
             coredump->for_each_thread_info([&](auto& thread_info) {
             coredump->for_each_thread_info([&](auto& thread_info) {
                 results.thread_backtraces.append(build_backtrace(*coredump, thread_info, thread_index, [&](size_t frame_index, size_t frame_count) {
                 results.thread_backtraces.append(build_backtrace(*coredump, thread_info, thread_index, [&](size_t frame_index, size_t frame_count) {
-                    window->set_progress(100.0f * (float)(frame_index + 1) / (float)frame_count);
-                    progressbar.set_value(frame_index + 1);
-                    progressbar.set_max(frame_count);
-                    Core::EventLoop::wake();
+                    Core::EventLoop::with_main_locked([&](auto& main) {
+                        main->deferred_invoke([&] {
+                            window->set_progress(100.0f * (float)(frame_index + 1) / (float)frame_count);
+                            progressbar.set_value(frame_index + 1);
+                            progressbar.set_max(frame_count);
+                        });
+                    });
                 }));
                 }));
                 results.thread_cpu_registers.append(build_cpu_registers(thread_info, thread_index));
                 results.thread_cpu_registers.append(build_cpu_registers(thread_info, thread_index));
                 ++thread_index;
                 ++thread_index;