summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-10-31 16:23:52 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-11-03 11:23:30 +0100
commit47d246436f5b95359325740f4deb2df6345c971e (patch)
tree0d006b98e2449d66b8b882c39ffb6ef107e1532f
parentscore: Relax _Scheduler_Set() restrictions (diff)
downloadrtems-47d246436f5b95359325740f4deb2df6345c971e.tar.bz2
score: Conditionally enable thread resource count
Maintain the thread resource count only in debug configurations. This is a performance optimization for non-debug configurations.
-rw-r--r--cpukit/score/include/rtems/score/thread.h8
-rw-r--r--cpukit/score/include/rtems/score/threadimpl.h10
-rw-r--r--cpukit/score/src/thread.c2
-rw-r--r--cpukit/score/src/threadrestart.c2
-rw-r--r--testsuites/sptests/spfatal28/testcase.h4
5 files changed, 26 insertions, 0 deletions
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
}