static void _RTEMS_tasks_Delete_extension( Thread_Control *executing, Thread_Control *deleted ) { rtems_task_variable_t *tvp, *next; /* * Free per task variable memory */ tvp = deleted->task_variables; deleted->task_variables = NULL; while (tvp) { next = (rtems_task_variable_t *)tvp->next; _RTEMS_Tasks_Invoke_task_variable_dtor( deleted, tvp ); tvp = next; } /* * Free API specific memory */ (void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_RTEMS ] ); deleted->API_Extensions[ THREAD_API_RTEMS ] = NULL; }
static void _RTEMS_tasks_Terminate_extension( Thread_Control *executing ) { /* * Free per task variable memory * * Per Task Variables are only enabled in uniprocessor configurations */ #if !defined(RTEMS_SMP) do { rtems_task_variable_t *tvp, *next; tvp = executing->task_variables; executing->task_variables = NULL; while (tvp) { next = (rtems_task_variable_t *)tvp->next; _RTEMS_Tasks_Invoke_task_variable_dtor( executing, tvp ); tvp = next; } } while (0); #endif /* * Run all the key destructors */ _POSIX_Keys_Run_destructors( executing ); }