Furi: wait for timer wind down in destructor (#1716)
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
#include "timer.h"
|
||||
#include "check.h"
|
||||
#include "memmgr.h"
|
||||
#include "kernel.h"
|
||||
|
||||
#include "core/common_defines.h"
|
||||
#include <FreeRTOS.h>
|
||||
@@ -39,7 +41,7 @@ FuriTimer* furi_timer_alloc(FuriTimerCallback func, FuriTimerType type, void* co
|
||||
/* Dynamic memory allocation is available: if memory for callback and */
|
||||
/* its context is not provided, allocate it from dynamic memory pool */
|
||||
if(callb == NULL) {
|
||||
callb = (TimerCallback_t*)pvPortMalloc(sizeof(TimerCallback_t));
|
||||
callb = (TimerCallback_t*)malloc(sizeof(TimerCallback_t));
|
||||
|
||||
if(callb != NULL) {
|
||||
/* Callback memory was allocated from dynamic pool, set flag */
|
||||
@@ -65,7 +67,7 @@ FuriTimer* furi_timer_alloc(FuriTimerCallback func, FuriTimerType type, void* co
|
||||
if((hTimer == NULL) && (callb != NULL) && (callb_dyn == 1U)) {
|
||||
/* Failed to create a timer, release allocated resources */
|
||||
callb = (TimerCallback_t*)((uint32_t)callb & ~1U);
|
||||
vPortFree(callb);
|
||||
free(callb);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,14 +84,16 @@ void furi_timer_free(FuriTimer* instance) {
|
||||
|
||||
callb = (TimerCallback_t*)pvTimerGetTimerID(hTimer);
|
||||
|
||||
if(xTimerDelete(hTimer, portMAX_DELAY) == pdPASS) {
|
||||
if((uint32_t)callb & 1U) {
|
||||
/* Callback memory was allocated from dynamic pool, clear flag */
|
||||
callb = (TimerCallback_t*)((uint32_t)callb & ~1U);
|
||||
furi_check(xTimerDelete(hTimer, portMAX_DELAY) == pdPASS);
|
||||
|
||||
/* Return allocated memory to dynamic pool */
|
||||
vPortFree(callb);
|
||||
}
|
||||
while (furi_timer_is_running(instance)) furi_delay_tick(2);
|
||||
|
||||
if((uint32_t)callb & 1U) {
|
||||
/* Callback memory was allocated from dynamic pool, clear flag */
|
||||
callb = (TimerCallback_t*)((uint32_t)callb & ~1U);
|
||||
|
||||
/* Return allocated memory to dynamic pool */
|
||||
free(callb);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,11 +124,8 @@ FuriStatus furi_timer_stop(FuriTimer* instance) {
|
||||
if(xTimerIsTimerActive(hTimer) == pdFALSE) {
|
||||
stat = FuriStatusErrorResource;
|
||||
} else {
|
||||
if(xTimerStop(hTimer, portMAX_DELAY) == pdPASS) {
|
||||
stat = FuriStatusOk;
|
||||
} else {
|
||||
stat = FuriStatusError;
|
||||
}
|
||||
furi_check(xTimerStop(hTimer, portMAX_DELAY) == pdPASS);
|
||||
stat = FuriStatusOk;
|
||||
}
|
||||
|
||||
/* Return execution status */
|
||||
|
Reference in New Issue
Block a user