summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-08-11 09:47:21 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-08-11 11:13:42 +0200
commita827447b203f41c8e47d2deab4205a663c08649c (patch)
tree3d2ad2b90cf411c5da7abe4c91e68ef7fece3712
parentscore: Add _Thread_queue_Surrender() (diff)
downloadrtems-a827447b203f41c8e47d2deab4205a663c08649c.tar.bz2
score: Dismantle _Thread_queue_Do_extract_locked()
Dismantle _Thread_queue_Do_extract_locked() into re-usable parts like _Thread_queue_MP_set_callout() and _Thread_queue_Make_ready_again(). Use them in _Thread_queue_Surrender() to propare for a new thread queue surrender operation.
-rw-r--r--cpukit/score/src/threadqenqueue.c67
1 files changed, 39 insertions, 28 deletions
diff --git a/cpukit/score/src/threadqenqueue.c b/cpukit/score/src/threadqenqueue.c
index b70af5ddb6..2f6b041789 100644
--- a/cpukit/score/src/threadqenqueue.c
+++ b/cpukit/score/src/threadqenqueue.c
@@ -439,32 +439,31 @@ void _Thread_queue_Enqueue_critical(
_Thread_Dispatch_enable( cpu_self );
}
-bool _Thread_queue_Do_extract_locked(
- Thread_queue_Queue *queue,
- const Thread_queue_Operations *operations,
- Thread_Control *the_thread
#if defined(RTEMS_MULTIPROCESSING)
- ,
- const Thread_queue_Context *queue_context
-#endif
+static bool _Thread_queue_MP_set_callout(
+ Thread_Control *the_thread,
+ const Thread_queue_Context *queue_context
)
{
- bool success;
- bool unblock;
+ Thread_Proxy_control *the_proxy;
+ Thread_queue_MP_callout mp_callout;
-#if defined(RTEMS_MULTIPROCESSING)
- if ( !_Objects_Is_local_id( the_thread->Object.id ) ) {
- Thread_Proxy_control *the_proxy;
- Thread_queue_MP_callout mp_callout;
-
- the_proxy = (Thread_Proxy_control *) the_thread;
- mp_callout = queue_context->mp_callout;
- _Assert( mp_callout != NULL );
- the_proxy->thread_queue_callout = queue_context->mp_callout;
+ if ( _Objects_Is_local_id( the_thread->Object.id ) ) {
+ return false;
}
+
+ the_proxy = (Thread_Proxy_control *) the_thread;
+ mp_callout = queue_context->mp_callout;
+ _Assert( mp_callout != NULL );
+ the_proxy->thread_queue_callout = queue_context->mp_callout;
+ return true;
+}
#endif
- ( *operations->extract )( queue, the_thread );
+static bool _Thread_queue_Make_ready_again( Thread_Control *the_thread )
+{
+ bool success;
+ bool unblock;
/*
* We must update the wait flags under protection of the current thread lock,
@@ -484,10 +483,26 @@ bool _Thread_queue_Do_extract_locked(
}
_Thread_Wait_restore_default( the_thread );
-
return unblock;
}
+bool _Thread_queue_Do_extract_locked(
+ Thread_queue_Queue *queue,
+ const Thread_queue_Operations *operations,
+ Thread_Control *the_thread
+#if defined(RTEMS_MULTIPROCESSING)
+ ,
+ const Thread_queue_Context *queue_context
+#endif
+)
+{
+#if defined(RTEMS_MULTIPROCESSING)
+ _Thread_queue_MP_set_callout( the_thread, queue_context );
+#endif
+ ( *operations->extract )( queue, the_thread );
+ return _Thread_queue_Make_ready_again( the_thread );
+}
+
void _Thread_queue_Unblock_critical(
bool unblock,
Thread_queue_Queue *queue,
@@ -555,7 +570,7 @@ void _Thread_queue_Extract( Thread_Control *the_thread )
queue,
the_thread->Wait.operations,
the_thread,
- &queue_context.Lock_context
+ &queue_context
);
_Thread_queue_Unblock_critical(
unblock,
@@ -585,19 +600,15 @@ void _Thread_queue_Surrender(
queue->owner = new_owner;
#if defined(RTEMS_MULTIPROCESSING)
- if ( _Objects_Is_local_id( new_owner->Object.id ) )
+ if ( !_Thread_queue_MP_set_callout( new_owner, queue_context ) )
#endif
{
++new_owner->resource_count;
_Thread_queue_Boost_priority( queue, new_owner );
}
- unblock = _Thread_queue_Extract_locked(
- queue,
- operations,
- new_owner,
- queue_context
- );
+ ( *operations->extract )( queue, new_owner );
+ unblock = _Thread_queue_Make_ready_again( new_owner );
_Thread_queue_Unblock_critical(
unblock,