diff options
Diffstat (limited to 'cpukit/score/src/threadscheduler.c')
-rw-r--r-- | cpukit/score/src/threadscheduler.c | 89 |
1 files changed, 54 insertions, 35 deletions
diff --git a/cpukit/score/src/threadscheduler.c b/cpukit/score/src/threadscheduler.c index 19459e8dec..6e5812e1ce 100644 --- a/cpukit/score/src/threadscheduler.c +++ b/cpukit/score/src/threadscheduler.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * @@ -8,17 +10,28 @@ */ /* - * Copyright (c) 2016 embedded brains GmbH. All rights reserved. + * Copyright (c) 2016 embedded brains GmbH & Co. KG * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * 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. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H @@ -29,6 +42,36 @@ #include <rtems/score/schedulerimpl.h> #if defined(RTEMS_SMP) +static void _Thread_Scheduler_withdraw_nodes( + Thread_Control *the_thread, + Scheduler_Node *scheduler_node +) +{ + while ( scheduler_node != NULL ) { + Scheduler_Node *next; + const Scheduler_Control *scheduler; + ISR_lock_Context lock_context; + + next = scheduler_node->Thread.Scheduler_node.next; +#if defined(RTEMS_DEBUG) + scheduler_node->Thread.Scheduler_node.next = NULL; +#endif + + scheduler = _Scheduler_Node_get_scheduler( scheduler_node ); + + _Scheduler_Acquire_critical( scheduler, &lock_context ); + ( *scheduler->Operations.withdraw_node )( + scheduler, + the_thread, + scheduler_node, + THREAD_SCHEDULER_READY + ); + _Scheduler_Release_critical( scheduler, &lock_context ); + + scheduler_node = next; + } +} + void _Thread_Scheduler_process_requests( Thread_Control *the_thread ) { ISR_lock_Context lock_context; @@ -39,7 +82,6 @@ void _Thread_Scheduler_process_requests( Thread_Control *the_thread ) scheduler_node = the_thread->Scheduler.requests; if ( scheduler_node != NULL ) { - Scheduler_Node *next; Scheduler_Node *remove; the_thread->Scheduler.requests = NULL; @@ -47,6 +89,7 @@ void _Thread_Scheduler_process_requests( Thread_Control *the_thread ) do { Scheduler_Node_request request; + Scheduler_Node *next; request = scheduler_node->Thread.request; scheduler_node->Thread.request = SCHEDULER_NODE_REQUEST_NOT_PENDING; @@ -77,31 +120,7 @@ void _Thread_Scheduler_process_requests( Thread_Control *the_thread ) } while ( scheduler_node != NULL ); _Thread_Scheduler_release_critical( the_thread, &lock_context ); - - scheduler_node = remove; - - while ( scheduler_node != NULL ) { - const Scheduler_Control *scheduler; - ISR_lock_Context lock_context; - - next = scheduler_node->Thread.Scheduler_node.next; -#if defined(RTEMS_DEBUG) - scheduler_node->Thread.Scheduler_node.next = NULL; -#endif - - scheduler = _Scheduler_Node_get_scheduler( scheduler_node ); - - _Scheduler_Acquire_critical( scheduler, &lock_context ); - ( *scheduler->Operations.withdraw_node )( - scheduler, - the_thread, - scheduler_node, - THREAD_SCHEDULER_READY - ); - _Scheduler_Release_critical( scheduler, &lock_context ); - - scheduler_node = next; - } + _Thread_Scheduler_withdraw_nodes( the_thread, remove ); } else { _Thread_Scheduler_release_critical( the_thread, &lock_context ); } |