summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/threadscheduler.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-09-23 14:54:04 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-11-02 10:05:42 +0100
commit240347331d45b0d424077a8b74ee02efc651e003 (patch)
tree55b899af8ca3ed9a1a952b8003f9b9c4036d80ad /cpukit/score/src/threadscheduler.c
parentscore: Add scheduler node requests (diff)
downloadrtems-240347331d45b0d424077a8b74ee02efc651e003.tar.bz2
score: Add _Thread_Scheduler_process_requests()
Update #2556.
Diffstat (limited to 'cpukit/score/src/threadscheduler.c')
-rw-r--r--cpukit/score/src/threadscheduler.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/cpukit/score/src/threadscheduler.c b/cpukit/score/src/threadscheduler.c
new file mode 100644
index 0000000000..b73598e750
--- /dev/null
+++ b/cpukit/score/src/threadscheduler.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/threadimpl.h>
+#include <rtems/score/schedulerimpl.h>
+
+#if defined(RTEMS_SMP)
+void _Thread_Scheduler_process_requests( Thread_Control *the_thread )
+{
+ ISR_lock_Context lock_context;
+ Scheduler_Node *scheduler_node;
+
+ _Thread_Scheduler_acquire_critical( the_thread, &lock_context );
+
+ scheduler_node = the_thread->Scheduler.requests;
+
+ if ( scheduler_node != NULL ) {
+ Scheduler_Node *next;
+ Scheduler_Node *remove;
+
+ the_thread->Scheduler.requests = NULL;
+ remove = NULL;
+
+ do {
+ Scheduler_Node_request request;
+
+ request = scheduler_node->Thread.request;
+ scheduler_node->Thread.request = SCHEDULER_NODE_REQUEST_NOT_PENDING;
+
+ next = scheduler_node->Thread.next_request;
+#if defined(RTEMS_DEBUG)
+ scheduler_node->Thread.next_request = NULL;
+#endif
+
+ if ( request == SCHEDULER_NODE_REQUEST_ADD ) {
+ _Chain_Append_unprotected(
+ &the_thread->Scheduler.Scheduler_nodes,
+ &scheduler_node->Thread.Scheduler_node.Chain
+ );
+ } else if ( request == SCHEDULER_NODE_REQUEST_REMOVE ) {
+ _Chain_Extract_unprotected(
+ &scheduler_node->Thread.Scheduler_node.Chain
+ );
+ scheduler_node->Thread.Scheduler_node.next = remove;
+ remove = scheduler_node;
+ } else {
+ _Assert( request == SCHEDULER_NODE_REQUEST_NOTHING );
+ }
+
+ scheduler_node = next;
+ } while ( scheduler_node != NULL );
+
+ _Thread_Scheduler_release_critical( the_thread, &lock_context );
+
+ scheduler_node = remove;
+
+ while ( scheduler_node != NULL ) {
+ next = scheduler_node->Thread.Scheduler_node.next;
+#if defined(RTEMS_DEBUG)
+ scheduler_node->Thread.Scheduler_node.next = NULL;
+#endif
+
+ scheduler_node = next;
+ }
+ } else {
+ _Thread_Scheduler_release_critical( the_thread, &lock_context );
+ }
+}
+#endif