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

4.115
Last change on this file since fe6c170c was fe6c170c, checked in by Sebastian Huber <sebastian.huber@…>, on 07/24/13 at 14:19:52

score: Create states implementation header

Move implementation specific parts of states.h and states.inl into new
header file statesimpl.h. The states.h contains now only the
application visible API.

  • Property mode set to 100644
File size: 8.7 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.com/license/LICENSE.
15 */
16
17#if HAVE_CONFIG_H
18#include "config.h"
19#endif
20
21#include <rtems/system.h>
22#include <rtems/rtems/status.h>
23#include <rtems/score/mpci.h>
24#include <rtems/score/mppkt.h>
25#include <rtems/score/object.h>
26#include <rtems/rtems/options.h>
27#include <rtems/rtems/tasksimpl.h>
28#include <rtems/score/thread.h>
29#include <rtems/score/watchdog.h>
30#include <rtems/rtems/support.h>
31#include <rtems/score/statesimpl.h>
32#include <rtems/score/threadimpl.h>
33
34RTEMS_STATIC_ASSERT(
35  sizeof(RTEMS_tasks_MP_Packet) <= MP_PACKET_MINIMUM_PACKET_SIZE,
36  RTEMS_tasks_MP_Packet
37);
38
39/*
40 *  _RTEMS_tasks_MP_Send_process_packet
41 *
42 */
43
44void _RTEMS_tasks_MP_Send_process_packet (
45  RTEMS_tasks_MP_Remote_operations operation,
46  Objects_Id                       task_id,
47  rtems_name                       name
48)
49{
50  RTEMS_tasks_MP_Packet *the_packet;
51
52  switch ( operation ) {
53
54    case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
55    case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
56
57      the_packet                    = _RTEMS_tasks_MP_Get_packet();
58      the_packet->Prefix.the_class  = MP_PACKET_TASKS;
59      the_packet->Prefix.length     = sizeof ( RTEMS_tasks_MP_Packet );
60      the_packet->Prefix.to_convert = sizeof ( RTEMS_tasks_MP_Packet );
61      the_packet->operation         = operation;
62      the_packet->Prefix.id         = task_id;
63      the_packet->name              = name;
64
65      _MPCI_Send_process_packet( MPCI_ALL_NODES, &the_packet->Prefix );
66      break;
67
68    case RTEMS_TASKS_MP_SUSPEND_REQUEST:
69    case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
70    case RTEMS_TASKS_MP_RESUME_REQUEST:
71    case RTEMS_TASKS_MP_RESUME_RESPONSE:
72    case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
73    case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
74    case RTEMS_TASKS_MP_GET_NOTE_REQUEST:
75    case RTEMS_TASKS_MP_GET_NOTE_RESPONSE:
76    case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
77    case RTEMS_TASKS_MP_SET_NOTE_RESPONSE:
78      break;
79  }
80}
81
82/*
83 *  _RTEMS_tasks_MP_Send_request_packet
84 *
85 */
86
87rtems_status_code _RTEMS_tasks_MP_Send_request_packet (
88  RTEMS_tasks_MP_Remote_operations operation,
89  Objects_Id                       task_id,
90  rtems_task_priority                 new_priority,
91  uint32_t                         notepad,
92  uint32_t                         note
93)
94{
95  RTEMS_tasks_MP_Packet *the_packet;
96
97  switch ( operation ) {
98
99    case RTEMS_TASKS_MP_SUSPEND_REQUEST:
100    case RTEMS_TASKS_MP_RESUME_REQUEST:
101    case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
102    case RTEMS_TASKS_MP_GET_NOTE_REQUEST:
103    case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
104
105      the_packet                    = _RTEMS_tasks_MP_Get_packet();
106      the_packet->Prefix.the_class  = MP_PACKET_TASKS;
107      the_packet->Prefix.length     = sizeof ( RTEMS_tasks_MP_Packet );
108      the_packet->Prefix.to_convert = sizeof ( RTEMS_tasks_MP_Packet );
109      the_packet->operation         = operation;
110      the_packet->Prefix.id         = task_id;
111      the_packet->the_priority      = new_priority;
112      the_packet->notepad           = notepad;
113      the_packet->note              = note;
114
115      return _MPCI_Send_request_packet(
116        _Objects_Get_node( task_id ),
117        &the_packet->Prefix,
118        STATES_READY     /* Not used */
119      );
120      break;
121
122    case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
123    case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
124    case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
125    case RTEMS_TASKS_MP_RESUME_RESPONSE:
126    case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
127    case RTEMS_TASKS_MP_GET_NOTE_RESPONSE:
128    case RTEMS_TASKS_MP_SET_NOTE_RESPONSE:
129      break;
130
131  }
132  /*
133   *  The following line is included to satisfy compilers which
134   *  produce warnings when a function does not end with a return.
135   */
136  return RTEMS_SUCCESSFUL;
137}
138
139/*
140 *  _RTEMS_tasks_MP_Send_response_packet
141 *
142 */
143
144void _RTEMS_tasks_MP_Send_response_packet (
145  RTEMS_tasks_MP_Remote_operations  operation,
146  Thread_Control                   *the_thread
147)
148{
149  RTEMS_tasks_MP_Packet *the_packet;
150
151  switch ( operation ) {
152
153    case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
154    case RTEMS_TASKS_MP_RESUME_RESPONSE:
155    case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
156    case RTEMS_TASKS_MP_GET_NOTE_RESPONSE:
157    case RTEMS_TASKS_MP_SET_NOTE_RESPONSE:
158
159      the_packet = (RTEMS_tasks_MP_Packet *) the_thread->receive_packet;
160
161/*
162 *  The packet being returned already contains the class, length, and
163 *  to_convert fields, therefore they are not set in this routine.
164 */
165      the_packet->operation    = operation;
166      the_packet->Prefix.id    = the_packet->Prefix.source_tid;
167
168      _MPCI_Send_response_packet(
169        _Objects_Get_node( the_packet->Prefix.source_tid ),
170        &the_packet->Prefix
171      );
172      break;
173
174    case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
175    case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
176    case RTEMS_TASKS_MP_SUSPEND_REQUEST:
177    case RTEMS_TASKS_MP_RESUME_REQUEST:
178    case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
179    case RTEMS_TASKS_MP_GET_NOTE_REQUEST:
180    case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
181      break;
182
183  }
184}
185
186/*
187 *
188 *  _RTEMS_tasks_MP_Process_packet
189 *
190 */
191
192void _RTEMS_tasks_MP_Process_packet (
193  rtems_packet_prefix  *the_packet_prefix
194)
195{
196  RTEMS_tasks_MP_Packet *the_packet;
197  Thread_Control   *the_thread;
198  bool           ignored;
199
200  the_packet = (RTEMS_tasks_MP_Packet *) the_packet_prefix;
201
202  switch ( the_packet->operation ) {
203
204    case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
205
206      ignored = _Objects_MP_Allocate_and_open(
207                  &_RTEMS_tasks_Information,
208                  the_packet->name,
209                  the_packet->Prefix.id,
210                  true
211                );
212
213      _MPCI_Return_packet( the_packet_prefix );
214      break;
215
216    case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
217
218      _Objects_MP_Close( &_RTEMS_tasks_Information, the_packet->Prefix.id );
219
220      _MPCI_Return_packet( the_packet_prefix );
221      break;
222
223    case RTEMS_TASKS_MP_SUSPEND_REQUEST:
224
225      the_packet->Prefix.return_code = rtems_task_suspend(
226        the_packet->Prefix.id
227      );
228
229      _RTEMS_tasks_MP_Send_response_packet(
230        RTEMS_TASKS_MP_SUSPEND_RESPONSE,
231        _Thread_Executing
232      );
233      break;
234
235    case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
236    case RTEMS_TASKS_MP_RESUME_RESPONSE:
237    case RTEMS_TASKS_MP_SET_NOTE_RESPONSE:
238
239      the_thread = _MPCI_Process_response( the_packet_prefix );
240
241      _MPCI_Return_packet( the_packet_prefix );
242      break;
243
244    case RTEMS_TASKS_MP_RESUME_REQUEST:
245
246      the_packet->Prefix.return_code = rtems_task_resume(
247        the_packet->Prefix.id
248      );
249
250      _RTEMS_tasks_MP_Send_response_packet(
251        RTEMS_TASKS_MP_RESUME_RESPONSE,
252        _Thread_Executing
253      );
254      break;
255
256    case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
257
258      the_packet->Prefix.return_code = rtems_task_set_priority(
259        the_packet->Prefix.id,
260        the_packet->the_priority,
261        &the_packet->the_priority
262      );
263
264      _RTEMS_tasks_MP_Send_response_packet(
265        RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE,
266        _Thread_Executing
267      );
268      break;
269
270    case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
271
272      the_thread = _MPCI_Process_response( the_packet_prefix );
273
274      *(rtems_task_priority *)the_thread->Wait.return_argument =
275                                               the_packet->the_priority;
276
277      _MPCI_Return_packet( the_packet_prefix );
278      break;
279
280    case RTEMS_TASKS_MP_GET_NOTE_REQUEST:
281
282      the_packet->Prefix.return_code = rtems_task_get_note(
283        the_packet->Prefix.id,
284        the_packet->notepad,
285        &the_packet->note
286      );
287
288      _RTEMS_tasks_MP_Send_response_packet(
289        RTEMS_TASKS_MP_GET_NOTE_RESPONSE,
290        _Thread_Executing
291      );
292      break;
293
294    case RTEMS_TASKS_MP_GET_NOTE_RESPONSE:
295
296      the_thread = _MPCI_Process_response( the_packet_prefix );
297
298      *(uint32_t   *)the_thread->Wait.return_argument = the_packet->note;
299
300      _MPCI_Return_packet( the_packet_prefix );
301      break;
302
303    case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
304
305      the_packet->Prefix.return_code = rtems_task_set_note(
306        the_packet->Prefix.id,
307        the_packet->notepad,
308        the_packet->note
309      );
310
311      _RTEMS_tasks_MP_Send_response_packet(
312        RTEMS_TASKS_MP_SET_NOTE_RESPONSE,
313        _Thread_Executing
314      );
315      break;
316  }
317}
318
319/*
320 *  _RTEMS_tasks_MP_Send_object_was_deleted
321 *
322 *  This routine is not neededby the Tasks since a task
323 *  cannot be globally deleted.
324 *
325 */
326
327/*
328 *  _RTEMS_tasks_MP_Send_extract_proxy
329 *
330 *  This routine is not neededby the Tasks since a task
331 *  cannot be globally deleted.
332 *
333 */
334
335/*
336 *  _RTEMS_tasks_MP_Get_packet
337 *
338 */
339
340RTEMS_tasks_MP_Packet *_RTEMS_tasks_MP_Get_packet ( void )
341{
342  return (RTEMS_tasks_MP_Packet *) _MPCI_Get_packet();
343}
344
345/* end of file */
Note: See TracBrowser for help on using the repository browser.