Updated Mailbox Manager submitted and split into multiple files.

This commit is contained in:
Joel Sherrill
1999-11-17 15:24:11 +00:00
parent c730be8f61
commit 5e96e91757
22 changed files with 940 additions and 688 deletions

View File

@@ -21,7 +21,7 @@ typedef struct t_cmbx {
VP exinf; /* extended information */
ATR mbxatr; /* mailbox attributes */
/* Following is implementation-dependent function */
INT bufcnt; /* ring buffer size */
INT bufcnt; /* maximum number of messages to let pend */
/* additional information may be included depending on the implementation */
} T_CMBX;
@@ -38,7 +38,11 @@ typedef struct t_msg {
/*
* A region (header) reserved by the OS may be included first
* depending on the implementation.
*
* NOTE: The first two fields are RTEMS specific.
*/
INT msgpri; /* priority of each message */
/* VB msgcont[]; XXX */
unsigned8 msgcont[1];
} T_MSG;
@@ -63,8 +67,8 @@ typedef struct t_rmbx {
*/
ER cre_mbx(
ID mbxid,
T_CMBX* pk_cmbx
ID mbxid,
T_CMBX *pk_cmbx
);
/*
@@ -80,7 +84,7 @@ ER del_mbx(
*/
ER snd_msg(
ID mbxid,
ID mbxid,
T_MSG *pk_msg
);
@@ -90,7 +94,7 @@ ER snd_msg(
ER rcv_msg(
T_MSG **ppk_msg,
ID mbxid
ID mbxid
);
/*
@@ -99,7 +103,7 @@ ER rcv_msg(
ER prcv_msg(
T_MSG **ppk_msg,
ID mbxid
ID mbxid
);
/*
@@ -108,8 +112,8 @@ ER prcv_msg(
ER trcv_msg(
T_MSG **ppk_msg,
ID mbxid,
TMO tmout
ID mbxid,
TMO tmout
);
/*
@@ -118,7 +122,7 @@ ER trcv_msg(
ER ref_mbx(
T_RMBX *pk_rmbx,
ID mbxid
ID mbxid
);

View File

@@ -14,14 +14,17 @@ extern "C" {
#endif
#include <rtems/itron/object.h>
#include <rtems/score/coremsg.h>
/*
* The following defines the control block used to manage each mailbox.
*/
typedef struct {
ITRON_Objects_Control Object;
unsigned32 XXX_more_stuff_goes_here;
ITRON_Objects_Control Object;
unsigned32 count;
boolean do_message_priority;
CORE_message_queue_Control message_queue;
} ITRON_Mailbox_Control;
/*
@@ -44,9 +47,18 @@ void _ITRON_Mailbox_Manager_initialization(
);
/*
* XXX insert private stuff here
* _ITRON_Mailbox_Translate_core_message_queue_return_code
*
* DESCRIPTION:
*
* This routine translates a core message queue object status
* into the appropriate ITRON status code.
*/
ER _ITRON_Mailbox_Translate_core_message_queue_return_code(
CORE_message_queue_Status status
);
#include <rtems/itron/mbox.inl>
#ifdef __cplusplus

View File

@@ -0,0 +1,100 @@
/*
* ITRON 3.0 Mailbox Manager
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <itron.h>
#include <rtems/itron/mbox.h>
#include <rtems/itron/task.h>
/*
* cre_mbx - Create Mailbox
*
* Creates a Mailbox according to the following spec:
*
* ------Parameters-------------------------
* ID mbxid MailboxID
* T_CMBX *pk_cmbx Packet to Create Mailbox
* -----------------------------------------
* -*pk_cmbx members*-
* VP exinf ExtendedInformation
* ATR mbxatr MailboxAttributes
* (the use of the following information
* is implementation dependent)
* INT bufcnt BufferMessageCount
* (CPU and/or implementation-dependent information
* may also be included)
*
* ----Return Parameters--------------------
* ER ercd ErrorCode
* -----------------------------------------
*
*
* ----C Language Interface-----------------
* ER ercd = cre_mbx ( ID mbxid, T_CMBX *pk_cmbx ) ;
* -----------------------------------------
*
*/
ER cre_mbx(
ID mbxid,
T_CMBX *pk_cmbx
)
{
register ITRON_Mailbox_Control *the_mailbox;
CORE_message_queue_Attributes the_mailbox_attributes;
if ( !pk_cmbx )
return E_PAR;
if ((pk_cmbx->mbxatr & (TA_TPRI | TA_MPRI)) != 0 )
return E_RSATR;
_Thread_Disable_dispatch(); /* protects object pointer */
the_mailbox = _ITRON_Mailbox_Allocate( mbxid );
if ( !the_mailbox ) {
_Thread_Enable_dispatch();
return _ITRON_Mailbox_Clarify_allocation_id_error( mbxid );
}
the_mailbox->count = pk_cmbx->bufcnt;
if (pk_cmbx->mbxatr & TA_MPRI)
the_mailbox->do_message_priority = TRUE;
else
the_mailbox->do_message_priority = FALSE;
if (pk_cmbx->mbxatr & TA_TPRI)
the_mailbox_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
else
the_mailbox_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
if ( !_CORE_message_queue_Initialize(
&the_mailbox->message_queue,
OBJECTS_ITRON_MAILBOXES,
&the_mailbox_attributes,
the_mailbox->count,
sizeof(T_MSG *),
NULL ) ) { /* Multiprocessing not supported */
_ITRON_Mailbox_Free(the_mailbox);
_ITRON_return_errorno( E_OBJ );
}
_ITRON_Objects_Open( &_ITRON_Mailbox_Information, &the_mailbox->Object );
/*
* If multiprocessing were supported, this is where we would announce
* the existence of the semaphore to the rest of the system.
*/
#if defined(RTEMS_MULTIPROCESSING)
#endif
_ITRON_return_errorno( E_OK );
}

View File

@@ -0,0 +1,61 @@
/*
* ITRON 3.0 Mailbox Manager
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <itron.h>
#include <rtems/itron/mbox.h>
#include <rtems/itron/task.h>
/*
* del_mbx - Delete Mailbox
*
*
* ------Parameters--------------
* ID mbxid The Mailbox's ID
* ------------------------------
*
* -----Return Parameters-------
* ER ercd Itron Error Code
* -----------------------------
*
* -----C Language Interface----
* ER ercd = del_mbx(ID mbxid);
* -----------------------------
*
*/
ER del_mbx(
ID mbxid
)
{
register ITRON_Mailbox_Control *the_mailbox;
Objects_Locations location;
the_mailbox= _ITRON_Mailbox_Get( mbxid, &location );
switch ( location ) {
case OBJECTS_ERROR:
case OBJECTS_REMOTE:
return _ITRON_Mailbox_Clarify_get_id_error( mbxid );
case OBJECTS_LOCAL:
_Objects_Close( &_ITRON_Mailbox_Information, &the_mailbox->Object );
_CORE_message_queue_Close(
&the_mailbox->message_queue,
NULL, /* Multiprocessing not supported */
CORE_MESSAGE_QUEUE_STATUS_WAS_DELETED
);
_ITRON_Mailbox_Free(the_mailbox);
break;
}
_ITRON_return_errorno( E_OK );
}

View File

@@ -13,33 +13,6 @@
#include <rtems/itron/mbox.h>
#include <rtems/itron/task.h>
/*
* _ITRON_Mailbox_Translate_core_message_queue_return_code
*
* This routine translates a core message queue object status
* into the appropriate ITRON status code.
*/
ER _ITRON_Mailbox_Translate_core_message_queue_return_code(
CORE_message_queue_Status status
)
{
switch (status) {
case CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL:
return E_OK;
case CORE_MESSAGE_QUEUE_STATUS_TOO_MANY:
return E_TMOUT;
case CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE:
return E_PAR;
case CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT:
return E_TMOUT;
case CORE_MESSAGE_QUEUE_STATUS_TIMEOUT:
return E_TMOUT;
default:
return E_ID;
}
}
/*
* _ITRON_Mailbox_Manager_initialization
*
@@ -76,308 +49,3 @@ void _ITRON_Mailbox_Manager_initialization(
*/
}
/*
* cre_mbx - Create Mailbox
*
* Creates a Mailbox according to the following spec:
*
* ------Parameters-------------------------
* ID mbxid MailboxID
* T_CMBX *pk_cmbx Packet to Create Mailbox
* -----------------------------------------
* -*pk_cmbx members*-
* VP exinf ExtendedInformation
* ATR mbxatr MailboxAttributes
* (the use of the following information
* is implementation dependent)
* INT bufcnt BufferMessageCount
* (CPU and/or implementation-dependent information
* may also be included)
*
* ----Return Parameters--------------------
* ER ercd ErrorCode
* -----------------------------------------
*
*
* ----C Language Interface-----------------
* ER ercd = cre_mbx ( ID mbxid, T_CMBX *pk_cmbx ) ;
* -----------------------------------------
*
*/
ER cre_mbx(
ID mbxid,
T_CMBX *pk_cmbx
)
{
register ITRON_Mailbox_Control *the_mailbox;
CORE_message_queue_Attributes the_mailbox_attributes;
if ( !pk_cmbx )
return E_PAR;
if ((pk_cmbx->mbxatr & (TA_TPRI | TA_MPRI)) != 0 )
return E_RSATR;
_Thread_Disable_dispatch(); /* protects object pointer */
the_mailbox = _ITRON_Mailbox_Allocate( mbxid );
if ( !the_mailbox ) {
_Thread_Enable_dispatch();
return _ITRON_Mailbox_Clarify_allocation_id_error( mbxid );
}
the_mailbox->count = pk_cmbx->bufcnt;
if (pk_cmbx->mbxatr & TA_MPRI)
the_mailbox->do_message_priority = TRUE;
else
the_mailbox->do_message_priority = FALSE;
if (pk_cmbx->mbxatr & TA_TPRI)
the_mailbox_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
else
the_mailbox_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
if ( !_CORE_message_queue_Initialize(
&the_mailbox->message_queue,
OBJECTS_ITRON_MAILBOXES,
&the_mailbox_attributes,
the_mailbox->count,
sizeof(T_MSG *),
NULL ) ) { /* Multiprocessing not supported */
_ITRON_Mailbox_Free(the_mailbox);
_ITRON_return_errorno( E_OBJ );
}
_ITRON_Objects_Open( &_ITRON_Mailbox_Information, &the_mailbox->Object );
/*
* If multiprocessing were supported, this is where we would announce
* the existence of the semaphore to the rest of the system.
*/
#if defined(RTEMS_MULTIPROCESSING)
#endif
_ITRON_return_errorno( E_OK );
}
/*
* del_mbx - Delete Mailbox
*
*
* ------Parameters--------------
* ID mbxid The Mailbox's ID
* ------------------------------
*
* -----Return Parameters-------
* ER ercd Itron Error Code
* -----------------------------
*
* -----C Language Interface----
* ER ercd = del_mbx(ID mbxid);
* -----------------------------
*
*/
ER del_mbx(
ID mbxid
)
{
register ITRON_Mailbox_Control *the_mailbox;
Objects_Locations location;
the_mailbox= _ITRON_Mailbox_Get( mbxid, &location );
switch ( location ) {
case OBJECTS_ERROR:
case OBJECTS_REMOTE:
return _ITRON_Mailbox_Clarify_get_id_error( mbxid );
case OBJECTS_LOCAL:
_Objects_Close( &_ITRON_Mailbox_Information, &the_mailbox->Object );
_CORE_message_queue_Close(
&the_mailbox->message_queue,
NULL, /* Multiprocessing not supported */
CORE_MESSAGE_QUEUE_STATUS_WAS_DELETED
);
_ITRON_Mailbox_Free(the_mailbox);
break;
}
_ITRON_return_errorno( E_OK );
}
/*
* snd_msg - Send Message to Mailbox
*/
ER snd_msg(
ID mbxid,
T_MSG *pk_msg
)
{
register ITRON_Mailbox_Control *the_mailbox;
Objects_Locations location;
CORE_message_queue_Status status = E_OK;
unsigned32 message_priority;
void *message_contents;
if ( !pk_msg )
return E_PAR;
the_mailbox = _ITRON_Mailbox_Get( mbxid, &location );
switch ( location ) {
case OBJECTS_REMOTE:
case OBJECTS_ERROR:
return _ITRON_Mailbox_Clarify_get_id_error( mbxid );
case OBJECTS_LOCAL:
if ( the_mailbox->do_message_priority )
message_priority = pk_msg->msgpri;
else
message_priority = CORE_MESSAGE_QUEUE_SEND_REQUEST;
message_contents = pk_msg;
status = _CORE_message_queue_Submit(
&the_mailbox->message_queue,
&message_contents,
sizeof(T_MSG *),
the_mailbox->Object.id,
NULL, /* multiprocessing not supported */
message_priority
);
break;
}
_ITRON_return_errorno(
_ITRON_Mailbox_Translate_core_message_queue_return_code(status) );
}
/*
* rcv_msg - Receive Message from Mailbox
*/
ER rcv_msg(
T_MSG **ppk_msg,
ID mbxid
)
{
return trcv_msg( ppk_msg, mbxid, TMO_FEVR );
}
/*
* prcv_msg - Poll and Receive Message from Mailbox
*/
ER prcv_msg(
T_MSG **ppk_msg,
ID mbxid
)
{
return trcv_msg( ppk_msg, mbxid, TMO_POL );
}
/*
* trcv_msg - Receive Message from Mailbox with Timeout
*/
ER trcv_msg(
T_MSG **ppk_msg,
ID mbxid,
TMO tmout
)
{
register ITRON_Mailbox_Control *the_mailbox;
Watchdog_Interval interval;
boolean wait;
Objects_Locations location;
unsigned32 size;
if (!ppk_msg)
return E_PAR;
interval = 0;
if ( tmout == TMO_POL ) {
wait = FALSE;
} else {
wait = TRUE;
if ( tmout != TMO_FEVR )
interval = TOD_MILLISECONDS_TO_TICKS(tmout);
}
if ( wait && _ITRON_Is_in_non_task_state() )
return E_CTX;
the_mailbox = _ITRON_Mailbox_Get( mbxid, &location );
switch ( location ) {
case OBJECTS_REMOTE:
case OBJECTS_ERROR:
return _ITRON_Mailbox_Clarify_get_id_error( mbxid );
case OBJECTS_LOCAL:
_CORE_message_queue_Seize(
&the_mailbox->message_queue,
the_mailbox->Object.id,
ppk_msg,
&size,
wait,
interval
);
break;
}
_ITRON_return_errorno(
_ITRON_Mailbox_Translate_core_message_queue_return_code(
_Thread_Executing->Wait.return_code ) );
}
/*
* ref_mbx - Reference Mailbox Status
*/
ER ref_mbx(
T_RMBX *pk_rmbx,
ID mbxid
)
{
register ITRON_Mailbox_Control *the_mailbox;
Objects_Locations location;
Chain_Control *pending;
if ( !pk_rmbx )
return E_PAR;
the_mailbox = _ITRON_Mailbox_Get( mbxid, &location );
switch ( location ) {
case OBJECTS_REMOTE:
case OBJECTS_ERROR:
return _ITRON_Mailbox_Clarify_get_id_error( mbxid );
case OBJECTS_LOCAL:
pending = &the_mailbox->message_queue.Pending_messages;
if ( _Chain_Is_empty( pending ) )
pk_rmbx->pk_msg = NULL;
else
pk_rmbx->pk_msg = (T_MSG *) pending->first;
/*
* Fill in whether or not there is a waiting task
*/
if ( !_Thread_queue_First( &the_mailbox->message_queue.Wait_queue ) )
pk_rmbx->wtsk = FALSE;
else
pk_rmbx->wtsk = TRUE;
break;
}
_ITRON_return_errorno( E_OK );
}

View File

@@ -0,0 +1,41 @@
/*
* ITRON 3.0 Mailbox Manager
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <itron.h>
#include <rtems/itron/mbox.h>
#include <rtems/itron/task.h>
/*
* _ITRON_Mailbox_Translate_core_message_queue_return_code
*
* This routine translates a core message queue object status
* into the appropriate ITRON status code.
*/
ER _ITRON_Mailbox_Translate_core_message_queue_return_code(
CORE_message_queue_Status status
)
{
switch (status) {
case CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL:
return E_OK;
case CORE_MESSAGE_QUEUE_STATUS_TOO_MANY:
return E_TMOUT;
case CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE:
return E_PAR;
case CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT:
return E_TMOUT;
case CORE_MESSAGE_QUEUE_STATUS_TIMEOUT:
return E_TMOUT;
default:
return E_ID;
}
}

View File

@@ -0,0 +1,26 @@
/*
* ITRON 3.0 Mailbox Manager
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <itron.h>
#include <rtems/itron/mbox.h>
#include <rtems/itron/task.h>
/*
* prcv_msg - Poll and Receive Message from Mailbox
*/
ER prcv_msg(
T_MSG **ppk_msg,
ID mbxid
)
{
return trcv_msg( ppk_msg, mbxid, TMO_POL );
}

View File

@@ -0,0 +1,26 @@
/*
* ITRON 3.0 Mailbox Manager
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <itron.h>
#include <rtems/itron/mbox.h>
#include <rtems/itron/task.h>
/*
* rcv_msg - Receive Message from Mailbox
*/
ER rcv_msg(
T_MSG **ppk_msg,
ID mbxid
)
{
return trcv_msg( ppk_msg, mbxid, TMO_FEVR );
}

View File

@@ -0,0 +1,59 @@
/*
* ITRON 3.0 Mailbox Manager
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <itron.h>
#include <rtems/itron/mbox.h>
#include <rtems/itron/task.h>
/*
* ref_mbx - Reference Mailbox Status
*/
ER ref_mbx(
T_RMBX *pk_rmbx,
ID mbxid
)
{
register ITRON_Mailbox_Control *the_mailbox;
Objects_Locations location;
Chain_Control *pending;
if ( !pk_rmbx )
return E_PAR;
the_mailbox = _ITRON_Mailbox_Get( mbxid, &location );
switch ( location ) {
case OBJECTS_REMOTE:
case OBJECTS_ERROR:
return _ITRON_Mailbox_Clarify_get_id_error( mbxid );
case OBJECTS_LOCAL:
pending = &the_mailbox->message_queue.Pending_messages;
if ( _Chain_Is_empty( pending ) )
pk_rmbx->pk_msg = NULL;
else
pk_rmbx->pk_msg = (T_MSG *) pending->first;
/*
* Fill in whether or not there is a waiting task
*/
if ( !_Thread_queue_First( &the_mailbox->message_queue.Wait_queue ) )
pk_rmbx->wtsk = FALSE;
else
pk_rmbx->wtsk = TRUE;
break;
}
_ITRON_return_errorno( E_OK );
}

View File

@@ -0,0 +1,60 @@
/*
* ITRON 3.0 Mailbox Manager
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <itron.h>
#include <rtems/itron/mbox.h>
#include <rtems/itron/task.h>
/*
* snd_msg - Send Message to Mailbox
*/
ER snd_msg(
ID mbxid,
T_MSG *pk_msg
)
{
register ITRON_Mailbox_Control *the_mailbox;
Objects_Locations location;
CORE_message_queue_Status status = E_OK;
unsigned32 message_priority;
void *message_contents;
if ( !pk_msg )
return E_PAR;
the_mailbox = _ITRON_Mailbox_Get( mbxid, &location );
switch ( location ) {
case OBJECTS_REMOTE:
case OBJECTS_ERROR:
return _ITRON_Mailbox_Clarify_get_id_error( mbxid );
case OBJECTS_LOCAL:
if ( the_mailbox->do_message_priority )
message_priority = pk_msg->msgpri;
else
message_priority = CORE_MESSAGE_QUEUE_SEND_REQUEST;
message_contents = pk_msg;
status = _CORE_message_queue_Submit(
&the_mailbox->message_queue,
&message_contents,
sizeof(T_MSG *),
the_mailbox->Object.id,
NULL, /* multiprocessing not supported */
message_priority
);
break;
}
_ITRON_return_errorno(
_ITRON_Mailbox_Translate_core_message_queue_return_code(status) );
}

View File

@@ -0,0 +1,69 @@
/*
* ITRON 3.0 Mailbox Manager
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <itron.h>
#include <rtems/itron/mbox.h>
#include <rtems/itron/task.h>
/*
* trcv_msg - Receive Message from Mailbox with Timeout
*/
ER trcv_msg(
T_MSG **ppk_msg,
ID mbxid,
TMO tmout
)
{
register ITRON_Mailbox_Control *the_mailbox;
Watchdog_Interval interval;
boolean wait;
Objects_Locations location;
unsigned32 size;
if (!ppk_msg)
return E_PAR;
interval = 0;
if ( tmout == TMO_POL ) {
wait = FALSE;
} else {
wait = TRUE;
if ( tmout != TMO_FEVR )
interval = TOD_MILLISECONDS_TO_TICKS(tmout);
}
if ( wait && _ITRON_Is_in_non_task_state() )
return E_CTX;
the_mailbox = _ITRON_Mailbox_Get( mbxid, &location );
switch ( location ) {
case OBJECTS_REMOTE:
case OBJECTS_ERROR:
return _ITRON_Mailbox_Clarify_get_id_error( mbxid );
case OBJECTS_LOCAL:
_CORE_message_queue_Seize(
&the_mailbox->message_queue,
the_mailbox->Object.id,
ppk_msg,
&size,
wait,
interval
);
break;
}
_ITRON_return_errorno(
_ITRON_Mailbox_Translate_core_message_queue_return_code(
_Thread_Executing->Wait.return_code ) );
}