From 304573884356891ccb64fb9b485e82f35ea3f291 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 28 May 2014 13:38:48 +0200 Subject: score: Add resource node to thread control block --- 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(+) diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h index 7229113a22..6ac4eccfbc 100644 --- a/cpukit/score/include/rtems/score/thread.h +++ b/cpukit/score/include/rtems/score/thread.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -471,6 +472,13 @@ struct Thread_Control_struct { * held by the thread. */ 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) diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h index 8b91730d34..7e6681bb75 100644 --- a/cpukit/score/include/rtems/score/threadimpl.h +++ b/cpukit/score/include/rtems/score/threadimpl.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -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 b65628d1eb..9c65d73586 100644 --- a/cpukit/score/src/threadinitialize.c +++ b/cpukit/score/src/threadinitialize.c @@ -19,6 +19,7 @@ #endif #include +#include #include #include #include @@ -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 -- cgit v1.2.3