source: rtems/cpukit/score/include/rtems/score/schedulersmp.h @ 7e119990

4.115
Last change on this file since 7e119990 was 27783f6, checked in by Sebastian Huber <sebastian.huber@…>, on 07/10/14 at 12:27:42

score: Fix scheduler helping implementation

Do not extract the idle threads from the ready set so that there is
always a thread available for comparison.

  • Property mode set to 100644
File size: 2.7 KB
Line 
1/**
2 * @file
3 *
4 * @brief SMP Scheduler API
5 *
6 * @ingroup ScoreSchedulerSMP
7 */
8
9/*
10 * Copyright (c) 2013-2014 embedded brains GmbH.  All rights reserved.
11 *
12 *  embedded brains GmbH
13 *  Dornierstr. 4
14 *  82178 Puchheim
15 *  Germany
16 *  <rtems@embedded-brains.de>
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.org/license/LICENSE.
21 */
22
23#ifndef _RTEMS_SCORE_SCHEDULERSMP_H
24#define _RTEMS_SCORE_SCHEDULERSMP_H
25
26#include <rtems/score/chain.h>
27#include <rtems/score/scheduler.h>
28
29#ifdef __cplusplus
30extern "C" {
31#endif /* __cplusplus */
32
33/**
34 * @defgroup ScoreSchedulerSMP SMP Scheduler
35 *
36 * @ingroup ScoreScheduler
37 *
38 * @{
39 */
40
41/**
42 * @brief Scheduler context specialization for SMP schedulers.
43 */
44typedef struct {
45  /**
46   * @brief Basic scheduler context.
47   */
48  Scheduler_Context Base;
49
50  /**
51   * @brief The chain of scheduled nodes.
52   */
53  Chain_Control Scheduled;
54
55  /**
56   * @brief Chain of the available idle threads.
57   *
58   * Idle threads are used for the scheduler helping protocol.  It is crucial
59   * that the idle threads preserve their relative order.  This is the case for
60   * this priority based scheduler.
61   */
62  Chain_Control Idle_threads;
63} Scheduler_SMP_Context;
64
65/**
66 * @brief SMP scheduler node states.
67 */
68typedef enum {
69  /**
70   * @brief This scheduler node is blocked.
71   *
72   * A scheduler node is blocked if the corresponding thread is not ready.
73   */
74  SCHEDULER_SMP_NODE_BLOCKED,
75
76  /**
77   * @brief The scheduler node is scheduled.
78   *
79   * A scheduler node is scheduled if the corresponding thread is ready and the
80   * scheduler allocated a processor for it.  A scheduled node is assigned to
81   * exactly one processor.  The count of scheduled nodes in this scheduler
82   * instance equals the processor count owned by the scheduler instance.
83   */
84  SCHEDULER_SMP_NODE_SCHEDULED,
85
86  /**
87   * @brief This scheduler node is ready.
88   *
89   * A scheduler node is ready if the corresponding thread is ready and the
90   * scheduler did not allocate a processor for it.
91   */
92  SCHEDULER_SMP_NODE_READY
93} Scheduler_SMP_Node_state;
94
95/**
96 * @brief Scheduler node specialization for SMP schedulers.
97 */
98typedef struct {
99  /**
100   * @brief Basic scheduler node.
101   */
102  Scheduler_Node Base;
103
104  /**
105   * @brief The state of this node.
106   */
107  Scheduler_SMP_Node_state state;
108
109  /**
110   * @brief The current priority of thread owning this node.
111   */
112  Priority_Control priority;
113} Scheduler_SMP_Node;
114
115void _Scheduler_SMP_Start_idle(
116  const Scheduler_Control *scheduler,
117  Thread_Control *thread,
118  Per_CPU_Control *cpu
119);
120
121/** @} */
122
123#ifdef __cplusplus
124}
125#endif /* __cplusplus */
126
127#endif /* _RTEMS_SCORE_SCHEDULERSMP_H */
Note: See TracBrowser for help on using the repository browser.