RTEMS CPU Kit with SuperCore  4.10.99.0
rtems/score/coremsg.h
Go to the documentation of this file.
00001 
00010 /*
00011  *  COPYRIGHT (c) 1989-2009.
00012  *  On-Line Applications Research Corporation (OAR).
00013  *
00014  *  The license and distribution terms for this file may be
00015  *  found in the file LICENSE in this distribution or at
00016  *  http://www.rtems.com/license/LICENSE.
00017  */
00018 
00019 #ifndef _RTEMS_SCORE_COREMSG_H
00020 #define _RTEMS_SCORE_COREMSG_H
00021 
00032 #include <limits.h>
00033 #include <rtems/score/thread.h>
00034 #include <rtems/score/threadq.h>
00035 #include <rtems/score/priority.h>
00036 #include <rtems/score/watchdog.h>
00037 
00038 #if defined(RTEMS_POSIX_API)
00039 
00044   #define RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY
00045 #endif
00046 
00047 #if defined(RTEMS_POSIX_API)
00048 
00053   #define RTEMS_SCORE_COREMSG_ENABLE_NOTIFICATION
00054 #endif
00055 
00056 #if defined(RTEMS_POSIX_API)
00057 
00061   #define RTEMS_SCORE_COREMSG_ENABLE_BLOCKING_SEND
00062 #endif
00063 
00064 #ifdef __cplusplus
00065 extern "C" {
00066 #endif
00067 
00074 typedef void ( *CORE_message_queue_API_mp_support_callout )(
00075                  Thread_Control *,
00076                  Objects_Id
00077              );
00078 
00088 typedef struct {
00090   size_t      size;
00092   uint32_t    buffer[1];
00093 } CORE_message_queue_Buffer;
00094 
00101 typedef struct {
00103   Chain_Node                 Node;
00104   #if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY)
00105 
00106     int                        priority;
00107   #endif
00108 
00109   CORE_message_queue_Buffer  Contents;
00110 }   CORE_message_queue_Buffer_control;
00111 
00118 typedef enum {
00120   CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO,
00122   CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY
00123 }   CORE_message_queue_Disciplines;
00124 
00131 #define  CORE_MESSAGE_QUEUE_SEND_REQUEST   INT_MAX
00132 
00139 #define  CORE_MESSAGE_QUEUE_URGENT_REQUEST INT_MIN
00140 
00151 typedef int CORE_message_queue_Submit_types;
00152 
00159 typedef enum {
00161   CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL,
00163   CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE,
00165   CORE_MESSAGE_QUEUE_STATUS_TOO_MANY,
00167   CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED,
00169   CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT,
00173   CORE_MESSAGE_QUEUE_STATUS_WAS_DELETED,
00177   CORE_MESSAGE_QUEUE_STATUS_TIMEOUT,
00179   CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT
00180 }   CORE_message_queue_Status;
00181 
00187 #define CORE_MESSAGE_QUEUE_STATUS_LAST CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT
00188 
00195 typedef struct {
00197   CORE_message_queue_Disciplines  discipline;
00198 }   CORE_message_queue_Attributes;
00199 
00200 #if defined(RTEMS_SCORE_COREMSG_ENABLE_NOTIFICATION)
00201 
00208   typedef void (*CORE_message_queue_Notify_Handler)( void * );
00209 #endif
00210 
00217 typedef struct {
00221   Thread_queue_Control               Wait_queue;
00225   CORE_message_queue_Attributes      Attributes;
00229   uint32_t                           maximum_pending_messages;
00232   uint32_t                           number_of_pending_messages;
00236   size_t                             maximum_message_size;
00240   Chain_Control                      Pending_messages;
00245   CORE_message_queue_Buffer         *message_buffers;
00246   #if defined(RTEMS_SCORE_COREMSG_ENABLE_NOTIFICATION)
00247 
00250     CORE_message_queue_Notify_Handler  notify_handler;
00252     void                              *notify_argument;
00253   #endif
00254 
00257   Chain_Control                      Inactive_messages;
00258 }   CORE_message_queue_Control;
00259 
00284 bool _CORE_message_queue_Initialize(
00285   CORE_message_queue_Control    *the_message_queue,
00286   CORE_message_queue_Attributes *the_message_queue_attributes,
00287   uint32_t                       maximum_pending_messages,
00288   size_t                         maximum_message_size
00289 );
00290 
00308 void _CORE_message_queue_Close(
00309   CORE_message_queue_Control *the_message_queue,
00310   Thread_queue_Flush_callout  remote_extract_callout,
00311   uint32_t                    status
00312 );
00313 
00329 uint32_t   _CORE_message_queue_Flush(
00330   CORE_message_queue_Control *the_message_queue
00331 );
00332 
00346 uint32_t   _CORE_message_queue_Flush_support(
00347   CORE_message_queue_Control *the_message_queue
00348 );
00349 
00350 #if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
00351 
00362   void _CORE_message_queue_Flush_waiting_threads(
00363     CORE_message_queue_Control *the_message_queue
00364   );
00365 #endif
00366 
00390 CORE_message_queue_Status _CORE_message_queue_Broadcast(
00391   CORE_message_queue_Control                *the_message_queue,
00392   const void                                *buffer,
00393   size_t                                     size,
00394   Objects_Id                                 id,
00395   CORE_message_queue_API_mp_support_callout  api_message_queue_mp_support,
00396   uint32_t                                  *count
00397 );
00398 
00424 CORE_message_queue_Status _CORE_message_queue_Submit(
00425   CORE_message_queue_Control                *the_message_queue,
00426   const void                                *buffer,
00427   size_t                                     size,
00428   Objects_Id                                 id,
00429   CORE_message_queue_API_mp_support_callout  api_message_queue_mp_support,
00430   CORE_message_queue_Submit_types            submit_type,
00431   bool                                       wait,
00432   Watchdog_Interval                          timeout
00433 );
00434 
00470 void _CORE_message_queue_Seize(
00471   CORE_message_queue_Control      *the_message_queue,
00472   Objects_Id                       id,
00473   void                            *buffer,
00474   size_t                          *size_p,
00475   bool                             wait,
00476   Watchdog_Interval                timeout
00477 );
00478 
00494 void _CORE_message_queue_Insert_message(
00495   CORE_message_queue_Control        *the_message_queue,
00496   CORE_message_queue_Buffer_control *the_message,
00497   CORE_message_queue_Submit_types    submit_type
00498 );
00499 
00500 #ifndef __RTEMS_APPLICATION__
00501 #include <rtems/score/coremsg.inl>
00502 #endif
00503 
00504 #ifdef __cplusplus
00505 }
00506 #endif
00507 
00510 #endif
00511 /*  end of include file */