From 47d246436f5b95359325740f4deb2df6345c971e Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 31 Oct 2016 16:23:52 +0100 Subject: score: Conditionally enable thread resource count Maintain the thread resource count only in debug configurations. This is a performance optimization for non-debug configurations. --- cpukit/score/include/rtems/score/thread.h | 8 ++++++++ cpukit/score/include/rtems/score/threadimpl.h | 10 ++++++++++ cpukit/score/src/thread.c | 2 ++ cpukit/score/src/threadrestart.c | 2 ++ testsuites/sptests/spfatal28/testcase.h | 4 ++++ 5 files changed, 26 insertions(+) diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h index ff7f13be55..7711f706f3 100644 --- a/cpukit/score/include/rtems/score/thread.h +++ b/cpukit/score/include/rtems/score/thread.h @@ -83,6 +83,10 @@ extern "C" { #define RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API #endif +#if defined(RTEMS_DEBUG) +#define RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT +#endif + /* * Only provided for backward compatiblity to not break application * configurations. @@ -492,8 +496,10 @@ typedef struct { */ Priority_Node Real_priority; +#if defined(RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT) /** This field is the number of mutexes currently held by this proxy. */ uint32_t resource_count; +#endif /** * @brief Scheduler related control. @@ -716,8 +722,10 @@ struct _Thread_Control { */ Priority_Node Real_priority; +#if defined(RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT) /** This field is the number of mutexes currently held by this thread. */ uint32_t resource_count; +#endif /** * @brief Scheduler related control. diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h index 37127fbabd..61694461b4 100644 --- a/cpukit/score/include/rtems/score/threadimpl.h +++ b/cpukit/score/include/rtems/score/threadimpl.h @@ -977,16 +977,25 @@ RTEMS_INLINE_ROUTINE void _Thread_Resource_count_increment( Thread_Control *the_thread ) { +#if defined(RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT) ++the_thread->resource_count; +#else + (void) the_thread; +#endif } RTEMS_INLINE_ROUTINE void _Thread_Resource_count_decrement( Thread_Control *the_thread ) { +#if defined(RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT) --the_thread->resource_count; +#else + (void) the_thread; +#endif } +#if defined(RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT) /** * @brief Returns true if the thread owns resources, and false otherwise. * @@ -1001,6 +1010,7 @@ RTEMS_INLINE_ROUTINE bool _Thread_Owns_resources( { return the_thread->resource_count != 0; } +#endif #if defined(RTEMS_SMP) RTEMS_INLINE_ROUTINE void _Thread_Scheduler_cancel_need_for_help( diff --git a/cpukit/score/src/thread.c b/cpukit/score/src/thread.c index 864b21bf6f..a0ba61d88c 100644 --- a/cpukit/score/src/thread.c +++ b/cpukit/score/src/thread.c @@ -33,7 +33,9 @@ THREAD_OFFSET_ASSERT( Object ); THREAD_OFFSET_ASSERT( Join_queue ); THREAD_OFFSET_ASSERT( current_state ); THREAD_OFFSET_ASSERT( Real_priority ); +#if defined(RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT) THREAD_OFFSET_ASSERT( resource_count ); +#endif THREAD_OFFSET_ASSERT( Scheduler ); THREAD_OFFSET_ASSERT( Wait ); THREAD_OFFSET_ASSERT( Timer ); diff --git a/cpukit/score/src/threadrestart.c b/cpukit/score/src/threadrestart.c index 4d9e2c93ea..182cdb6128 100644 --- a/cpukit/score/src/threadrestart.c +++ b/cpukit/score/src/threadrestart.c @@ -133,6 +133,7 @@ static void _Thread_Add_to_zombie_chain( Thread_Control *the_thread ) static void _Thread_Make_zombie( Thread_Control *the_thread ) { +#if defined(RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT) if ( _Thread_Owns_resources( the_thread ) ) { _Terminate( INTERNAL_ERROR_CORE, @@ -140,6 +141,7 @@ static void _Thread_Make_zombie( Thread_Control *the_thread ) INTERNAL_ERROR_RESOURCE_IN_USE ); } +#endif _Objects_Close( _Objects_Get_information_id( the_thread->Object.id ), diff --git a/testsuites/sptests/spfatal28/testcase.h b/testsuites/sptests/spfatal28/testcase.h index fc721003e2..9741760dc9 100644 --- a/testsuites/sptests/spfatal28/testcase.h +++ b/testsuites/sptests/spfatal28/testcase.h @@ -22,6 +22,7 @@ void force_error() { +#if defined(RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT) rtems_status_code sc; rtems_id id; @@ -36,4 +37,7 @@ void force_error() sc = rtems_task_delete(RTEMS_SELF); rtems_test_assert(sc == RTEMS_SUCCESSFUL); +#else + _Terminate( INTERNAL_ERROR_CORE, false, INTERNAL_ERROR_RESOURCE_IN_USE ); +#endif } -- cgit v1.2.3