From 1c10acc7f3bb1f4e7ca7daab075b66873a3e8d91 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 17 Nov 1999 14:56:18 +0000 Subject: Update from Andrew D. McDowell with modifications by Joel and Jennifer based on experience merging the other managers and cleaning them up. No test code is available at this point. --- c/src/exec/itron/src/mbox.c | 264 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 257 insertions(+), 7 deletions(-) (limited to 'c/src/exec/itron') diff --git a/c/src/exec/itron/src/mbox.c b/c/src/exec/itron/src/mbox.c index c2cc11ec31..9a2f925429 100644 --- a/c/src/exec/itron/src/mbox.c +++ b/c/src/exec/itron/src/mbox.c @@ -1,4 +1,6 @@ /* + * 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. @@ -9,6 +11,34 @@ #include #include +#include + +/* + * _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 @@ -47,8 +77,34 @@ 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( @@ -56,20 +112,106 @@ ER cre_mbx( T_CMBX *pk_cmbx ) { - return E_OK; + 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 ) { - return E_OK; + 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 */ @@ -79,7 +221,41 @@ ER snd_msg( T_MSG *pk_msg ) { - return E_OK; + 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) ); } /* @@ -91,7 +267,7 @@ ER rcv_msg( ID mbxid ) { - return E_OK; + return trcv_msg( ppk_msg, mbxid, TMO_FEVR ); } /* @@ -103,7 +279,7 @@ ER prcv_msg( ID mbxid ) { - return E_OK; + return trcv_msg( ppk_msg, mbxid, TMO_POL ); } /* @@ -116,7 +292,49 @@ ER trcv_msg( TMO tmout ) { - return E_OK; + 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 ) ); } /* @@ -128,6 +346,38 @@ ER ref_mbx( ID mbxid ) { - return E_OK; + 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 ); } -- cgit v1.2.3