Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions include/timers.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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 );
*
Expand Down
16 changes: 16 additions & 0 deletions timers.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/*-----------------------------------------------------------*/

Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -1191,6 +1201,12 @@
}
/*-----------------------------------------------------------*/

void vTimerDeleteCallbackRegister( TimerDeleteCallbackFunction_t pxDeleteCallback )
{
pxTimerDeleteCallback = pxDeleteCallback;
}
/*-----------------------------------------------------------*/

void * pvTimerGetTimerID( const TimerHandle_t xTimer )
{
Timer_t * const pxTimer = xTimer;
Expand Down