diff options
author | あく <alleteam@gmail.com> | 2022-02-19 02:38:44 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-19 02:38:44 +0300 |
commit | 3c77ae2eb88db05e4bc8a51c7a0dbd64943c0f9f (patch) | |
tree | 17aabab1eb9e2c7a5fe1e9b5edbe65fe88083a29 /applications/nfc/nfc_worker.c | |
parent | ddd909faa0f114172c4c9ebff427130afd5762ac (diff) |
Nfc: replace cmsis thread with furi, fix condition race in thread stop routine. (#1003)
* Nfc: replace cmsis thread with furi, fix condition race on thread stop routine.
* Nfc: fix memory leak
* FuriCore, CMSIS: properly handle thread names before scheduler start
Diffstat (limited to 'applications/nfc/nfc_worker.c')
-rwxr-xr-x | applications/nfc/nfc_worker.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/applications/nfc/nfc_worker.c b/applications/nfc/nfc_worker.c index 2056fd9f..25c38832 100755 --- a/applications/nfc/nfc_worker.c +++ b/applications/nfc/nfc_worker.c @@ -9,11 +9,17 @@ NfcWorker* nfc_worker_alloc() { NfcWorker* nfc_worker = malloc(sizeof(NfcWorker)); + // Worker thread attributes - nfc_worker->thread_attr.name = "NfcWorker"; - nfc_worker->thread_attr.stack_size = 8192; + nfc_worker->thread = furi_thread_alloc(); + furi_thread_set_name(nfc_worker->thread, "NfcWorker"); + furi_thread_set_stack_size(nfc_worker->thread, 8192); + furi_thread_set_callback(nfc_worker->thread, nfc_worker_task); + furi_thread_set_context(nfc_worker->thread, nfc_worker); + nfc_worker->callback = NULL; nfc_worker->context = NULL; + // Initialize rfal while(furi_hal_nfc_is_busy()) { osDelay(10); @@ -25,6 +31,7 @@ NfcWorker* nfc_worker_alloc() { void nfc_worker_free(NfcWorker* nfc_worker) { furi_assert(nfc_worker); + furi_thread_free(nfc_worker->thread); free(nfc_worker); } @@ -48,7 +55,7 @@ void nfc_worker_start( nfc_worker->context = context; nfc_worker->dev_data = dev_data; nfc_worker_change_state(nfc_worker, state); - nfc_worker->thread = osThreadNew(nfc_worker_task, nfc_worker, &nfc_worker->thread_attr); + furi_thread_start(nfc_worker->thread); } void nfc_worker_stop(NfcWorker* nfc_worker) { @@ -58,6 +65,7 @@ void nfc_worker_stop(NfcWorker* nfc_worker) { } furi_hal_nfc_stop(); nfc_worker_change_state(nfc_worker, NfcWorkerStateStop); + furi_thread_join(nfc_worker->thread); } void nfc_worker_change_state(NfcWorker* nfc_worker, NfcWorkerState state) { @@ -66,7 +74,7 @@ void nfc_worker_change_state(NfcWorker* nfc_worker, NfcWorkerState state) { /***************************** NFC Worker Thread *******************************/ -void nfc_worker_task(void* context) { +int32_t nfc_worker_task(void* context) { NfcWorker* nfc_worker = context; furi_hal_power_insomnia_enter(); @@ -92,7 +100,8 @@ void nfc_worker_task(void* context) { furi_hal_nfc_deactivate(); nfc_worker_change_state(nfc_worker, NfcWorkerStateReady); furi_hal_power_insomnia_exit(); - osThreadExit(); + + return 0; } void nfc_worker_detect(NfcWorker* nfc_worker) { |