[FL-1880] Dialogs: fix semaphore lock (#722)
* Dialogs: fix queued message lock * Dialogs: file select, fix queued message lock * Dialogs: file select, free context after freeing callback holder * Dialogs: better lock, separated wait and free Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
#include <gui/modules/dialog_ex.h>
|
||||
|
||||
typedef struct {
|
||||
osSemaphoreId_t semaphore;
|
||||
FuriApiLock lock;
|
||||
DialogMessageButton result;
|
||||
} DialogsAppMessageContext;
|
||||
|
||||
@@ -30,7 +30,7 @@ static void dialogs_app_message_back_callback(void* context) {
|
||||
furi_assert(context);
|
||||
DialogsAppMessageContext* message_context = context;
|
||||
message_context->result = DialogMessageButtonBack;
|
||||
API_LOCK_UNLOCK(message_context->semaphore);
|
||||
API_LOCK_UNLOCK(message_context->lock);
|
||||
}
|
||||
|
||||
static void dialogs_app_message_callback(DialogExResult result, void* context) {
|
||||
@@ -47,7 +47,7 @@ static void dialogs_app_message_callback(DialogExResult result, void* context) {
|
||||
message_context->result = DialogMessageButtonCenter;
|
||||
break;
|
||||
}
|
||||
API_LOCK_UNLOCK(message_context->semaphore);
|
||||
API_LOCK_UNLOCK(message_context->lock);
|
||||
}
|
||||
|
||||
DialogMessageButton dialogs_app_process_module_message(const DialogsAppMessageDataDialog* data) {
|
||||
@@ -55,7 +55,7 @@ DialogMessageButton dialogs_app_process_module_message(const DialogsAppMessageDa
|
||||
Gui* gui = furi_record_open("gui");
|
||||
const DialogMessage* message = data->message;
|
||||
DialogsAppMessageContext* message_context = furi_alloc(sizeof(DialogsAppMessageContext));
|
||||
message_context->semaphore = API_LOCK_INIT_LOCKED();
|
||||
message_context->lock = API_LOCK_INIT_LOCKED();
|
||||
|
||||
ViewHolder* view_holder = view_holder_alloc();
|
||||
view_holder_attach_to_gui(view_holder, gui);
|
||||
@@ -85,14 +85,15 @@ DialogMessageButton dialogs_app_process_module_message(const DialogsAppMessageDa
|
||||
|
||||
view_holder_set_view(view_holder, dialog_ex_get_view(dialog_ex));
|
||||
view_holder_start(view_holder);
|
||||
API_LOCK_WAIT_UNTIL_UNLOCK_AND_FREE(message_context->semaphore);
|
||||
API_LOCK_WAIT_UNTIL_UNLOCK(message_context->lock);
|
||||
|
||||
ret = message_context->result;
|
||||
|
||||
free(message_context);
|
||||
view_holder_stop(view_holder);
|
||||
view_holder_free(view_holder);
|
||||
dialog_ex_free(dialog_ex);
|
||||
API_LOCK_FREE(message_context->lock);
|
||||
free(message_context);
|
||||
furi_record_close("gui");
|
||||
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user