summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-08-04 10:16:14 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-08-04 10:17:54 +0200
commitca783bbe4c38f16bf98205604b364e69dbb35ee6 (patch)
tree905287fb887d52322eb6c2e92cfb7dd7fd894ad5
parentscore: Fix _Scheduler_EDF_Cancel_job_filter() (diff)
downloadrtems-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.c21
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 */