From b06e68ef1f6df69cc86d72356c3a002054a35fad Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 17 Aug 1995 19:51:51 +0000 Subject: Numerous miscellaneous features incorporated from Tony Bennett (tbennett@divnc.com) including the following major additions: + variable length messages + named devices + debug monitor + association tables/variables --- cpukit/rtems/include/rtems/rtems/message.h | 73 ++++++++++++++++++----------- cpukit/rtems/include/rtems/rtems/msgmp.h | 14 +++--- cpukit/rtems/inline/rtems/rtems/attr.inl | 13 ----- cpukit/rtems/inline/rtems/rtems/message.inl | 37 ++++++++------- cpukit/rtems/macros/rtems/rtems/attr.inl | 9 ---- 5 files changed, 71 insertions(+), 75 deletions(-) (limited to 'cpukit/rtems') diff --git a/cpukit/rtems/include/rtems/rtems/message.h b/cpukit/rtems/include/rtems/rtems/message.h index aefcea3c36..04aa6dfb16 100644 --- a/cpukit/rtems/include/rtems/rtems/message.h +++ b/cpukit/rtems/include/rtems/rtems/message.h @@ -41,14 +41,22 @@ extern "C" { /* * The following defines the data types needed to manipulate * the contents of message buffers. + * Since msgs are variable length we just make a ptr to 1. */ typedef struct { - unsigned32 field1; - unsigned32 field2; - unsigned32 field3; - unsigned32 field4; -} Message_queue_Buffer; + unsigned32 size; + +#ifndef __cplusplus + /* NOTE: [0] is gcc specific, + * but specifically disallowed by ANSI STD C++ + * g++ warns about it, so we #ifdef it out to + * get rid of warnings when compiled by g++. + */ + unsigned32 buffer[0]; +#endif + +} Message_queue_Buffer; /* * The following records define the organization of a message @@ -68,10 +76,13 @@ typedef struct { typedef struct { Objects_Control Object; Thread_queue_Control Wait_queue; - rtems_attribute attribute_set; + rtems_attribute attribute_set; unsigned32 maximum_pending_messages; unsigned32 number_of_pending_messages; + unsigned32 maximum_message_size; Chain_Control Pending_messages; + Message_queue_Buffer *message_buffers; + Chain_Control Inactive_messages; } Message_queue_Control; /* @@ -81,13 +92,6 @@ typedef struct { EXTERN Objects_Information _Message_queue_Information; -/* - * The following defines the data structures used to - * manage the pool of inactive message buffers. - */ - -EXTERN Chain_Control _Message_queue_Inactive_messages; - /* * The following enumerated type details the modes in which a message * may be submitted to a message queue. The message may be posted @@ -108,8 +112,7 @@ typedef enum { */ void _Message_queue_Manager_initialization( - unsigned32 maximum_message_queues, - unsigned32 maximum_messages + unsigned32 maximum_message_queues ); /* @@ -126,10 +129,11 @@ void _Message_queue_Manager_initialization( */ rtems_status_code rtems_message_queue_create( - Objects_Name name, - unsigned32 count, + Objects_Name name, + unsigned32 count, + unsigned32 max_message_size, rtems_attribute attribute_set, - Objects_Id *id + Objects_Id *id ); /* @@ -183,7 +187,8 @@ rtems_status_code rtems_message_queue_delete( rtems_status_code rtems_message_queue_send( Objects_Id id, - void *buffer + void *buffer, + unsigned32 size ); /* @@ -204,7 +209,8 @@ rtems_status_code rtems_message_queue_send( rtems_status_code rtems_message_queue_urgent( Objects_Id id, - void *buffer + void *buffer, + unsigned32 size ); /* @@ -226,6 +232,7 @@ rtems_status_code rtems_message_queue_urgent( rtems_status_code rtems_message_queue_broadcast( Objects_Id id, void *buffer, + unsigned32 size, unsigned32 *count ); @@ -246,8 +253,9 @@ rtems_status_code rtems_message_queue_broadcast( rtems_status_code rtems_message_queue_receive( Objects_Id id, void *buffer, + unsigned32 *size_p, unsigned32 option_set, - rtems_interval timeout + rtems_interval timeout ); /* @@ -276,8 +284,9 @@ rtems_status_code rtems_message_queue_flush( */ STATIC INLINE void _Message_queue_Copy_buffer ( - Message_queue_Buffer *source, - Message_queue_Buffer *destination + void *source, + void *destination, + unsigned32 size ); /* @@ -295,7 +304,8 @@ STATIC INLINE void _Message_queue_Copy_buffer ( boolean _Message_queue_Seize( Message_queue_Control *the_message_queue, unsigned32 option_set, - Message_queue_Buffer *buffer + void *buffer, + unsigned32 *size_p ); /* @@ -322,7 +332,8 @@ unsigned32 _Message_queue_Flush_support( rtems_status_code _Message_queue_Submit( Objects_Id id, - Message_queue_Buffer *buffer, + void *buffer, + unsigned32 size, Message_queue_Submit_types submit_type ); @@ -336,7 +347,9 @@ rtems_status_code _Message_queue_Submit( */ STATIC INLINE Message_queue_Buffer_control * - _Message_queue_Allocate_message_buffer ( void ); + _Message_queue_Allocate_message_buffer ( + Message_queue_Control *the_message_queue +); /* * _Message_queue_Free_message_buffer @@ -348,6 +361,7 @@ STATIC INLINE Message_queue_Buffer_control * */ STATIC INLINE void _Message_queue_Free_message_buffer ( + Message_queue_Control *the_message_queue, Message_queue_Buffer_control *the_message ); @@ -415,14 +429,17 @@ STATIC INLINE boolean _Message_queue_Is_null ( * the inactive chain of free message queue control blocks. */ -STATIC INLINE Message_queue_Control *_Message_queue_Allocate ( void ); +Message_queue_Control *_Message_queue_Allocate ( + unsigned32 count, + unsigned32 max_message_size +); /* * _Message_queue_Free * * DESCRIPTION: * - * This routine allocates a message queue control block from + * This routine deallocates a message queue control block into * the inactive chain of free message queue control blocks. */ diff --git a/cpukit/rtems/include/rtems/rtems/msgmp.h b/cpukit/rtems/include/rtems/rtems/msgmp.h index 486bf00002..d3e40fe123 100644 --- a/cpukit/rtems/include/rtems/rtems/msgmp.h +++ b/cpukit/rtems/include/rtems/rtems/msgmp.h @@ -55,15 +55,14 @@ typedef enum { */ typedef struct { - rtems_packet_prefix Prefix; + rtems_packet_prefix Prefix; Message_queue_MP_Remote_operations operation; Objects_Name name; - rtems_option option_set; + rtems_option option_set; Objects_Id proxy_id; unsigned32 count; + unsigned32 size; unsigned32 pad0; - unsigned32 pad1; - unsigned32 pad2; Message_queue_Buffer Buffer; } Message_queue_MP_Packet; @@ -95,9 +94,10 @@ void _Message_queue_MP_Send_process_packet ( rtems_status_code _Message_queue_MP_Send_request_packet ( Message_queue_MP_Remote_operations operation, Objects_Id message_queue_id, - Message_queue_Buffer *buffer, - rtems_option option_set, - rtems_interval timeout + void *buffer, + unsigned32 *size_p, + rtems_option option_set, + rtems_interval timeout ); /* diff --git a/cpukit/rtems/inline/rtems/rtems/attr.inl b/cpukit/rtems/inline/rtems/rtems/attr.inl index c657a08211..15a9296b7e 100644 --- a/cpukit/rtems/inline/rtems/rtems/attr.inl +++ b/cpukit/rtems/inline/rtems/rtems/attr.inl @@ -82,19 +82,6 @@ STATIC INLINE boolean _Attributes_Is_priority( return ( attribute_set & RTEMS_PRIORITY ); } -/*PAGE - * - * _Attributes_Is_limit - * - */ - -STATIC INLINE boolean _Attributes_Is_limit( - rtems_attribute attribute_set -) -{ - return ( attribute_set & RTEMS_LIMIT ); -} - /*PAGE * * _Attributes_Is_binary_semaphore diff --git a/cpukit/rtems/inline/rtems/rtems/message.inl b/cpukit/rtems/inline/rtems/rtems/message.inl index ee8d5f6cb1..18d793d2fe 100644 --- a/cpukit/rtems/inline/rtems/rtems/message.inl +++ b/cpukit/rtems/inline/rtems/rtems/message.inl @@ -17,6 +17,8 @@ #ifndef __MESSAGE_QUEUE_inl #define __MESSAGE_QUEUE_inl +#include + /*PAGE * * _Message_queue_Copy_buffer @@ -24,11 +26,12 @@ */ STATIC INLINE void _Message_queue_Copy_buffer ( - Message_queue_Buffer *source, - Message_queue_Buffer *destination + void *source, + void *destination, + unsigned32 size ) { - *destination = *source; + memcpy(destination, source, size); } /*PAGE @@ -38,10 +41,12 @@ STATIC INLINE void _Message_queue_Copy_buffer ( */ STATIC INLINE Message_queue_Buffer_control * - _Message_queue_Allocate_message_buffer ( void ) +_Message_queue_Allocate_message_buffer ( + Message_queue_Control *the_message_queue +) { return (Message_queue_Buffer_control *) - _Chain_Get( &_Message_queue_Inactive_messages ); + _Chain_Get( &the_message_queue->Inactive_messages ); } /*PAGE @@ -51,10 +56,11 @@ STATIC INLINE Message_queue_Buffer_control * */ STATIC INLINE void _Message_queue_Free_message_buffer ( - Message_queue_Buffer_control *the_message + Message_queue_Control *the_message_queue, + Message_queue_Buffer_control *the_message ) { - _Chain_Append( &_Message_queue_Inactive_messages, &the_message->Node ); + _Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node ); } /*PAGE @@ -116,17 +122,6 @@ STATIC INLINE boolean _Message_queue_Is_null ( return ( the_message_queue == NULL ); } -/*PAGE - * - * _Message_queue_Allocate - * - */ - -STATIC INLINE Message_queue_Control *_Message_queue_Allocate ( void ) -{ - return (Message_queue_Control *) - _Objects_Allocate( &_Message_queue_Information ); -} /*PAGE * @@ -138,6 +133,12 @@ STATIC INLINE void _Message_queue_Free ( Message_queue_Control *the_message_queue ) { + if (the_message_queue->message_buffers) + { + _Workspace_Free((void *) the_message_queue->message_buffers); + the_message_queue->message_buffers = 0; + } + _Objects_Free( &_Message_queue_Information, &the_message_queue->Object ); } diff --git a/cpukit/rtems/macros/rtems/rtems/attr.inl b/cpukit/rtems/macros/rtems/rtems/attr.inl index 602622ca35..97d3463d53 100644 --- a/cpukit/rtems/macros/rtems/rtems/attr.inl +++ b/cpukit/rtems/macros/rtems/rtems/attr.inl @@ -60,15 +60,6 @@ #define _Attributes_Is_priority( _attribute_set ) \ ( (_attribute_set) & RTEMS_PRIORITY ) -/*PAGE - * - * _Attributes_Is_limit - * - */ - -#define _Attributes_Is_limit( _attribute_set ) \ - ( (_attribute_set) & RTEMS_LIMIT ) - /*PAGE * * _Attributes_Is_binary_semaphore -- cgit v1.2.3