summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-24 13:15:47 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-25 12:43:53 +0200
commit0e9d5b69cccac14f02f8370e1f75d3ac714a4350 (patch)
treed2bcd5c3b216ba018d8b11e58c8170014fc83f38 /cpukit/score/src
parentconfdefs.h: Fix heap alloc size estimate (diff)
downloadrtems-0e9d5b69cccac14f02f8370e1f75d3ac714a4350.tar.bz2
mpci: Fix thread queue flush method
We must call the MP callout for proxies if we unblock them after a thread queue extraction. This was missing in _Thread_queue_Flush_critical(). Move thread remove timer and unblock code to new function _Thread_Remove_timer_and_unblock().
Diffstat (limited to '')
-rw-r--r--cpukit/score/src/coremutexsurrender.c2
-rw-r--r--cpukit/score/src/mutex.c2
-rw-r--r--cpukit/score/src/threadqenqueue.c67
-rw-r--r--cpukit/score/src/threadqflush.c3
4 files changed, 26 insertions, 48 deletions
diff --git a/cpukit/score/src/coremutexsurrender.c b/cpukit/score/src/coremutexsurrender.c
index cf6f0968b6..6fcbc434f7 100644
--- a/cpukit/score/src/coremutexsurrender.c
+++ b/cpukit/score/src/coremutexsurrender.c
@@ -157,8 +157,6 @@ CORE_mutex_Status _CORE_mutex_Do_surrender(
unblock,
&the_mutex->Wait_queue.Queue,
the_thread,
- mp_callout,
- mp_id,
lock_context
);
} else {
diff --git a/cpukit/score/src/mutex.c b/cpukit/score/src/mutex.c
index 5588926973..b28964de2e 100644
--- a/cpukit/score/src/mutex.c
+++ b/cpukit/score/src/mutex.c
@@ -154,8 +154,6 @@ static void _Mutex_Release_slow(
unblock,
&mutex->Queue.Queue,
first,
- NULL,
- 0,
lock_context
);
} else {
diff --git a/cpukit/score/src/threadqenqueue.c b/cpukit/score/src/threadqenqueue.c
index ce720088c8..84de11e18d 100644
--- a/cpukit/score/src/threadqenqueue.c
+++ b/cpukit/score/src/threadqenqueue.c
@@ -87,25 +87,7 @@ void _Thread_queue_Enqueue_critical(
THREAD_QUEUE_BLOCKED
);
if ( !success ) {
- _Thread_Timer_remove( the_thread );
-
-#if defined(RTEMS_MULTIPROCESSING)
- if ( _Objects_Is_local_id( the_thread->Object.id ) ) {
- _Thread_Unblock( the_thread );
- } else {
- Thread_Proxy_control *the_proxy;
-
- the_proxy = (Thread_Proxy_control *) the_thread;
- ( *the_proxy->thread_queue_callout )(
- the_thread,
- the_proxy->thread_queue_id
- );
-
- _Thread_MP_Free_proxy( the_thread );
- }
-#else
- _Thread_Unblock( the_thread );
-#endif
+ _Thread_Remove_timer_and_unblock( the_thread, queue );
}
_Thread_Dispatch_enable( cpu_self );
@@ -163,15 +145,11 @@ bool _Thread_queue_Do_extract_locked(
return unblock;
}
-void _Thread_queue_Do_unblock_critical(
- bool unblock,
- Thread_queue_Queue *queue,
- Thread_Control *the_thread,
-#if defined(RTEMS_MULTIPROCESSING)
- Thread_queue_MP_callout mp_callout,
- Objects_Id mp_id,
-#endif
- ISR_lock_Context *lock_context
+void _Thread_queue_Unblock_critical(
+ bool unblock,
+ Thread_queue_Queue *queue,
+ Thread_Control *the_thread,
+ ISR_lock_Context *lock_context
)
{
if ( unblock ) {
@@ -180,18 +158,7 @@ void _Thread_queue_Do_unblock_critical(
cpu_self = _Thread_Dispatch_disable_critical( lock_context );
_Thread_queue_Queue_release( queue, lock_context );
- _Thread_Timer_remove( the_thread );
-
-#if defined(RTEMS_MULTIPROCESSING)
- if ( _Objects_Is_local_id( the_thread->Object.id ) ) {
- _Thread_Unblock( the_thread );
- } else {
- ( *mp_callout )( the_thread, mp_id );
- _Thread_MP_Free_proxy( the_thread );
- }
-#else
- _Thread_Unblock( the_thread );
-#endif
+ _Thread_Remove_timer_and_unblock( the_thread, queue );
_Thread_Dispatch_enable( cpu_self );
} else {
@@ -224,8 +191,6 @@ void _Thread_queue_Do_extract_critical(
unblock,
queue,
the_thread,
- mp_callout,
- mp_id,
lock_context
);
}
@@ -290,3 +255,21 @@ Thread_Control *_Thread_queue_Do_dequeue(
return the_thread;
}
+
+#if defined(RTEMS_MULTIPROCESSING)
+void _Thread_queue_Unblock_proxy(
+ Thread_queue_Queue *queue,
+ Thread_Control *the_thread
+)
+{
+ Thread_Proxy_control *the_proxy;
+
+ the_proxy = (Thread_Proxy_control *) the_thread;
+ ( *the_proxy->thread_queue_callout )(
+ the_thread,
+ the_proxy->thread_queue_id
+ );
+
+ _Thread_MP_Free_proxy( the_thread );
+}
+#endif
diff --git a/cpukit/score/src/threadqflush.c b/cpukit/score/src/threadqflush.c
index 9e54e1f370..a67f354273 100644
--- a/cpukit/score/src/threadqflush.c
+++ b/cpukit/score/src/threadqflush.c
@@ -95,8 +95,7 @@ size_t _Thread_queue_Do_flush_critical(
next = _Chain_Next( node );
the_thread = THREAD_CHAIN_NODE_TO_THREAD( node );
- _Thread_Timer_remove( the_thread );
- _Thread_Unblock( the_thread );
+ _Thread_Remove_timer_and_unblock( the_thread, queue );
node = next;
} while ( node != tail );