source: rtems/c/src/exec/score/include/rtems/score/coremsg.h @ 7d741413

4.104.114.84.95
Last change on this file since 7d741413 was 7d741413, checked in by Joel Sherrill <joel.sherrill@…>, on 08/16/01 at 19:35:08

2001-08-16 Joel Sherrill <joel@…>

  • include/rtems/score/coremsg.h, src/coremsgsubmit.c: Add a new return status to account for blocking sends. Otherwise, the caller will think that the returned message status will have the ultimate results of the operation. If the send times out, the final status will be in the return_code of the thread.
  • Property mode set to 100644
File size: 8.2 KB
Line 
1/*  coremsg.h
2 *
3 *  This include file contains all the constants and structures associated
4 *  with the Message queue Handler.
5 *
6 *  COPYRIGHT (c) 1989-1999.
7 *  On-Line Applications Research Corporation (OAR).
8 *
9 *  The license and distribution terms for this file may be
10 *  found in the file LICENSE in this distribution or at
11 *  http://www.OARcorp.com/rtems/license.html.
12 *
13 *  $Id$
14 */
15 
16#ifndef __RTEMS_CORE_MESSAGE_QUEUE_h
17#define __RTEMS_CORE_MESSAGE_QUEUE_h
18 
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23#include <limits.h>
24#include <rtems/score/thread.h>
25#include <rtems/score/threadq.h>
26#include <rtems/score/priority.h>
27#include <rtems/score/watchdog.h>
28 
29/*
30 *  The following type defines the callout which the API provides
31 *  to support global/multiprocessor operations on message_queues.
32 */
33 
34typedef void ( *CORE_message_queue_API_mp_support_callout )(
35                 Thread_Control *,
36                 Objects_Id
37             );
38
39/*
40 *  The following defines the data types needed to manipulate
41 *  the contents of message buffers.
42 *
43 *  NOTE:  The buffer field is normally longer than a single unsigned32.
44 *         but since messages are variable length we just make a ptr to 1. 
45 */
46 
47typedef struct {
48    unsigned32  size;
49    unsigned32  buffer[1];
50} CORE_message_queue_Buffer;
51 
52/*
53 *  The following records define the organization of a message
54 *  buffer.
55 */
56 
57typedef struct {
58  Chain_Node                 Node;
59  int                        priority;
60  CORE_message_queue_Buffer  Contents;
61}   CORE_message_queue_Buffer_control;
62
63/*
64 *  Blocking disciplines for a message_queue.
65 */
66
67typedef enum {
68  CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO,
69  CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY
70}   CORE_message_queue_Disciplines;
71
72/*
73 *  The following enumerated type details the modes in which a message
74 *  may be submitted to a message queue.  The message may be posted
75 *  in a send or urgent fashion.
76 *
77 *  NOTE:  All other values are message priorities.  Numerically smaller
78 *         priorities indicate higher priority messages.
79 *
80 */
81
82#define  CORE_MESSAGE_QUEUE_SEND_REQUEST   INT_MAX
83#define  CORE_MESSAGE_QUEUE_URGENT_REQUEST INT_MIN
84 
85typedef int CORE_message_queue_Submit_types;
86
87/*
88 *  Core Message queue handler return statuses.
89 */
90 
91typedef enum {
92  CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL,
93  CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE,
94  CORE_MESSAGE_QUEUE_STATUS_TOO_MANY,
95  CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED,
96  CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT,
97  CORE_MESSAGE_QUEUE_STATUS_WAS_DELETED,
98  CORE_MESSAGE_QUEUE_STATUS_TIMEOUT,
99  CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT
100}   CORE_message_queue_Status;
101
102/*
103 *  The following defines the control block used to manage the
104 *  attributes of each message queue.
105 */
106
107typedef struct {
108  CORE_message_queue_Disciplines  discipline;
109}   CORE_message_queue_Attributes;
110 
111/*
112 *  The following defines the type for a Notification handler.  A notification
113 *  handler is invoked when the message queue makes a 0->1 transition on
114 *  pending messages.
115 */
116
117typedef void (*CORE_message_queue_Notify_Handler)( void * );
118
119/*
120 *  The following defines the control block used to manage each
121 *  counting message_queue.
122 */
123 
124typedef struct {
125  Thread_queue_Control               Wait_queue;
126  CORE_message_queue_Attributes      Attributes;
127  unsigned32                         maximum_pending_messages;
128  unsigned32                         number_of_pending_messages;
129  unsigned32                         maximum_message_size;
130  Chain_Control                      Pending_messages;
131  CORE_message_queue_Buffer         *message_buffers;
132  CORE_message_queue_Notify_Handler  notify_handler;
133  void                              *notify_argument;
134  Chain_Control                      Inactive_messages;
135}   CORE_message_queue_Control;
136
137/*
138 *  _CORE_message_queue_Initialize
139 *
140 *  DESCRIPTION:
141 *
142 *  This routine initializes the message_queue based on the parameters passed.
143 */
144
145boolean _CORE_message_queue_Initialize(
146  CORE_message_queue_Control    *the_message_queue,
147  Objects_Classes                the_class,
148  CORE_message_queue_Attributes *the_message_queue_attributes,
149  unsigned32                     maximum_pending_messages,
150  unsigned32                     maximum_message_size,
151  Thread_queue_Extract_callout   proxy_extract_callout
152);
153 
154/*
155 *  _CORE_message_queue_Close
156 *
157 *  DESCRIPTION:
158 *
159 *  This function closes a message by returning all allocated space and
160 *  flushing the message_queue's task wait queue.
161 */
162 
163void _CORE_message_queue_Close(
164  CORE_message_queue_Control *the_message_queue,
165  Thread_queue_Flush_callout  remote_extract_callout,
166  unsigned32                  status
167);
168
169/*
170 *  _CORE_message_queue_Flush
171 *
172 *  DESCRIPTION:
173 *
174 *  This function flushes the message_queue's pending message queue.  The
175 *  number of messages flushed from the queue is returned.
176 *
177 */
178
179unsigned32 _CORE_message_queue_Flush(
180  CORE_message_queue_Control *the_message_queue
181);
182
183/*
184 *  _CORE_message_queue_Flush_support
185 *
186 *  DESCRIPTION:
187 *
188 *  This routine flushes all outstanding messages and returns
189 *  them to the inactive message chain.
190 */
191 
192unsigned32 _CORE_message_queue_Flush_support(
193  CORE_message_queue_Control *the_message_queue
194);
195 
196/*
197 *  _CORE_message_queue_Flush_waiting_threads
198 *
199 *  DESCRIPTION:
200 *
201 *  This function flushes the threads which are blocked on this
202 *  message_queue's pending message queue.  They are unblocked whether
203 *  blocked sending or receiving.
204 */
205
206void _CORE_message_queue_Flush_waiting_threads(
207  CORE_message_queue_Control *the_message_queue
208);
209
210/*
211 *  _CORE_message_queue_Broadcast
212 *
213 *  DESCRIPTION:
214 *
215 *  This function sends a message for every thread waiting on the queue and
216 *  returns the number of threads made ready by the message.
217 *
218 */
219 
220CORE_message_queue_Status _CORE_message_queue_Broadcast(
221  CORE_message_queue_Control                *the_message_queue,
222  void                                      *buffer,
223  unsigned32                                 size,
224  Objects_Id                                 id,
225  CORE_message_queue_API_mp_support_callout  api_message_queue_mp_support,
226  unsigned32                                *count
227);
228
229/*
230 *  _CORE_message_queue_Submit
231 *
232 *  DESCRIPTION:
233 *
234 *  This routine implements the send and urgent message functions. It
235 *  processes a message that is to be submitted to the designated
236 *  message queue.  The message will either be processed as a
237 *  send message which it will be inserted at the rear of the queue
238 *  or it will be processed as an urgent message which will be inserted
239 *  at the front of the queue.
240 *
241 */
242 
243CORE_message_queue_Status _CORE_message_queue_Submit(
244  CORE_message_queue_Control                *the_message_queue,
245  void                                      *buffer,
246  unsigned32                                 size,
247  Objects_Id                                 id,
248  CORE_message_queue_API_mp_support_callout  api_message_queue_mp_support,
249  CORE_message_queue_Submit_types            submit_type,
250  boolean                                    wait,
251  Watchdog_Interval                          timeout
252);
253
254/*
255 *  _CORE_message_queue_Seize
256 *
257 *  DESCRIPTION:
258 *
259 *  This kernel routine dequeues a message, copies the message buffer to
260 *  a given destination buffer, and frees the message buffer to the
261 *  inactive message pool.  The thread will be blocked if wait is TRUE,
262 *  otherwise an error will be given to the thread if no messages are available.
263 *
264 *  NOTE: Returns message priority via return are in TCB.
265 */
266 
267void _CORE_message_queue_Seize(
268  CORE_message_queue_Control      *the_message_queue,
269  Objects_Id                       id,
270  void                            *buffer,
271  unsigned32                      *size,
272  boolean                          wait,
273  Watchdog_Interval                timeout
274);
275
276/*
277 *  _CORE_message_queue_Insert_message
278 *
279 *  DESCRIPTION:
280 *
281 *  This kernel routine inserts the specified message into the
282 *  message queue.  It is assumed that the message has been filled
283 *  in before this routine is called.
284 */
285
286void _CORE_message_queue_Insert_message(
287  CORE_message_queue_Control        *the_message_queue,
288  CORE_message_queue_Buffer_control *the_message,
289  CORE_message_queue_Submit_types    submit_type
290);
291
292#ifndef __RTEMS_APPLICATION__
293#include <rtems/score/coremsg.inl>
294#endif
295
296#ifdef __cplusplus
297}
298#endif
299 
300#endif
301/*  end of include file */
302
Note: See TracBrowser for help on using the repository browser.