source: rtems/cpukit/rtems/src/taskmp.c @ 4c90eb4

4.115
Last change on this file since 4c90eb4 was 4c90eb4, checked in by Mathew Kallada <matkallada@…>, on 12/08/12 at 13:48:37

misc rtems: Clean up Doxygen GCI Task #8

http://www.google-melange.com/gci/task/view/google/gci2012/8024203

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