source: rtems/cpukit/rtems/src/taskmp.c @ d5154d0f

5
Last change on this file since d5154d0f was d5154d0f, checked in by Aun-Ali Zaidi <admin@…>, on 12/23/15 at 20:44:02

api: Remove deprecated Notepads

Notepads where a feature of RTEMS' tasks that simply functioned in
the same way as POSIX keys or threaded local storage (TLS). They were
introduced well before per task variables, which are also deprecated,
and were barely used in favor of their POSIX alternatives.

In addition to their scarce usage, Notepads took up unnecessary memory.
For each task:

  • 16 32-bit integers were allocated.
  • A total of 64 bytes per task per thread.

This is especially critical in low memory and safety-critical applications.

They are also defined as uint32_t, and therefore are not guaranteed to
hold a pointer.

Lastly, they are not portable solutions for SMP and uniprocessor systems,
like POSIX keys and TLS.

updates #2493.

  • Property mode set to 100644
File size: 7.0 KB
Line 
1/**
2 * @file
3 *
4 * @brief RTEMS Tasks MP Send Process Packet
5 * @ingroup ClassicTaskMP Task MP Support
6 */
7
8/*
9 *  COPYRIGHT (c) 1989-2008.
10 *  On-Line Applications Research Corporation (OAR).
11 *
12 *  The license and distribution terms for this file may be
13 *  found in the file LICENSE in this distribution or at
14 *  http://www.rtems.org/license/LICENSE.
15 */
16
17#if HAVE_CONFIG_H
18#include "config.h"
19#endif
20
21#include <rtems/rtems/tasksimpl.h>
22#include <rtems/rtems/optionsimpl.h>
23#include <rtems/score/statesimpl.h>
24#include <rtems/score/threadimpl.h>
25#include <rtems/score/threadqimpl.h>
26
27RTEMS_STATIC_ASSERT(
28  sizeof(RTEMS_tasks_MP_Packet) <= MP_PACKET_MINIMUM_PACKET_SIZE,
29  RTEMS_tasks_MP_Packet
30);
31
32/*
33 *  _RTEMS_tasks_MP_Send_process_packet
34 *
35 */
36
37void _RTEMS_tasks_MP_Send_process_packet (
38  RTEMS_tasks_MP_Remote_operations operation,
39  Objects_Id                       task_id,
40  rtems_name                       name
41)
42{
43  RTEMS_tasks_MP_Packet *the_packet;
44
45  switch ( operation ) {
46
47    case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
48    case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
49
50      the_packet                    = _RTEMS_tasks_MP_Get_packet();
51      the_packet->Prefix.the_class  = MP_PACKET_TASKS;
52      the_packet->Prefix.length     = sizeof ( RTEMS_tasks_MP_Packet );
53      the_packet->Prefix.to_convert = sizeof ( RTEMS_tasks_MP_Packet );
54      the_packet->operation         = operation;
55      the_packet->Prefix.id         = task_id;
56      the_packet->name              = name;
57
58      _MPCI_Send_process_packet( MPCI_ALL_NODES, &the_packet->Prefix );
59      break;
60
61    case RTEMS_TASKS_MP_SUSPEND_REQUEST:
62    case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
63    case RTEMS_TASKS_MP_RESUME_REQUEST:
64    case RTEMS_TASKS_MP_RESUME_RESPONSE:
65    case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
66    case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
67      break;
68  }
69}
70
71/*
72 *  _RTEMS_tasks_MP_Send_request_packet
73 *
74 */
75
76rtems_status_code _RTEMS_tasks_MP_Send_request_packet (
77  RTEMS_tasks_MP_Remote_operations operation,
78  Objects_Id                       task_id,
79  rtems_task_priority              new_priority
80)
81{
82  RTEMS_tasks_MP_Packet *the_packet;
83
84  switch ( operation ) {
85
86    case RTEMS_TASKS_MP_SUSPEND_REQUEST:
87    case RTEMS_TASKS_MP_RESUME_REQUEST:
88    case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
89
90      the_packet                    = _RTEMS_tasks_MP_Get_packet();
91      the_packet->Prefix.the_class  = MP_PACKET_TASKS;
92      the_packet->Prefix.length     = sizeof ( RTEMS_tasks_MP_Packet );
93      the_packet->Prefix.to_convert = sizeof ( RTEMS_tasks_MP_Packet );
94      the_packet->operation         = operation;
95      the_packet->Prefix.id         = task_id;
96      the_packet->the_priority      = new_priority;
97
98      return _MPCI_Send_request_packet(
99        _Objects_Get_node( task_id ),
100        &the_packet->Prefix,
101        STATES_READY,    /* Not used */
102        RTEMS_TIMEOUT
103      );
104      break;
105
106    case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
107    case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
108    case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
109    case RTEMS_TASKS_MP_RESUME_RESPONSE:
110    case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
111      break;
112
113  }
114  /*
115   *  The following line is included to satisfy compilers which
116   *  produce warnings when a function does not end with a return.
117   */
118  return RTEMS_SUCCESSFUL;
119}
120
121/*
122 *  _RTEMS_tasks_MP_Send_response_packet
123 *
124 */
125
126void _RTEMS_tasks_MP_Send_response_packet (
127  RTEMS_tasks_MP_Remote_operations  operation,
128  Thread_Control                   *the_thread
129)
130{
131  RTEMS_tasks_MP_Packet *the_packet;
132
133  switch ( operation ) {
134
135    case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
136    case RTEMS_TASKS_MP_RESUME_RESPONSE:
137    case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
138
139      the_packet = (RTEMS_tasks_MP_Packet *) the_thread->receive_packet;
140
141/*
142 *  The packet being returned already contains the class, length, and
143 *  to_convert fields, therefore they are not set in this routine.
144 */
145      the_packet->operation    = operation;
146      the_packet->Prefix.id    = the_packet->Prefix.source_tid;
147
148      _MPCI_Send_response_packet(
149        _Objects_Get_node( the_packet->Prefix.source_tid ),
150        &the_packet->Prefix
151      );
152      break;
153
154    case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
155    case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
156    case RTEMS_TASKS_MP_SUSPEND_REQUEST:
157    case RTEMS_TASKS_MP_RESUME_REQUEST:
158    case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
159      break;
160
161  }
162}
163
164/*
165 *
166 *  _RTEMS_tasks_MP_Process_packet
167 *
168 */
169
170void _RTEMS_tasks_MP_Process_packet (
171  rtems_packet_prefix  *the_packet_prefix
172)
173{
174  RTEMS_tasks_MP_Packet *the_packet;
175  Thread_Control   *the_thread;
176  bool           ignored;
177
178  the_packet = (RTEMS_tasks_MP_Packet *) the_packet_prefix;
179
180  switch ( the_packet->operation ) {
181
182    case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
183
184      ignored = _Objects_MP_Allocate_and_open(
185                  &_RTEMS_tasks_Information.Objects,
186                  the_packet->name,
187                  the_packet->Prefix.id,
188                  true
189                );
190
191      _MPCI_Return_packet( the_packet_prefix );
192      break;
193
194    case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
195
196      _Objects_MP_Close(
197        &_RTEMS_tasks_Information.Objects,
198        the_packet->Prefix.id
199      );
200
201      _MPCI_Return_packet( the_packet_prefix );
202      break;
203
204    case RTEMS_TASKS_MP_SUSPEND_REQUEST:
205
206      the_packet->Prefix.return_code = rtems_task_suspend(
207        the_packet->Prefix.id
208      );
209
210      _RTEMS_tasks_MP_Send_response_packet(
211        RTEMS_TASKS_MP_SUSPEND_RESPONSE,
212        _Thread_Executing
213      );
214      break;
215
216    case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
217    case RTEMS_TASKS_MP_RESUME_RESPONSE:
218
219      the_thread = _MPCI_Process_response( the_packet_prefix );
220
221      _MPCI_Return_packet( the_packet_prefix );
222      break;
223
224    case RTEMS_TASKS_MP_RESUME_REQUEST:
225
226      the_packet->Prefix.return_code = rtems_task_resume(
227        the_packet->Prefix.id
228      );
229
230      _RTEMS_tasks_MP_Send_response_packet(
231        RTEMS_TASKS_MP_RESUME_RESPONSE,
232        _Thread_Executing
233      );
234      break;
235
236    case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
237
238      the_packet->Prefix.return_code = rtems_task_set_priority(
239        the_packet->Prefix.id,
240        the_packet->the_priority,
241        &the_packet->the_priority
242      );
243
244      _RTEMS_tasks_MP_Send_response_packet(
245        RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE,
246        _Thread_Executing
247      );
248      break;
249
250    case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
251
252      the_thread = _MPCI_Process_response( the_packet_prefix );
253
254      *(rtems_task_priority *)the_thread->Wait.return_argument =
255                                               the_packet->the_priority;
256
257      _MPCI_Return_packet( the_packet_prefix );
258      break;
259  }
260}
261
262/*
263 *  _RTEMS_tasks_MP_Send_object_was_deleted
264 *
265 *  This routine is not neededby the Tasks since a task
266 *  cannot be globally deleted.
267 *
268 */
269
270/*
271 *  _RTEMS_tasks_MP_Send_extract_proxy
272 *
273 *  This routine is not neededby the Tasks since a task
274 *  cannot be globally deleted.
275 *
276 */
277
278/*
279 *  _RTEMS_tasks_MP_Get_packet
280 *
281 */
282
283RTEMS_tasks_MP_Packet *_RTEMS_tasks_MP_Get_packet ( void )
284{
285  return (RTEMS_tasks_MP_Packet *) _MPCI_Get_packet();
286}
287
288/* end of file */
Note: See TracBrowser for help on using the repository browser.