summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/threadq.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-01-31 08:08:24 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-01-31 09:38:07 +0100
commite366f774a76d3607ad41dc0992e787ce38df980d (patch)
tree4ba5522aaa87021c60bcaf8d162af9b521b9268c /cpukit/score/src/threadq.c
parentscore: Fix _Thread_Initialize() (diff)
downloadrtems-e366f774a76d3607ad41dc0992e787ce38df980d.tar.bz2
score: Add _Thread_queue_Object_name
Add the special thread queue name _Thread_queue_Object_name to mark thread queues embedded in an object with identifier. Using the special thread state STATES_THREAD_QUEUE_WITH_IDENTIFIER is not reliable for this purpose since the thread wait information and thread state are protected by different SMP locks in separate critical sections. Remove STATES_THREAD_QUEUE_WITH_IDENTIFIER. Add and use _Thread_queue_Object_initialize(). Update #2858.
Diffstat (limited to 'cpukit/score/src/threadq.c')
-rw-r--r--cpukit/score/src/threadq.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/cpukit/score/src/threadq.c b/cpukit/score/src/threadq.c
index baed6325da..850ec6f07b 100644
--- a/cpukit/score/src/threadq.c
+++ b/cpukit/score/src/threadq.c
@@ -130,14 +130,24 @@ void _Thread_queue_Release(
}
#endif
-void _Thread_queue_Initialize( Thread_queue_Control *the_thread_queue )
+const char _Thread_queue_Object_name[] = { '\0' };
+
+void _Thread_queue_Initialize(
+ Thread_queue_Control *the_thread_queue,
+ const char *name
+)
{
- _Thread_queue_Queue_initialize( &the_thread_queue->Queue );
+ _Thread_queue_Queue_initialize( &the_thread_queue->Queue, name );
#if defined(RTEMS_SMP)
_SMP_lock_Stats_initialize( &the_thread_queue->Lock_stats, "Thread Queue" );
#endif
}
+void _Thread_queue_Object_initialize( Thread_queue_Control *the_thread_queue )
+{
+ _Thread_queue_Initialize( the_thread_queue, _Thread_queue_Object_name );
+}
+
#if defined(RTEMS_MULTIPROCESSING)
void _Thread_queue_MP_callout_do_nothing(
Thread_Control *the_proxy,
@@ -147,3 +157,35 @@ void _Thread_queue_MP_callout_do_nothing(
/* Do nothing */
}
#endif
+
+size_t _Thread_queue_Queue_get_name_and_id(
+ const Thread_queue_Queue *queue,
+ char *buffer,
+ size_t buffer_size,
+ Objects_Id *id
+)
+{
+ const char *name;
+
+ name = queue->name;
+
+ if ( name == _Thread_queue_Object_name ) {
+ const Thread_queue_Object *queue_object;
+
+ queue_object = THREAD_QUEUE_QUEUE_TO_OBJECT( queue );
+ *id = queue_object->Object.id;
+ return _Objects_Name_to_string(
+ queue_object->Object.name,
+ false,
+ buffer,
+ buffer_size
+ );
+ } else {
+ if ( name == NULL ) {
+ name = _Thread_queue_Object_name;
+ }
+
+ *id = 0;
+ return strlcpy( buffer, name, buffer_size );
+ }
+}