From c2dbdb5dd5222d8c71702930a28f534d1f0e6ef9 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Tue, 15 Apr 2025 04:05:52 +0100 Subject: [PATCH] Loader: Fix event edge cases, fixes Apps hang --- applications/services/loader/loader.c | 30 ++++++++++--------- applications/services/loader/loader.h | 1 + .../services/loader/loader_applications.c | 1 + 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/applications/services/loader/loader.c b/applications/services/loader/loader.c index 166da9014..a569824c8 100644 --- a/applications/services/loader/loader.c +++ b/applications/services/loader/loader.c @@ -601,7 +601,7 @@ static LoaderMessageLoaderStatusResult loader_start_external_app( if(res != DialogMessageButtonRight) { const char* err_msg = flipper_application_preload_status_to_string(preload_res); result.value = loader_make_status_error( - LoaderStatusErrorAppStarted, // Not LoaderStatusErrorInternal since it would show another popup + LoaderStatusErrorApiMismatchCanceled, // Not LoaderStatusErrorInternal since it would show another popup error_message, "Preload failed, %s: %s", path, @@ -693,10 +693,6 @@ static LoaderMessageLoaderStatusResult loader_do_start_by_name( status.value = loader_make_success_status(error_message); status.error = LoaderStatusErrorUnknown; - LoaderEvent event; - event.type = LoaderEventTypeApplicationBeforeLoad; - furi_pubsub_publish(loader->pubsub, &event); - do { // check lock if(loader_do_is_locked(loader)) { @@ -716,6 +712,17 @@ static LoaderMessageLoaderStatusResult loader_do_start_by_name( break; } + // check Applications + if(strcmp(name, LOADER_APPLICATIONS_NAME) == 0) { + loader_do_applications_show(loader); + status.value = loader_make_success_status(error_message); + break; + } + + LoaderEvent event; + event.type = LoaderEventTypeApplicationBeforeLoad; + furi_pubsub_publish(loader->pubsub, &event); + // Translate app names (mainly for RPC) if(!strncmp(name, "Bad USB", strlen("Bad USB"))) { name = "Bad KB"; @@ -731,13 +738,6 @@ static LoaderMessageLoaderStatusResult loader_do_start_by_name( } } - // check Applications - if(strcmp(name, LOADER_APPLICATIONS_NAME) == 0) { - loader_do_applications_show(loader); - status.value = loader_make_success_status(error_message); - break; - } - // check External Applications { const char* path = loader_find_external_application_by_name(name); @@ -930,7 +930,8 @@ int32_t loader_srv(void* p) { LoaderMessageLoaderStatusResult status = loader_do_start_by_name( loader, message.start.name, message.start.args, message.start.error_message); *(message.status_value) = status; - if(status.value != LoaderStatusOk) loader_do_emit_queue_empty_event(loader); + if(status.value != LoaderStatusOk && status.value != LoaderStatusErrorAppStarted) + loader_do_emit_queue_empty_event(loader); api_lock_unlock(message.api_lock); break; } @@ -939,7 +940,8 @@ int32_t loader_srv(void* p) { LoaderMessageLoaderStatusResult status = loader_do_start_by_name( loader, message.start.name, message.start.args, error_message); loader_show_gui_error(status, message.start.name, error_message); - if(status.value != LoaderStatusOk) loader_do_emit_queue_empty_event(loader); + if(status.value != LoaderStatusOk && status.value != LoaderStatusErrorAppStarted) + loader_do_emit_queue_empty_event(loader); if(message.start.name) free((void*)message.start.name); if(message.start.args) free((void*)message.start.args); furi_string_free(error_message); diff --git a/applications/services/loader/loader.h b/applications/services/loader/loader.h index 9233b86f8..da049eaad 100644 --- a/applications/services/loader/loader.h +++ b/applications/services/loader/loader.h @@ -15,6 +15,7 @@ typedef enum { LoaderStatusErrorAppStarted, LoaderStatusErrorUnknownApp, LoaderStatusErrorInternal, + LoaderStatusErrorApiMismatchCanceled, //loader), subscription); + furi_thread_flags_clear(APPLICATION_STOP_EVENT); } static int32_t loader_applications_thread(void* p) {