[rtems commit] score: Add STATES_THREAD_QUEUE_WITH_IDENTIFIER

Sebastian Huber sebh at rtems.org
Wed Jan 11 07:17:21 UTC 2017


Module:    rtems
Branch:    master
Commit:    9a448aabe65f2b85c7721098a3f68f0a99a6728b
Changeset: http://git.rtems.org/rtems/commit/?id=9a448aabe65f2b85c7721098a3f68f0a99a6728b

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Dec 23 16:02:07 2016 +0100

score: Add STATES_THREAD_QUEUE_WITH_IDENTIFIER

Add thread state bit to identify thread queues that are embedded in an
object with identifier.

---

 cpukit/libdebugger/rtems-debugger-threads.c    |  8 +++-----
 cpukit/libmisc/monitor/mon-prmisc.c            | 22 +++++++++++----------
 cpukit/posix/src/condwaitsupp.c                |  3 ++-
 cpukit/score/include/rtems/score/coresemimpl.h |  2 +-
 cpukit/score/include/rtems/score/statesimpl.h  | 27 +++++++++++++-------------
 cpukit/score/src/condition.c                   |  2 +-
 cpukit/score/src/corebarrierwait.c             |  2 +-
 cpukit/score/src/coremsgseize.c                |  2 +-
 cpukit/score/src/coremsgsubmit.c               |  2 +-
 cpukit/score/src/coremutexseize.c              |  2 +-
 cpukit/score/src/corerwlockobtainread.c        |  2 +-
 cpukit/score/src/corerwlockobtainwrite.c       |  2 +-
 cpukit/score/src/futex.c                       |  2 +-
 cpukit/score/src/mutex.c                       |  2 +-
 cpukit/score/src/semaphore.c                   |  2 +-
 cpukit/score/src/threadwaitgetid.c             | 10 +---------
 16 files changed, 43 insertions(+), 49 deletions(-)

