summaryrefslogtreecommitdiffstats
path: root/cpukit/itron
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1999-11-17 14:56:18 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1999-11-17 14:56:18 +0000
commit1c10acc7f3bb1f4e7ca7daab075b66873a3e8d91 (patch)
tree149fdd6c6de5919cadb3b198100ede9e07ea62b6 /cpukit/itron
parentFixed screen. (diff)
downloadrtems-1c10acc7f3bb1f4e7ca7daab075b66873a3e8d91.tar.bz2
Update from Andrew D. McDowell <amcdowel@cs.uah.edu> 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.
Diffstat (limited to 'cpukit/itron')
-rw-r--r--cpukit/itron/src/mbox.c264
1 files changed, 257 insertions, 7 deletions
diff --git a/cpukit/itron/src/mbox.c b/cpukit/itron/src/mbox.c
index c2cc11ec31..9a2f925429 100644
--- a/cpukit/itron/src/mbox.c
+++ b/cpukit/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 <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;
+ }
+}
/*
* _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 );
}