source: rtems/cpukit/rtems/src/partmp.c @ 277cc95

4.104.114.84.95
Last change on this file since 277cc95 was 277cc95, checked in by Joel Sherrill <joel.sherrill@…>, on 09/04/03 at 18:54:32

2003-09-04 Joel Sherrill <joel@…>

  • include/rtems.h, include/rtems/rtems/asr.h, include/rtems/rtems/attr.h, include/rtems/rtems/cache.h, include/rtems/rtems/clock.h, include/rtems/rtems/config.h, include/rtems/rtems/dpmem.h, include/rtems/rtems/event.h, include/rtems/rtems/eventmp.h, include/rtems/rtems/eventset.h, include/rtems/rtems/intr.h, include/rtems/rtems/message.h, include/rtems/rtems/modes.h, include/rtems/rtems/mp.h, include/rtems/rtems/msgmp.h, include/rtems/rtems/options.h, include/rtems/rtems/part.h, include/rtems/rtems/partmp.h, include/rtems/rtems/ratemon.h, include/rtems/rtems/region.h, include/rtems/rtems/regionmp.h, include/rtems/rtems/rtemsapi.h, include/rtems/rtems/sem.h, include/rtems/rtems/semmp.h, include/rtems/rtems/signal.h, include/rtems/rtems/signalmp.h, include/rtems/rtems/status.h, include/rtems/rtems/support.h, include/rtems/rtems/taskmp.h, include/rtems/rtems/tasks.h, include/rtems/rtems/timer.h, include/rtems/rtems/types.h, inline/rtems/rtems/asr.inl, inline/rtems/rtems/attr.inl, inline/rtems/rtems/dpmem.inl, inline/rtems/rtems/event.inl, inline/rtems/rtems/eventset.inl, inline/rtems/rtems/message.inl, inline/rtems/rtems/modes.inl, inline/rtems/rtems/options.inl, inline/rtems/rtems/part.inl, inline/rtems/rtems/ratemon.inl, inline/rtems/rtems/region.inl, inline/rtems/rtems/sem.inl, inline/rtems/rtems/status.inl, inline/rtems/rtems/support.inl, inline/rtems/rtems/tasks.inl, inline/rtems/rtems/timer.inl, macros/rtems/rtems/asr.inl, macros/rtems/rtems/attr.inl, macros/rtems/rtems/dpmem.inl, macros/rtems/rtems/event.inl, macros/rtems/rtems/eventset.inl, macros/rtems/rtems/message.inl, macros/rtems/rtems/modes.inl, macros/rtems/rtems/options.inl, macros/rtems/rtems/part.inl, macros/rtems/rtems/ratemon.inl, macros/rtems/rtems/region.inl, macros/rtems/rtems/sem.inl, macros/rtems/rtems/status.inl, macros/rtems/rtems/support.inl, macros/rtems/rtems/tasks.inl, macros/rtems/rtems/timer.inl, src/attr.c, src/clockget.c, src/clockset.c, src/clocktick.c, src/dpmem.c, src/dpmemcreate.c, src/dpmemdelete.c, src/dpmemexternal2internal.c, src/dpmemident.c, src/dpmeminternal2external.c, src/event.c, src/eventmp.c, src/eventreceive.c, src/eventseize.c, src/eventsend.c, src/eventsurrender.c, src/eventtimeout.c, src/intr.c, src/intrbody.c, src/intrcatch.c, src/mp.c, src/msg.c, src/msgmp.c, src/msgqallocate.c, src/msgqbroadcast.c, src/msgqcreate.c, src/msgqdelete.c, src/msgqflush.c, src/msgqgetnumberpending.c, src/msgqident.c, src/msgqreceive.c, src/msgqsend.c, src/msgqsubmit.c, src/msgqtranslatereturncode.c, src/msgqurgent.c, src/part.c, src/partcreate.c, src/partdelete.c, src/partgetbuffer.c, src/partident.c, src/partmp.c, src/partreturnbuffer.c, src/ratemon.c, src/ratemoncancel.c, src/ratemoncreate.c, src/ratemondelete.c, src/ratemongetstatus.c, src/ratemonident.c, src/ratemonperiod.c, src/ratemontimeout.c, src/region.c, src/regioncreate.c, src/regiondelete.c, src/regionextend.c, src/regiongetinfo.c, src/regiongetsegment.c, src/regiongetsegmentsize.c, src/regionident.c, src/regionmp.c, src/regionreturnsegment.c, src/rtclock.c, src/rtemsidtoname.c, src/rtemstimer.c, src/sem.c, src/semcreate.c, src/semdelete.c, src/semflush.c, src/semident.c, src/semmp.c, src/semobtain.c, src/semrelease.c, src/semtranslatereturncode.c, src/signal.c, src/signalcatch.c, src/signalmp.c, src/signalsend.c, src/taskcreate.c, src/taskdelete.c, src/taskgetnote.c, src/taskident.c, src/taskinitusers.c, src/taskissuspended.c, src/taskmode.c, src/taskmp.c, src/taskrestart.c, src/taskresume.c, src/tasks.c, src/tasksetnote.c, src/tasksetpriority.c, src/taskstart.c, src/tasksuspend.c, src/taskvariableadd.c, src/taskvariabledelete.c, src/taskvariableget.c, src/taskwakeafter.c, src/taskwakewhen.c, src/timercancel.c, src/timercreate.c, src/timerdelete.c, src/timerfireafter.c, src/timerfirewhen.c, src/timergetinfo.c, src/timerident.c, src/timerreset.c, src/timerserver.c, src/timerserverfireafter.c, src/timerserverfirewhen.c: URL for license changed.
  • Property mode set to 100644
File size: 7.2 KB
Line 
1/*
2 *  Multiprocessing Support for the Partition Manager
3 *
4 *
5 *  COPYRIGHT (c) 1989-1999.
6 *  On-Line Applications Research Corporation (OAR).
7 *
8 *  The license and distribution terms for this file may be
9 *  found in the file LICENSE in this distribution or at
10 *  http://www.rtems.com/license/LICENSE.
11 *
12 *  $Id$
13 */
14
15#include <rtems/system.h>
16#include <rtems/rtems/status.h>
17#include <rtems/score/mpci.h>
18#include <rtems/score/mppkt.h>
19#include <rtems/score/object.h>
20#include <rtems/rtems/options.h>
21#include <rtems/rtems/part.h>
22#include <rtems/score/thread.h>
23#include <rtems/rtems/support.h>
24
25/*PAGE
26 *
27 *  _Partition_MP_Send_process_packet
28 *
29 */
30
31void _Partition_MP_Send_process_packet (
32  Partition_MP_Remote_operations  operation,
33  Objects_Id                      partition_id,
34  rtems_name                      name,
35  Objects_Id                      proxy_id
36)
37{
38  Partition_MP_Packet *the_packet;
39  unsigned32           node;
40
41  switch ( operation ) {
42
43    case PARTITION_MP_ANNOUNCE_CREATE:
44    case PARTITION_MP_ANNOUNCE_DELETE:
45    case PARTITION_MP_EXTRACT_PROXY:
46
47      the_packet                    = _Partition_MP_Get_packet();
48      the_packet->Prefix.the_class  = MP_PACKET_PARTITION;
49      the_packet->Prefix.length     = sizeof ( Partition_MP_Packet );
50      the_packet->Prefix.to_convert = sizeof ( Partition_MP_Packet );
51      the_packet->operation         = operation;
52      the_packet->Prefix.id         = partition_id;
53      the_packet->name              = name;
54      the_packet->proxy_id          = proxy_id;
55
56      if ( operation == PARTITION_MP_EXTRACT_PROXY )
57         node = rtems_get_node( partition_id );
58      else
59         node = MPCI_ALL_NODES;
60
61      _MPCI_Send_process_packet( node, &the_packet->Prefix );
62      break;
63
64    case PARTITION_MP_GET_BUFFER_REQUEST:
65    case PARTITION_MP_GET_BUFFER_RESPONSE:
66    case PARTITION_MP_RETURN_BUFFER_REQUEST:
67    case PARTITION_MP_RETURN_BUFFER_RESPONSE:
68      break;
69  }
70}
71
72/*PAGE
73 *
74 *  _Partition_MP_Send_request_packet
75 *
76 */
77
78rtems_status_code _Partition_MP_Send_request_packet (
79  Partition_MP_Remote_operations  operation,
80  Objects_Id                      partition_id,
81  void                           *buffer
82)
83{
84  Partition_MP_Packet *the_packet;
85
86  switch ( operation ) {
87
88    case PARTITION_MP_GET_BUFFER_REQUEST:
89    case PARTITION_MP_RETURN_BUFFER_REQUEST:
90
91      the_packet                    = _Partition_MP_Get_packet();
92      the_packet->Prefix.the_class  = MP_PACKET_PARTITION;
93      the_packet->Prefix.length     = sizeof ( Partition_MP_Packet );
94      the_packet->Prefix.to_convert = sizeof ( Partition_MP_Packet );
95      the_packet->operation         = operation;
96      the_packet->Prefix.id         = partition_id;
97      the_packet->buffer            = buffer;
98
99      return
100        _MPCI_Send_request_packet(
101          rtems_get_node( partition_id ),
102          &the_packet->Prefix,
103          STATES_READY      /* Not used */
104        );
105
106      break;
107
108    case PARTITION_MP_ANNOUNCE_CREATE:
109    case PARTITION_MP_ANNOUNCE_DELETE:
110    case PARTITION_MP_EXTRACT_PROXY:
111    case PARTITION_MP_GET_BUFFER_RESPONSE:
112    case PARTITION_MP_RETURN_BUFFER_RESPONSE:
113      break;
114
115  }
116  /*
117   *  The following line is included to satisfy compilers which
118   *  produce warnings when a function does not end with a return.
119   */
120  return RTEMS_SUCCESSFUL;
121}
122
123/*PAGE
124 *
125 *  _Partition_MP_Send_response_packet
126 *
127 */
128
129void _Partition_MP_Send_response_packet (
130  Partition_MP_Remote_operations  operation,
131  Objects_Id                      partition_id,
132  Thread_Control                 *the_thread
133)
134{
135  Partition_MP_Packet *the_packet;
136
137  switch ( operation ) {
138
139    case PARTITION_MP_GET_BUFFER_RESPONSE:
140    case PARTITION_MP_RETURN_BUFFER_RESPONSE:
141
142      the_packet = ( Partition_MP_Packet *) the_thread->receive_packet;
143
144/*
145 *  The packet being returned already contains the class, length, and
146 *  to_convert fields, therefore they are not set in this routine.
147 */
148      the_packet->operation = operation;
149      the_packet->Prefix.id = the_packet->Prefix.source_tid;
150
151      _MPCI_Send_response_packet(
152        rtems_get_node( the_packet->Prefix.source_tid ),
153        &the_packet->Prefix
154      );
155      break;
156
157    case PARTITION_MP_ANNOUNCE_CREATE:
158    case PARTITION_MP_ANNOUNCE_DELETE:
159    case PARTITION_MP_EXTRACT_PROXY:
160    case PARTITION_MP_GET_BUFFER_REQUEST:
161    case PARTITION_MP_RETURN_BUFFER_REQUEST:
162      break;
163
164  }
165}
166
167/*PAGE
168 *
169 *
170 *  _Partition_MP_Process_packet
171 *
172 */
173
174void _Partition_MP_Process_packet (
175  rtems_packet_prefix  *the_packet_prefix
176)
177{
178  Partition_MP_Packet *the_packet;
179  Thread_Control      *the_thread;
180  boolean              ignored;
181
182  the_packet = (Partition_MP_Packet *) the_packet_prefix;
183
184  switch ( the_packet->operation ) {
185
186    case PARTITION_MP_ANNOUNCE_CREATE:
187
188      ignored = _Objects_MP_Allocate_and_open(
189                  &_Partition_Information,
190                  the_packet->name,
191                  the_packet->Prefix.id,
192                  TRUE
193                );
194
195      _MPCI_Return_packet( the_packet_prefix );
196      break;
197
198    case PARTITION_MP_ANNOUNCE_DELETE:
199
200      _Objects_MP_Close( &_Partition_Information, the_packet->Prefix.id );
201
202      _MPCI_Return_packet( the_packet_prefix );
203      break;
204
205    case PARTITION_MP_EXTRACT_PROXY:
206
207      the_thread = _Thread_MP_Find_proxy( the_packet->proxy_id );
208
209      if ( ! _Thread_Is_null( the_thread ) )
210         _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
211
212      _MPCI_Return_packet( the_packet_prefix );
213      break;
214
215    case PARTITION_MP_GET_BUFFER_REQUEST:
216
217      the_packet->Prefix.return_code = rtems_partition_get_buffer(
218        the_packet->Prefix.id,
219        &the_packet->buffer
220      );
221
222      _Partition_MP_Send_response_packet(
223        PARTITION_MP_GET_BUFFER_RESPONSE,
224        the_packet->Prefix.id,
225        _Thread_Executing
226      );
227      break;
228
229    case PARTITION_MP_GET_BUFFER_RESPONSE:
230
231      the_thread = _MPCI_Process_response( the_packet_prefix );
232
233      *(void **)the_thread->Wait.return_argument = the_packet->buffer;
234
235      _MPCI_Return_packet( the_packet_prefix );
236      break;
237
238    case PARTITION_MP_RETURN_BUFFER_REQUEST:
239
240      the_packet->Prefix.return_code = rtems_partition_return_buffer(
241        the_packet->Prefix.id,
242        the_packet->buffer
243      );
244
245      _Partition_MP_Send_response_packet(
246        PARTITION_MP_RETURN_BUFFER_RESPONSE,
247        the_packet->Prefix.id,
248        _Thread_Executing
249      );
250      break;
251
252    case PARTITION_MP_RETURN_BUFFER_RESPONSE:
253
254      the_thread = _MPCI_Process_response( the_packet_prefix );
255
256      _MPCI_Return_packet( the_packet_prefix );
257      break;
258
259  }
260}
261
262/*PAGE
263 *
264 *  _Partition_MP_Send_object_was_deleted
265 *
266 *  This routine is not needed by the Partition since a partition
267 *  cannot be deleted when buffers are in use.
268 *
269 */
270
271/*PAGE
272 *
273 *  _Partition_MP_Send_extract_proxy
274 *
275 */
276
277void _Partition_MP_Send_extract_proxy (
278  void           *argument
279)
280{
281  Thread_Control *the_thread = (Thread_Control *)argument;
282
283  _Partition_MP_Send_process_packet(
284    PARTITION_MP_EXTRACT_PROXY,
285    the_thread->Wait.id,
286    (rtems_name) 0,
287    the_thread->Object.id
288  );
289
290}
291
292/*PAGE
293 *
294 *  _Partition_MP_Get_packet
295 *
296 */
297
298Partition_MP_Packet *_Partition_MP_Get_packet ( void )
299{
300  return ( (Partition_MP_Packet *) _MPCI_Get_packet() );
301}
302
303/* end of file */
Note: See TracBrowser for help on using the repository browser.