diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-09-23 14:54:04 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-11-02 10:05:42 +0100 |
commit | 240347331d45b0d424077a8b74ee02efc651e003 (patch) | |
tree | 55b899af8ca3ed9a1a952b8003f9b9c4036d80ad /cpukit/score/src/threadscheduler.c | |
parent | score: Add scheduler node requests (diff) | |
download | rtems-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.c | 84 |
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 |