summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include/rtems/score/mrsp.h
blob: 5af3a06901208b311a566a1ffa05e3dfd4c8581d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
 * Copyright (c) 2014, 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.
 */

#ifndef _RTEMS_SCORE_MRSP_H
#define _RTEMS_SCORE_MRSP_H

#include <rtems/score/cpuopts.h>

#if defined(RTEMS_SMP)

#include <rtems/score/chain.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/thread.h>
#include <rtems/score/threadq.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup ScoreMRSP Multiprocessor Resource Sharing Protocol Handler
 *
 * @ingroup Score
 *
 * @brief Multiprocessor Resource Sharing Protocol (MrsP).
 *
 * The Multiprocessor Resource Sharing Protocol (MrsP) is defined in A.  Burns
 * and A.J.  Wellings, A Schedulability Compatible Multiprocessor Resource
 * Sharing Protocol - MrsP, Proceedings of the 25th Euromicro Conference on
 * Real-Time Systems (ECRTS 2013), July 2013.  It is a generalization of the
 * Priority Ceiling Protocol to SMP systems.  Each MrsP semaphore uses a
 * ceiling priority per scheduler instance.  A task obtaining or owning a MrsP
 * semaphore will execute with the ceiling priority for its scheduler instance
 * as specified by the MrsP semaphore object.  Tasks waiting to get ownership
 * of a MrsP semaphore will not relinquish the processor voluntarily.  In case
 * the owner of a MrsP semaphore gets preempted it can ask all tasks waiting
 * for this semaphore to help out and temporarily borrow the right to execute
 * on one of their assigned processors.
 *
 * @{
 */

typedef struct MRSP_Control MRSP_Control;

/**
 * @brief MrsP rival.
 *
 * The rivals are used by threads waiting for resource ownership.  They are
 * registered in the MrsP control block.
 */
typedef struct {
  /**
   * @brief The node for registration in the MrsP rival chain.
   *
   * The chain operations are protected by the MrsP control lock.
   *
   * @see MRSP_Control::Rivals.
   */
  Chain_Node Node;

  /**
   * @brief The corresponding MrsP control block.
   */
  MRSP_Control *resource;

  /**
   * @brief Identification of the rival thread.
   */
  Thread_Control *thread;

  /**
   * @brief The ceiling priority used by the rival thread.
   */
  Priority_Node Ceiling_priority;

  /**
   * @brief The initial help state of the thread at the begin of the resource
   * obtain sequence.
   *
   * Used to restore this state after a timeout.
   */
  Scheduler_Help_state initial_help_state;

  /**
   * @brief The rival status.
   *
   * Initially the status is set to MRSP_WAIT_FOR_OWNERSHIP.  The rival will
   * busy wait until a status change happens.  This can be STATUS_SUCCESSFUL or
   * STATUS_TIMEOUT.  State changes are protected by the MrsP control lock.
   */
  volatile int status;

  /**
   * @brief Watchdog for timeouts.
   */
  Watchdog_Control Watchdog;
} MRSP_Rival;

/**
 * @brief MrsP control block.
 */
struct MRSP_Control {
  /**
   * @brief Lock to protect the resource dependency tree.
   *
   * This is a thread queue since this simplifies the Classic semaphore
   * implementation.  Only the lock part of the thread queue is used.
   */
  Thread_queue_Control Wait_queue;

  /**
   * @brief Basic resource control.
   */
  Resource_Control Resource;

  /**
   * @brief A chain of MrsP rivals waiting for resource ownership.
   *
   * @see MRSP_Rival::Node.
   */
  Chain_Control Rivals;

  /**
   * @brief The ceiling priority used by the owner thread.
   */
  Priority_Node Ceiling_priority;

  /**
   * @brief One ceiling priority per scheduler instance.
   */
  Priority_Control *ceiling_priorities;
};

/** @} */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* RTEMS_SMP */

#endif /* _RTEMS_SCORE_MRSP_H */