diff --git a/src/apps/debuganalyzer/gui/main_window/MainWindow.cpp b/src/apps/debuganalyzer/gui/main_window/MainWindow.cpp index f11ee912dd..22fd86aa89 100644 --- a/src/apps/debuganalyzer/gui/main_window/MainWindow.cpp +++ b/src/apps/debuganalyzer/gui/main_window/MainWindow.cpp @@ -106,6 +106,9 @@ printf("MSG_MODEL_LOADED_FAILED/MSG_MODEL_LOADED_ABORTED\n"); void MainWindow::Quit() { + if (fModelLoader != NULL) + fModelLoader->Abort(true); + fSubWindowManager->Broadcast(B_QUIT_REQUESTED); be_app->PostMessage(MSG_WINDOW_QUIT); diff --git a/src/apps/debuganalyzer/model_loader/ModelLoader.cpp b/src/apps/debuganalyzer/model_loader/ModelLoader.cpp index ba6a334cea..8e0402f2c6 100644 --- a/src/apps/debuganalyzer/model_loader/ModelLoader.cpp +++ b/src/apps/debuganalyzer/model_loader/ModelLoader.cpp @@ -84,10 +84,7 @@ ModelLoader::ModelLoader(DataSource* dataSource, ModelLoader::~ModelLoader() { - if (fLoaderThread >= 0) { - Abort(); - wait_for_thread(fLoaderThread, NULL); - } + Abort(true); delete fDataSource; delete fModel; @@ -128,14 +125,22 @@ ModelLoader::StartLoading() void -ModelLoader::Abort() +ModelLoader::Abort(bool wait) { AutoLocker locker(fLock); - if (!fLoading || fAborted) + if (fLoaderThread < 0) return; - fAborted = true; + thread_id thread = fLoaderThread; + + if (fLoading) + fAborted = true; + + locker.Unlock(); + + if (wait) + wait_for_thread(thread, NULL); } diff --git a/src/apps/debuganalyzer/model_loader/ModelLoader.h b/src/apps/debuganalyzer/model_loader/ModelLoader.h index 17ee7ab386..a7ca085c4f 100644 --- a/src/apps/debuganalyzer/model_loader/ModelLoader.h +++ b/src/apps/debuganalyzer/model_loader/ModelLoader.h @@ -27,7 +27,7 @@ public: ~ModelLoader(); status_t StartLoading(); - void Abort(); + void Abort(bool wait); Model* DetachModel();