Skip to content

Commit

Permalink
Nfc: replace cmsis thread with furi, fix condition race in thread sto…
Browse files Browse the repository at this point in the history
…p 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
  • Loading branch information
skotopes authored Feb 18, 2022
1 parent ddd909f commit 3c77ae2
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 9 deletions.
19 changes: 14 additions & 5 deletions applications/nfc/nfc_worker.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
}

Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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();
Expand All @@ -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) {
Expand Down
5 changes: 2 additions & 3 deletions applications/nfc/nfc_worker_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@
#include <st25r3916_irq.h>

struct NfcWorker {
osThreadAttr_t thread_attr;
osThreadId_t thread;
FuriThread* thread;

NfcDeviceData* dev_data;

Expand All @@ -30,7 +29,7 @@ struct NfcWorker {

void nfc_worker_change_state(NfcWorker* nfc_worker, NfcWorkerState state);

void nfc_worker_task(void* context);
int32_t nfc_worker_task(void* context);

void nfc_worker_read_emv_app(NfcWorker* nfc_worker);

Expand Down
6 changes: 6 additions & 0 deletions core/furi/memmgr_heap.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,9 @@ static void print_heap_init() {
static void print_heap_malloc(void* ptr, size_t size) {
char tmp_str[33];
const char* name = osThreadGetName(osThreadGetId());
if(!name) {
name = "";
}

// {thread name|m|address|size}
FURI_CRITICAL_ENTER();
Expand All @@ -306,6 +309,9 @@ static void print_heap_malloc(void* ptr, size_t size) {
static void print_heap_free(void* ptr) {
char tmp_str[33];
const char* name = osThreadGetName(osThreadGetId());
if(!name) {
name = "";
}

// {thread name|f|address}
FURI_CRITICAL_ENTER();
Expand Down
4 changes: 3 additions & 1 deletion lib/FreeRTOS-glue/cmsis_os2.c
Original file line number Diff line number Diff line change
Expand Up @@ -578,8 +578,10 @@ const char *osThreadGetName (osThreadId_t thread_id) {

if ((IRQ_Context() != 0U) || (hTask == NULL)) {
name = NULL;
} else {
} else if(osKernelGetState() == osKernelRunning) {
name = pcTaskGetName (hTask);
} else {
name = NULL;
}

/* Return name as null-terminated string */
Expand Down

0 comments on commit 3c77ae2

Please sign in to comment.