From 947335eace6bbea3c883ebe3e05eb3b391361397 Mon Sep 17 00:00:00 2001 From: hanzhijian Date: Fri, 14 Aug 2026 15:09:57 +0800 Subject: [PATCH] Add timer delete completion callback Signed-off-by: hanzhijian --- include/timers.h | 17 +++++++++++++++++ timers.c | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/include/timers.h b/include/timers.h index 191703928f2..5f3d5f71495 100644 --- a/include/timers.h +++ b/include/timers.h @@ -82,6 +82,15 @@ typedef struct tmrTimerControl * TimerHandle_t; */ typedef void (* TimerCallbackFunction_t)( TimerHandle_t xTimer ); +/* + * Defines the prototype for a callback invoked by the timer daemon when it + * processes a timer delete command. The timer remains valid for the duration + * of this callback. + */ +typedef void (* TimerDeleteCallbackFunction_t)( TimerHandle_t xTimer, + TimerCallbackFunction_t pxCallbackFunction, + void * pvTimerID ); + /* * Defines the prototype to which functions used with the * xTimerPendFunctionCallFromISR() function must conform. @@ -1293,6 +1302,14 @@ void vTimerSetReloadMode( TimerHandle_t xTimer, */ BaseType_t xTimerGetReloadMode( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; +/** + * Registers a callback that is invoked by the timer daemon immediately before + * it releases a deleted timer's control block. + * + * @param pxDeleteCallback The callback to invoke, or NULL to unregister it. + */ +void vTimerDeleteCallbackRegister( TimerDeleteCallbackFunction_t pxDeleteCallback ) PRIVILEGED_FUNCTION; + /** * UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ); * diff --git a/timers.c b/timers.c index 1bc40bc46f7..4ca1a8d68ab 100644 --- a/timers.c +++ b/timers.c @@ -148,6 +148,7 @@ /* A queue that is used to send commands to the timer service task. */ PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL; PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL; + PRIVILEGED_DATA static TimerDeleteCallbackFunction_t pxTimerDeleteCallback = NULL; /*-----------------------------------------------------------*/ @@ -1047,6 +1048,15 @@ break; case tmrCOMMAND_DELETE: + /* Notify wrappers while the timer control block and + * its callback context are still valid. */ + if( pxTimerDeleteCallback != NULL ) + { + pxTimerDeleteCallback( ( TimerHandle_t ) pxTimer, + pxTimer->pxCallbackFunction, + pxTimer->pvTimerID ); + } + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) { /* The timer has already been removed from the active list, @@ -1191,6 +1201,12 @@ } /*-----------------------------------------------------------*/ + void vTimerDeleteCallbackRegister( TimerDeleteCallbackFunction_t pxDeleteCallback ) + { + pxTimerDeleteCallback = pxDeleteCallback; + } +/*-----------------------------------------------------------*/ + void * pvTimerGetTimerID( const TimerHandle_t xTimer ) { Timer_t * const pxTimer = xTimer;