Просмотр исходного кода

Simplify thread usage, fix very rare but possible race condition

Willy-JL 1 год назад
Родитель
Сommit
c66d1c7c84
2 измененных файлов с 8 добавлено и 14 удалено
  1. 8 13
      mfkey.c
  2. 0 1
      mfkey.h

+ 8 - 13
mfkey.c

@@ -733,7 +733,7 @@ static void render_callback(Canvas* const canvas, void* ctx) {
     snprintf(draw_str, sizeof(draw_str), "RAM: %zub", memmgr_get_free_heap());
     snprintf(draw_str, sizeof(draw_str), "RAM: %zub", memmgr_get_free_heap());
     canvas_draw_str_aligned(canvas, 48, 5, AlignLeft, AlignTop, draw_str);
     canvas_draw_str_aligned(canvas, 48, 5, AlignLeft, AlignTop, draw_str);
     canvas_draw_icon(canvas, 114, 4, &I_mfkey);
     canvas_draw_icon(canvas, 114, 4, &I_mfkey);
-    if(program_state->is_thread_running && program_state->mfkey_state == MFKeyAttack) {
+    if(program_state->mfkey_state == MFKeyAttack) {
         float eta_round = (float)1 - ((float)program_state->eta_round / (float)eta_round_time);
         float eta_round = (float)1 - ((float)program_state->eta_round / (float)eta_round_time);
         float eta_total = (float)1 - ((float)program_state->eta_total / (float)eta_total_time);
         float eta_total = (float)1 - ((float)program_state->eta_total / (float)eta_total_time);
         float progress = (float)program_state->num_completed / (float)program_state->total;
         float progress = (float)program_state->num_completed / (float)program_state->total;
@@ -764,7 +764,7 @@ static void render_callback(Canvas* const canvas, void* ctx) {
         elements_progress_bar_with_text(canvas, 5, 31, 118, eta_round, draw_str);
         elements_progress_bar_with_text(canvas, 5, 31, 118, eta_round, draw_str);
         snprintf(draw_str, sizeof(draw_str), "Total ETA %03d Sec", program_state->eta_total);
         snprintf(draw_str, sizeof(draw_str), "Total ETA %03d Sec", program_state->eta_total);
         elements_progress_bar_with_text(canvas, 5, 44, 118, eta_total, draw_str);
         elements_progress_bar_with_text(canvas, 5, 44, 118, eta_total, draw_str);
-    } else if(program_state->is_thread_running && program_state->mfkey_state == DictionaryAttack) {
+    } else if(program_state->mfkey_state == DictionaryAttack) {
         snprintf(
         snprintf(
             draw_str, sizeof(draw_str), "Dict solves: %d (in progress)", program_state->cracked);
             draw_str, sizeof(draw_str), "Dict solves: %d (in progress)", program_state->cracked);
         canvas_draw_str_aligned(canvas, 10, 18, AlignLeft, AlignTop, draw_str);
         canvas_draw_str_aligned(canvas, 10, 18, AlignLeft, AlignTop, draw_str);
@@ -823,7 +823,6 @@ static void input_callback(InputEvent* input_event, void* event_queue) {
 }
 }
 
 
 static void mfkey_state_init(ProgramState* program_state) {
 static void mfkey_state_init(ProgramState* program_state) {
-    program_state->is_thread_running = false;
     program_state->mfkey_state = Ready;
     program_state->mfkey_state = Ready;
     program_state->cracked = 0;
     program_state->cracked = 0;
     program_state->unique_cracked = 0;
     program_state->unique_cracked = 0;
@@ -836,10 +835,8 @@ static void mfkey_state_init(ProgramState* program_state) {
 // Entrypoint for worker thread
 // Entrypoint for worker thread
 static int32_t mfkey_worker_thread(void* ctx) {
 static int32_t mfkey_worker_thread(void* ctx) {
     ProgramState* program_state = ctx;
     ProgramState* program_state = ctx;
-    program_state->is_thread_running = true;
     program_state->mfkey_state = Initializing;
     program_state->mfkey_state = Initializing;
     mfkey(program_state);
     mfkey(program_state);
-    program_state->is_thread_running = false;
     return 0;
     return 0;
 }
 }
 
 
@@ -874,25 +871,22 @@ int32_t mfkey_main() {
             if(input_event.type == InputTypePress) {
             if(input_event.type == InputTypePress) {
                 switch(input_event.key) {
                 switch(input_event.key) {
                 case InputKeyRight:
                 case InputKeyRight:
-                    if(!program_state->is_thread_running && program_state->mfkey_state == Ready) {
+                    if(program_state->mfkey_state == Ready) {
                         program_state->mfkey_state = Help;
                         program_state->mfkey_state = Help;
                     }
                     }
                     break;
                     break;
                 case InputKeyOk:
                 case InputKeyOk:
-                    if(!program_state->is_thread_running && program_state->mfkey_state == Ready) {
+                    if(program_state->mfkey_state == Ready) {
                         furi_thread_start(program_state->mfkeythread);
                         furi_thread_start(program_state->mfkeythread);
                     }
                     }
                     break;
                     break;
                 case InputKeyBack:
                 case InputKeyBack:
-                    if(!program_state->is_thread_running && program_state->mfkey_state == Help) {
+                    if(program_state->mfkey_state == Help) {
                         program_state->mfkey_state = Ready;
                         program_state->mfkey_state = Ready;
                     } else {
                     } else {
                         program_state->close_thread_please = true;
                         program_state->close_thread_please = true;
-                        if(program_state->is_thread_running) {
-                            // Wait until thread is finished
-                            furi_thread_join(program_state->mfkeythread);
-                        }
-                        program_state->close_thread_please = false;
+                        // Wait until thread is finished
+                        furi_thread_join(program_state->mfkeythread);
                         main_loop = false;
                         main_loop = false;
                     }
                     }
                     break;
                     break;
@@ -906,6 +900,7 @@ int32_t mfkey_main() {
         view_port_update(view_port);
         view_port_update(view_port);
     }
     }
 
 
+    // Thread joined in back event handler
     furi_thread_free(program_state->mfkeythread);
     furi_thread_free(program_state->mfkeythread);
     view_port_enabled_set(view_port, false);
     view_port_enabled_set(view_port, false);
     gui_remove_view_port(gui, view_port);
     gui_remove_view_port(gui, view_port);

+ 0 - 1
mfkey.h

@@ -50,7 +50,6 @@ typedef struct {
     int eta_round;
     int eta_round;
     bool mfkey32_present;
     bool mfkey32_present;
     bool nested_present;
     bool nested_present;
-    bool is_thread_running;
     bool close_thread_please;
     bool close_thread_please;
     FuriThread* mfkeythread;
     FuriThread* mfkeythread;
     KeysDict* cuid_dict;
     KeysDict* cuid_dict;