diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-08-04 10:16:14 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-08-04 10:17:54 +0200 |
commit | ca783bbe4c38f16bf98205604b364e69dbb35ee6 (patch) | |
tree | 905287fb887d52322eb6c2e92cfb7dd7fd894ad5 | |
parent | score: Fix _Scheduler_EDF_Cancel_job_filter() (diff) | |
download | rtems-ca783bbe4c38f16bf98205604b364e69dbb35ee6.tar.bz2 |
score: Fix _Thread_queue_Path_release()
It is possible that the owner of the terminal link of a thread queue
path waits on a thread queue. However, this thread queue has no owner,
e.g. a thread queue of a message queue.
-rw-r--r-- | cpukit/score/src/threadqenqueue.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/cpukit/score/src/threadqenqueue.c b/cpukit/score/src/threadqenqueue.c index 8f11fa247f..54d3a42d9a 100644 --- a/cpukit/score/src/threadqenqueue.c +++ b/cpukit/score/src/threadqenqueue.c @@ -177,19 +177,24 @@ static void _Thread_queue_Path_release( Thread_queue_Path *path ) if ( head != node ) { Thread_queue_Link *link; - /* The terminal link has an owner which does not wait on a thread queue */ + /* + * The terminal link may have an owner which does not wait on a thread + * queue. + */ + link = THREAD_QUEUE_LINK_OF_PATH_NODE( node ); - _Assert( link->Queue_context.Wait.queue == NULL ); - _Thread_Wait_release_default_critical( - link->owner, - &link->Queue_context.Lock_context - ); + if ( link->Queue_context.Wait.queue == NULL ) { + _Thread_Wait_release_default_critical( + link->owner, + &link->Queue_context.Lock_context + ); - node = _Chain_Previous( node ); + node = _Chain_Previous( node ); #if defined(RTEMS_DEBUG) - _Chain_Set_off_chain( &link->Path_node ); + _Chain_Set_off_chain( &link->Path_node ); #endif + } while ( head != node ) { /* The other links have an owner which waits on a thread queue */ |