--- cpukit/score/include/rtems/score/thread.h | 8 ++++++++ cpukit/score/include/rtems/score/threadimpl.h | 10 ++++++++++ cpukit/score/src/threadinitialize.c | 2 ++ 3 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h index 10c7ddc..6ae684b 100644 --- a/cpukit/score/include/rtems/score/thread.h +++ b/cpukit/score/include/rtems/score/thread.h @@ -28,6 +28,7 @@ #include <rtems/score/object.h> #include <rtems/score/percpu.h> #include <rtems/score/priority.h> +#include <rtems/score/resource.h> #include <rtems/score/stack.h> #include <rtems/score/states.h> #include <rtems/score/threadq.h> @@ -488,6 +489,13 @@ struct Thread_Control_struct { */ Chain_Control lock_mutex; #endif +#if defined(RTEMS_SMP) + /** + * @brief Resource node to build a dependency tree in case this thread owns + * resources or depends on a resource. + */ + Resource_Node Resource_node; +#endif /*================= end of common block =================*/ #if defined(RTEMS_MULTIPROCESSING) /** This field is true if the thread is offered globally */ diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h index 1f63d06..39c40df 100644 --- a/cpukit/score/include/rtems/score/threadimpl.h +++ b/cpukit/score/include/rtems/score/threadimpl.h @@ -26,6 +26,7 @@ #include <rtems/score/interr.h> #include <rtems/score/isr.h> #include <rtems/score/objectimpl.h> +#include <rtems/score/resourceimpl.h> #include <rtems/score/statesimpl.h> #include <rtems/score/sysstate.h> #include <rtems/score/todimpl.h> @@ -791,6 +792,10 @@ RTEMS_INLINE_ROUTINE bool _Thread_Is_life_changing( * Resources are accounted with the Thread_Control::resource_count resource * counter. This counter is used by semaphore objects for example. * + * In addition to the resource counter there is a resource dependency tree + * available on SMP configurations. In case this tree is non-empty, then the + * thread owns resources. + * * @param[in] the_thread The thread. */ RTEMS_INLINE_ROUTINE bool _Thread_Owns_resources( @@ -799,6 +804,11 @@ RTEMS_INLINE_ROUTINE bool _Thread_Owns_resources( { bool owns_resources = the_thread->resource_count != 0; +#if defined(RTEMS_SMP) + owns_resources = owns_resources + || _Resource_Node_owns_resources( &the_thread->Resource_node ); +#endif + return owns_resources; } diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c index b65628d..9c65d73 100644 --- a/cpukit/score/src/threadinitialize.c +++ b/cpukit/score/src/threadinitialize.c @@ -19,6 +19,7 @@ #endif #include <rtems/score/threadimpl.h> +#include <rtems/score/resourceimpl.h> #include <rtems/score/schedulerimpl.h> #include <rtems/score/stackimpl.h> #include <rtems/score/tls.h> @@ -182,6 +183,7 @@ bool _Thread_Initialize( #if defined(RTEMS_SMP) the_thread->scheduler = scheduler; + _Resource_Node_initialize( &the_thread->Resource_node ); _CPU_Context_Set_is_executing( &the_thread->Registers, false ); #endif -- 1.7.7 _______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel