[PATCH 1/3] rtems: Return RTEMS_CALLED_FROM_ISR
Sebastian Huber
sebastian.huber at embedded-brains.de
Mon May 17 13:06:53 UTC 2021
If rtems_task_delete() is called from within interrupt context, then
return RTEMS_CALLED_FROM_ISR. This makes the behaviour predictable.
Update #4414.
---
cpukit/rtems/src/taskdelete.c | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/cpukit/rtems/src/taskdelete.c b/cpukit/rtems/src/taskdelete.c
index 852cf3b4c1..0a8d59a3a8 100644
--- a/cpukit/rtems/src/taskdelete.c
+++ b/cpukit/rtems/src/taskdelete.c
@@ -29,6 +29,7 @@ rtems_status_code rtems_task_delete(
{
Thread_Control *the_thread;
Thread_Close_context context;
+ Per_CPU_Control *cpu_self;
Thread_Control *executing;
_Thread_queue_Context_initialize( &context.Base );
@@ -44,12 +45,20 @@ rtems_status_code rtems_task_delete(
return RTEMS_INVALID_ID;
}
- executing = _Thread_Executing;
+ cpu_self = _Per_CPU_Get();
- if ( the_thread == executing ) {
- Per_CPU_Control *cpu_self;
+ if ( _Per_CPU_Is_ISR_in_progress( cpu_self ) ) {
+ _ISR_lock_ISR_enable( &context.Base.Lock_context.Lock_context );
+ return RTEMS_CALLED_FROM_ISR;
+ }
- cpu_self = _Thread_queue_Dispatch_disable( &context.Base );
+ executing = _Per_CPU_Get_executing( cpu_self );
+
+ if ( the_thread == executing ) {
+ _Thread_Dispatch_disable_with_CPU(
+ cpu_self,
+ &context.Base.Lock_context.Lock_context
+ );
_ISR_lock_ISR_enable( &context.Base.Lock_context.Lock_context );
/*
@@ -61,7 +70,8 @@ rtems_status_code rtems_task_delete(
THREAD_LIFE_TERMINATING | THREAD_LIFE_DETACHED,
NULL
);
- _Thread_Dispatch_enable( cpu_self );
+ _Thread_Dispatch_direct_no_return( cpu_self );
+ RTEMS_UNREACHABLE();
} else {
_Thread_Close( the_thread, executing, &context );
}
--
2.26.2
More information about the devel
mailing list