diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-01-31 08:08:24 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-01-31 09:38:07 +0100 |
commit | e366f774a76d3607ad41dc0992e787ce38df980d (patch) | |
tree | 4ba5522aaa87021c60bcaf8d162af9b521b9268c /cpukit/score/src/threadq.c | |
parent | score: Fix _Thread_Initialize() (diff) | |
download | rtems-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.c | 46 |
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 ); + } +} |