source: rtems/cpukit/rtems/src/taskmp.c @ 2bafb960

4.115
Last change on this file since 2bafb960 was 2bafb960, checked in by Daniel Ramirez <javamonn@…>, on 12/21/13 at 03:44:12

rtems: classic api to/from core priority conversions

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