source: rtems/cpukit/score/src/threadscheduler.c @ 2548d14

5
Last change on this file since 2548d14 was bbfbfc8, checked in by Sebastian Huber <sebastian.huber@…>, on 02/03/17 at 07:57:18

score: Move _Thread_Scheduler_ask_for_help()

Move _Thread_Scheduler_ask_for_help(), rename it to
_Thread_Ask_for_help() and make it static.

  • Property mode set to 100644
File size: 2.7 KB
Line 
1/*
2 * Copyright (c) 2016 embedded brains GmbH.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Dornierstr. 4
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.org/license/LICENSE.
13 */
14
15#if HAVE_CONFIG_H
16#include "config.h"
17#endif
18
19#include <rtems/score/threadimpl.h>
20#include <rtems/score/schedulerimpl.h>
21
22#if defined(RTEMS_SMP)
23void _Thread_Scheduler_process_requests( Thread_Control *the_thread )
24{
25  ISR_lock_Context  lock_context;
26  Scheduler_Node   *scheduler_node;
27
28  _Thread_Scheduler_acquire_critical( the_thread, &lock_context );
29
30  scheduler_node = the_thread->Scheduler.requests;
31
32  if ( scheduler_node != NULL ) {
33    Scheduler_Node *next;
34    Scheduler_Node *remove;
35
36    the_thread->Scheduler.requests = NULL;
37    remove = NULL;
38
39    do {
40      Scheduler_Node_request request;
41
42      request = scheduler_node->Thread.request;
43      scheduler_node->Thread.request = SCHEDULER_NODE_REQUEST_NOT_PENDING;
44
45      next = scheduler_node->Thread.next_request;
46#if defined(RTEMS_DEBUG)
47      scheduler_node->Thread.next_request = NULL;
48#endif
49
50      if ( request == SCHEDULER_NODE_REQUEST_ADD ) {
51        ++the_thread->Scheduler.helping_nodes;
52        _Chain_Append_unprotected(
53          &the_thread->Scheduler.Scheduler_nodes,
54          &scheduler_node->Thread.Scheduler_node.Chain
55        );
56      } else if ( request == SCHEDULER_NODE_REQUEST_REMOVE ) {
57        --the_thread->Scheduler.helping_nodes;
58        _Chain_Extract_unprotected(
59          &scheduler_node->Thread.Scheduler_node.Chain
60        );
61        scheduler_node->Thread.Scheduler_node.next = remove;
62        remove = scheduler_node;
63      } else {
64        _Assert( request == SCHEDULER_NODE_REQUEST_NOTHING );
65      }
66
67      scheduler_node = next;
68    } while ( scheduler_node != NULL );
69
70    _Thread_Scheduler_release_critical( the_thread, &lock_context );
71
72    scheduler_node = remove;
73
74    while ( scheduler_node != NULL ) {
75      const Scheduler_Control *scheduler;
76      ISR_lock_Context         lock_context;
77
78      next = scheduler_node->Thread.Scheduler_node.next;
79#if defined(RTEMS_DEBUG)
80      scheduler_node->Thread.Scheduler_node.next = NULL;
81#endif
82
83      scheduler = _Scheduler_Node_get_scheduler( scheduler_node );
84
85      _Scheduler_Acquire_critical( scheduler, &lock_context );
86      ( *scheduler->Operations.withdraw_node )(
87        scheduler,
88        the_thread,
89        scheduler_node,
90        THREAD_SCHEDULER_READY
91      );
92      _Scheduler_Release_critical( scheduler, &lock_context );
93
94      scheduler_node = next;
95    }
96  } else {
97    _Thread_Scheduler_release_critical( the_thread, &lock_context );
98  }
99}
100#endif
Note: See TracBrowser for help on using the repository browser.