diff --git a/cpukit/libdebugger/rtems-debugger-threads.c b/cpukit/libdebugger/rtems-debugger-threads.c
index aa4cb72..2e9cf06 100644
--- a/cpukit/libdebugger/rtems-debugger-threads.c
+++ b/cpukit/libdebugger/rtems-debugger-threads.c
@@ -521,7 +521,7 @@ rtems_debugger_thread_state_str(rtems_debugger_thread* thread,
     { "Wbar",   STATES_WAITING_FOR_BARRIER },
     { "Wcvar",  STATES_WAITING_FOR_CONDITION_VARIABLE },
     { "Wevnt",  STATES_WAITING_FOR_EVENT },
-    { "Wisig",  STATES_INTERRUPTIBLE_BY_SIGNAL },
+    { "ISIG" ,  STATES_INTERRUPTIBLE_BY_SIGNAL },
     { "Wjatx",  STATES_WAITING_FOR_JOIN_AT_EXIT },
     { "Wjoin",  STATES_WAITING_FOR_JOIN },
     { "Wmsg" ,  STATES_WAITING_FOR_MESSAGE },
@@ -532,10 +532,8 @@ rtems_debugger_thread_state_str(rtems_debugger_thread* thread,
     { "Wseg",   STATES_WAITING_FOR_SEGMENT },
     { "Wsem",   STATES_WAITING_FOR_SEMAPHORE },
     { "Wsig",   STATES_WAITING_FOR_SIGNAL },
-    { "Wslcnd", STATES_WAITING_FOR_SYS_LOCK_CONDITION },
-    { "Wslftx", STATES_WAITING_FOR_SYS_LOCK_FUTEX },
-    { "Wslmtx", STATES_WAITING_FOR_SYS_LOCK_MUTEX },
-    { "Wslsem", STATES_WAITING_FOR_SYS_LOCK_SEMAPHORE },
+    { "Wfutex", STATES_WAITING_FOR_FUTEX },
+    { "TQID",   STATES_THREAD_QUEUE_WITH_IDENTIFIER },
     { "Wsysev", STATES_WAITING_FOR_SYSTEM_EVENT },
     { "Wtime",  STATES_WAITING_FOR_TIME },
     { "Wwkup",  STATES_WAITING_FOR_BSD_WAKEUP },
diff --git a/cpukit/libmisc/monitor/mon-prmisc.c b/cpukit/libmisc/monitor/mon-prmisc.c
index 5f10df1..5bb4d42 100644
--- a/cpukit/libmisc/monitor/mon-prmisc.c
+++ b/cpukit/libmisc/monitor/mon-prmisc.c
@@ -112,29 +112,31 @@ rtems_monitor_dump_priority(rtems_task_priority priority)
     return fprintf(stdout,"%3" PRId32, priority);
 }
 
+#define WITH_ID(state) (STATES_THREAD_QUEUE_WITH_IDENTIFIER | state)
+
 static const rtems_assoc_t rtems_monitor_state_assoc[] = {
     { "DELAY",  STATES_DELAYING, 0 },
     { "DORM",   STATES_DORMANT, 0 },
     { "LIFE",   STATES_LIFE_IS_CHANGING, 0 },
     { "SUSP",   STATES_SUSPENDED, 0 },
-    { "Wbar",   STATES_WAITING_FOR_BARRIER, 0 },
-    { "Wcvar",  STATES_WAITING_FOR_CONDITION_VARIABLE, 0 },
+    { "Wbar",   WITH_ID(STATES_WAITING_FOR_BARRIER), 0 },
+    { "Wcvar",  WITH_ID(STATES_WAITING_FOR_CONDITION_VARIABLE), 0 },
     { "Wevnt",  STATES_WAITING_FOR_EVENT, 0 },
     { "Wisig",  STATES_INTERRUPTIBLE_BY_SIGNAL, 0 },
     { "Wjatx",  STATES_WAITING_FOR_JOIN_AT_EXIT, 0 },
     { "Wjoin",  STATES_WAITING_FOR_JOIN, 0 },
-    { "Wmsg" ,  STATES_WAITING_FOR_MESSAGE, 0 },
-    { "Wmutex", STATES_WAITING_FOR_MUTEX, 0 },
+    { "Wmsg" ,  WITH_ID(STATES_WAITING_FOR_MESSAGE), 0 },
+    { "Wmutex", WITH_ID(STATES_WAITING_FOR_MUTEX), 0 },
     { "WRATE",  STATES_WAITING_FOR_PERIOD, 0 },
     { "Wrpc",   STATES_WAITING_FOR_RPC_REPLY, 0 },
-    { "Wrwlk",  STATES_WAITING_FOR_RWLOCK, 0 },
+    { "Wrwlk",  WITH_ID(STATES_WAITING_FOR_RWLOCK), 0 },
     { "Wseg",   STATES_WAITING_FOR_SEGMENT, 0 },
-    { "Wsem",   STATES_WAITING_FOR_SEMAPHORE, 0 },
+    { "Wsem",   WITH_ID(STATES_WAITING_FOR_SEMAPHORE), 0 },
     { "Wsig",   STATES_WAITING_FOR_SIGNAL, 0 },
-    { "Wslcnd", STATES_WAITING_FOR_SYS_LOCK_CONDITION, 0 },
-    { "Wslftx", STATES_WAITING_FOR_SYS_LOCK_FUTEX, 0 },
-    { "Wslmtx", STATES_WAITING_FOR_SYS_LOCK_MUTEX, 0 },
-    { "Wslsem", STATES_WAITING_FOR_SYS_LOCK_SEMAPHORE, 0 },
+    { "Wcvar",  STATES_WAITING_FOR_CONDITION_VARIABLE, 0 },
+    { "Wfutex", STATES_WAITING_FOR_FUTEX, 0 },
+    { "Wmutex", STATES_WAITING_FOR_MUTEX, 0 },
+    { "Wsem",   STATES_WAITING_FOR_SEMAPHORE, 0 },
     { "Wsysev", STATES_WAITING_FOR_SYSTEM_EVENT, 0 },
     { "Wtime",  STATES_WAITING_FOR_TIME, 0 },
     { "Wwkup",  STATES_WAITING_FOR_BSD_WAKEUP, 0 },
diff --git a/cpukit/posix/src/condwaitsupp.c b/cpukit/posix/src/condwaitsupp.c
index 589b5e2..f485b48 100644
--- a/cpukit/posix/src/condwaitsupp.c
+++ b/cpukit/posix/src/condwaitsupp.c
@@ -119,7 +119,8 @@ int _POSIX_Condition_variables_Wait_support(
   if ( !already_timedout ) {
     _Thread_queue_Context_set_thread_state(
       &queue_context,
-      STATES_WAITING_FOR_CONDITION_VARIABLE
+      STATES_THREAD_QUEUE_WITH_IDENTIFIER
+        | STATES_WAITING_FOR_CONDITION_VARIABLE
     );
     _Thread_queue_Context_set_enqueue_callout(
       &queue_context,
diff --git a/cpukit/score/include/rtems/score/coresemimpl.h b/cpukit/score/include/rtems/score/coresemimpl.h
index 20ca30b..6082c3b 100644
--- a/cpukit/score/include/rtems/score/coresemimpl.h
+++ b/cpukit/score/include/rtems/score/coresemimpl.h
@@ -186,7 +186,7 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_semaphore_Seize(
 
   _Thread_queue_Context_set_thread_state(
     queue_context,
-    STATES_WAITING_FOR_SEMAPHORE
+    STATES_THREAD_QUEUE_WITH_IDENTIFIER | STATES_WAITING_FOR_SEMAPHORE
   );
   _Thread_queue_Context_set_do_nothing_enqueue_callout( queue_context );
   _Thread_queue_Enqueue(
diff --git a/cpukit/score/include/rtems/score/statesimpl.h b/cpukit/score/include/rtems/score/statesimpl.h
index 82bcd79..89187b7 100644
--- a/cpukit/score/include/rtems/score/statesimpl.h
+++ b/cpukit/score/include/rtems/score/statesimpl.h
@@ -82,22 +82,26 @@ extern "C" {
 #define STATES_LIFE_IS_CHANGING                0x00800000
 /** This macro corresponds to a task waiting for a join. */
 #define STATES_WAITING_FOR_JOIN                0x01000000
-/** This macro corresponds to a task waiting for a <sys/lock.h> mutex. */
-#define STATES_WAITING_FOR_SYS_LOCK_MUTEX      0x02000000
-/** This macro corresponds to a task waiting for a <sys/lock.h> semaphore. */
-#define STATES_WAITING_FOR_SYS_LOCK_SEMAPHORE  0x04000000
-/** This macro corresponds to a task waiting for a <sys/lock.h> futex. */
-#define STATES_WAITING_FOR_SYS_LOCK_FUTEX      0x08000000
+/** This macro corresponds to a task waiting for a futex. */
+#define STATES_WAITING_FOR_FUTEX               0x08000000
 
 /** This macro corresponds to a task which is in an interruptible
  *  blocking state.
  */
 #define STATES_INTERRUPTIBLE_BY_SIGNAL         0x10000000
-/** This macro corresponds to a task waiting for a <sys/lock.h> condition. */
-#define STATES_WAITING_FOR_SYS_LOCK_CONDITION  0x20000000
+
+/**
+ * @brief This macro corresponds to a task which is blocked on a thread queue
+ * embedded in an object with an identifier.
+ *
+ * This thread state bit is intended to ease debugging and improve system
+ * diagnostics, see _Thread_Wait_get_id().
+ */
+#define STATES_THREAD_QUEUE_WITH_IDENTIFIER    0x80000000
 
 /** This macro corresponds to a task waiting for a local object operation. */
-#define STATES_LOCALLY_BLOCKED ( STATES_WAITING_FOR_SEGMENT            | \
+#define STATES_LOCALLY_BLOCKED ( STATES_THREAD_QUEUE_WITH_IDENTIFIER   | \
+                                 STATES_WAITING_FOR_SEGMENT            | \
                                  STATES_WAITING_FOR_MESSAGE            | \
                                  STATES_WAITING_FOR_SEMAPHORE          | \
                                  STATES_WAITING_FOR_MUTEX              | \
@@ -106,10 +110,7 @@ extern "C" {
                                  STATES_WAITING_FOR_SIGNAL             | \
                                  STATES_WAITING_FOR_BARRIER            | \
                                  STATES_WAITING_FOR_BSD_WAKEUP         | \
-                                 STATES_WAITING_FOR_SYS_LOCK_MUTEX     | \
-                                 STATES_WAITING_FOR_SYS_LOCK_SEMAPHORE | \
-                                 STATES_WAITING_FOR_SYS_LOCK_FUTEX     | \
-                                 STATES_WAITING_FOR_SYS_LOCK_CONDITION | \
+                                 STATES_WAITING_FOR_FUTEX              | \
                                  STATES_WAITING_FOR_RWLOCK             )
 
 /** This macro corresponds to a task waiting which is blocked. */
diff --git a/cpukit/score/src/condition.c b/cpukit/score/src/condition.c
index cf92914..3c3a011 100644
--- a/cpukit/score/src/condition.c
+++ b/cpukit/score/src/condition.c
@@ -111,7 +111,7 @@ static Thread_Control *_Condition_Do_wait(
   executing = _Condition_Queue_acquire_critical( condition, &context->Base );
   _Thread_queue_Context_set_thread_state(
     &context->Base,
-    STATES_WAITING_FOR_SYS_LOCK_CONDITION
+    STATES_WAITING_FOR_CONDITION_VARIABLE
   );
   _Thread_queue_Context_set_enqueue_callout(
     &context->Base,
diff --git a/cpukit/score/src/corebarrierwait.c b/cpukit/score/src/corebarrierwait.c
index f47c039..9cce4cf 100644
--- a/cpukit/score/src/corebarrierwait.c
+++ b/cpukit/score/src/corebarrierwait.c
@@ -46,7 +46,7 @@ Status_Control _CORE_barrier_Seize(
     the_barrier->number_of_waiting_threads = number_of_waiting_threads;
     _Thread_queue_Context_set_thread_state(
       queue_context,
-      STATES_WAITING_FOR_BARRIER
+      STATES_THREAD_QUEUE_WITH_IDENTIFIER | STATES_WAITING_FOR_BARRIER
     );
     _Thread_queue_Context_set_do_nothing_enqueue_callout( queue_context );
     _Thread_queue_Enqueue(
diff --git a/cpukit/score/src/coremsgseize.c b/cpukit/score/src/coremsgseize.c
index b48a3f9..98a7b15 100644
--- a/cpukit/score/src/coremsgseize.c
+++ b/cpukit/score/src/coremsgseize.c
@@ -115,7 +115,7 @@ Status_Control _CORE_message_queue_Seize(
 
   _Thread_queue_Context_set_thread_state(
     queue_context,
-    STATES_WAITING_FOR_MESSAGE
+    STATES_THREAD_QUEUE_WITH_IDENTIFIER | STATES_WAITING_FOR_MESSAGE
   );
   _Thread_queue_Context_set_do_nothing_enqueue_callout( queue_context );
   _Thread_queue_Enqueue(
diff --git a/cpukit/score/src/coremsgsubmit.c b/cpukit/score/src/coremsgsubmit.c
index 3c96101..5a8827a 100644
--- a/cpukit/score/src/coremsgsubmit.c
+++ b/cpukit/score/src/coremsgsubmit.c
@@ -133,7 +133,7 @@ Status_Control _CORE_message_queue_Submit(
 
     _Thread_queue_Context_set_thread_state(
       queue_context,
-      STATES_WAITING_FOR_MESSAGE
+      STATES_THREAD_QUEUE_WITH_IDENTIFIER | STATES_WAITING_FOR_MESSAGE
     );
     _Thread_queue_Context_set_do_nothing_enqueue_callout( queue_context );
     _Thread_queue_Enqueue(
diff --git a/cpukit/score/src/coremutexseize.c b/cpukit/score/src/coremutexseize.c
index 4309380..b00cad9 100644
--- a/cpukit/score/src/coremutexseize.c
+++ b/cpukit/score/src/coremutexseize.c
@@ -34,7 +34,7 @@ Status_Control _CORE_mutex_Seize_slow(
   if ( wait ) {
     _Thread_queue_Context_set_thread_state(
       queue_context,
-      STATES_WAITING_FOR_MUTEX
+      STATES_THREAD_QUEUE_WITH_IDENTIFIER | STATES_WAITING_FOR_MUTEX
     );
     _Thread_queue_Context_set_do_nothing_enqueue_callout( queue_context );
     _Thread_queue_Context_set_deadlock_callout(
diff --git a/cpukit/score/src/corerwlockobtainread.c b/cpukit/score/src/corerwlockobtainread.c
index 6419456..035b1d5 100644
--- a/cpukit/score/src/corerwlockobtainread.c
+++ b/cpukit/score/src/corerwlockobtainread.c
@@ -80,7 +80,7 @@ Status_Control _CORE_RWLock_Seize_for_reading(
 
   _Thread_queue_Context_set_thread_state(
     queue_context,
-   STATES_WAITING_FOR_RWLOCK
+   STATES_THREAD_QUEUE_WITH_IDENTIFIER | STATES_WAITING_FOR_RWLOCK
   );
   _Thread_queue_Context_set_do_nothing_enqueue_callout( queue_context );
   _Thread_queue_Enqueue(
diff --git a/cpukit/score/src/corerwlockobtainwrite.c b/cpukit/score/src/corerwlockobtainwrite.c
index 7f636da..75168fc 100644
--- a/cpukit/score/src/corerwlockobtainwrite.c
+++ b/cpukit/score/src/corerwlockobtainwrite.c
@@ -68,7 +68,7 @@ Status_Control _CORE_RWLock_Seize_for_writing(
 
   _Thread_queue_Context_set_thread_state(
     queue_context,
-    STATES_WAITING_FOR_RWLOCK
+    STATES_THREAD_QUEUE_WITH_IDENTIFIER | STATES_WAITING_FOR_RWLOCK
   );
   _Thread_queue_Context_set_do_nothing_enqueue_callout( queue_context );
   _Thread_queue_Enqueue(
diff --git a/cpukit/score/src/futex.c b/cpukit/score/src/futex.c
index ea4cc89..d09b00b 100644
--- a/cpukit/score/src/futex.c
+++ b/cpukit/score/src/futex.c
@@ -94,7 +94,7 @@ int _Futex_Wait( struct _Futex_Control *_futex, int *uaddr, int val )
   if ( *uaddr == val ) {
     _Thread_queue_Context_set_thread_state(
       &queue_context,
-      STATES_WAITING_FOR_SYS_LOCK_FUTEX
+      STATES_WAITING_FOR_FUTEX
     );
     _Thread_queue_Context_set_do_nothing_enqueue_callout( &queue_context );
     _Thread_queue_Context_set_no_timeout( &queue_context );
diff --git a/cpukit/score/src/mutex.c b/cpukit/score/src/mutex.c
index 30fba4e..ebdedf7 100644
--- a/cpukit/score/src/mutex.c
+++ b/cpukit/score/src/mutex.c
@@ -111,7 +111,7 @@ static void _Mutex_Acquire_slow(
 {
   _Thread_queue_Context_set_thread_state(
     queue_context,
-    STATES_WAITING_FOR_SYS_LOCK_MUTEX
+    STATES_WAITING_FOR_MUTEX
   );
   _Thread_queue_Context_set_do_nothing_enqueue_callout( queue_context );
   _Thread_queue_Context_set_deadlock_callout(
diff --git a/cpukit/score/src/semaphore.c b/cpukit/score/src/semaphore.c
index 7619147..5e64583 100644
--- a/cpukit/score/src/semaphore.c
+++ b/cpukit/score/src/semaphore.c
@@ -105,7 +105,7 @@ void _Semaphore_Wait( struct _Semaphore_Control *_sem )
   } else {
     _Thread_queue_Context_set_thread_state(
       &queue_context,
-      STATES_WAITING_FOR_SYS_LOCK_SEMAPHORE
+      STATES_WAITING_FOR_SEMAPHORE
     );
     _Thread_queue_Context_set_do_nothing_enqueue_callout( &queue_context );
     _Thread_queue_Context_set_no_timeout( &queue_context );
diff --git a/cpukit/score/src/threadwaitgetid.c b/cpukit/score/src/threadwaitgetid.c
index 6c12fd6..9f17250 100644
--- a/cpukit/score/src/threadwaitgetid.c
+++ b/cpukit/score/src/threadwaitgetid.c
@@ -18,14 +18,6 @@
 
 #include <rtems/score/threadimpl.h>
 
-#define THREAD_WAIT_QUEUE_OBJECT_STATES \
-  ( STATES_WAITING_FOR_BARRIER \
-    | STATES_WAITING_FOR_CONDITION_VARIABLE \
-    | STATES_WAITING_FOR_MESSAGE \
-    | STATES_WAITING_FOR_MUTEX \
-    | STATES_WAITING_FOR_RWLOCK \
-    | STATES_WAITING_FOR_SEMAPHORE )
-
 Objects_Id _Thread_Wait_get_id( const Thread_Control *the_thread )
 {
   States_Control current_state;
@@ -38,7 +30,7 @@ Objects_Id _Thread_Wait_get_id( const Thread_Control *the_thread )
   }
 #endif
 
-  if ( ( current_state & THREAD_WAIT_QUEUE_OBJECT_STATES ) != 0 ) {
+  if ( ( current_state & STATES_THREAD_QUEUE_WITH_IDENTIFIER ) != 0 ) {
     const Thread_queue_Object *queue_object;
 
     queue_object = THREAD_QUEUE_QUEUE_TO_OBJECT( the_thread->Wait.queue );



More information about the vc mailing list