From 6dab25ae4e2d4212b76dec01737fcdb2d257af50 Mon Sep 17 00:00:00 2001 From: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:21:35 +0530 Subject: [PATCH] Pend a yield in portPRE_TASK_DELETE_HOOK (#1132) When a task deletes itself, it calls portPRE_TASK_DELETE_HOOK which translates to vPortCloseRunningThread on the Windows port. vPortCloseRunningThread never returns and as a result, taskYIELD_WITHIN_API in vTaskDelete does not get called. As a result, the next task is not scheduled when configUSE_PREEMPTION is set to 0. This change records that a yield is pending so that the next tick interrupt switches out the task that was deleted. Signed-off-by: Gaurav Aggarwal --- portable/MSVC-MingW/port.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/portable/MSVC-MingW/port.c b/portable/MSVC-MingW/port.c index 7c34aabd6a..c6ee941c8f 100644 --- a/portable/MSVC-MingW/port.c +++ b/portable/MSVC-MingW/port.c @@ -547,6 +547,20 @@ void vPortCloseRunningThread( void * pvTaskToDelete, /* This is called from a critical section, which must be exited before the * thread stops. */ taskEXIT_CRITICAL(); + + /* Record that a yield is pending so that the next tick interrupt switches + * out this thread regardless of the value of configUSE_PREEMPTION. This is + * needed when a task deletes itself - the taskYIELD_WITHIN_API within + * vTaskDelete does not get called because this function never returns. If + * we do not pend portINTERRUPT_YIELD here, the next task is not scheduled + * when configUSE_PREEMPTION is set to 0. */ + if( pvInterruptEventMutex != NULL ) + { + WaitForSingleObject( pvInterruptEventMutex, INFINITE ); + ulPendingInterrupts |= ( 1 << portINTERRUPT_YIELD ); + ReleaseMutex( pvInterruptEventMutex ); + } + CloseHandle( pxThreadState->pvYieldEvent ); ExitThread( 0 ); }