forked from Imagelibrary/rtems
Cleaned up style.
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
/*
|
||||
* ITRON Message Buffer 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.
|
||||
@@ -12,22 +14,23 @@
|
||||
#include <rtems/itron/task.h>
|
||||
|
||||
ER _ITRON_Message_buffer_Translate_core_message_buffer_return_code(
|
||||
CORE_message_queue_Status status)
|
||||
CORE_message_queue_Status status
|
||||
)
|
||||
{
|
||||
switch (status) {
|
||||
switch (status) {
|
||||
case CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL:
|
||||
return E_OK;
|
||||
return E_OK;
|
||||
case CORE_MESSAGE_QUEUE_STATUS_TOO_MANY:
|
||||
return E_TMOUT;
|
||||
return E_TMOUT;
|
||||
case CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE:
|
||||
return E_PAR;
|
||||
return E_PAR;
|
||||
case CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT:
|
||||
return E_TMOUT;
|
||||
return E_TMOUT;
|
||||
case CORE_MESSAGE_QUEUE_STATUS_TIMEOUT:
|
||||
return E_TMOUT;
|
||||
return E_TMOUT;
|
||||
default:
|
||||
return E_ID;
|
||||
}
|
||||
return E_ID;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -43,31 +46,30 @@ ER _ITRON_Message_buffer_Translate_core_message_buffer_return_code(
|
||||
*/
|
||||
|
||||
void _ITRON_Message_buffer_Manager_initialization(
|
||||
unsigned32 maximum_message_buffers
|
||||
)
|
||||
unsigned32 maximum_message_buffers
|
||||
)
|
||||
{
|
||||
_Objects_Initialize_information(
|
||||
&_ITRON_Message_buffer_Information, /* object information table */
|
||||
OBJECTS_ITRON_MESSAGE_BUFFERS, /* object class */
|
||||
FALSE, /* TRUE if this is a
|
||||
global object class */
|
||||
maximum_message_buffers, /* maximum objects of this class */
|
||||
sizeof( ITRON_Message_buffer_Control ), /* size of this
|
||||
object's control
|
||||
block */
|
||||
FALSE, /* TRUE if names for this
|
||||
object are strings */
|
||||
RTEMS_MAXIMUM_NAME_LENGTH, /* maximum length of each
|
||||
object's name */
|
||||
FALSE /* TRUE if this class is threads */
|
||||
);
|
||||
|
||||
/*
|
||||
* Register the MP Process Packet routine.
|
||||
*
|
||||
* NOTE: No MP Support YET in RTEMS ITRON implementation.
|
||||
*/
|
||||
|
||||
_Objects_Initialize_information(
|
||||
&_ITRON_Message_buffer_Information, /* object information table */
|
||||
OBJECTS_ITRON_MESSAGE_BUFFERS, /* object class */
|
||||
FALSE, /* TRUE if this is a
|
||||
global object class */
|
||||
maximum_message_buffers, /* maximum objects of this class */
|
||||
sizeof( ITRON_Message_buffer_Control ), /* size of this
|
||||
object's control
|
||||
block */
|
||||
FALSE, /* TRUE if names for this
|
||||
object are strings */
|
||||
RTEMS_MAXIMUM_NAME_LENGTH, /* maximum length of each
|
||||
object's name */
|
||||
FALSE /* TRUE if this class is threads */
|
||||
);
|
||||
|
||||
/*
|
||||
* Register the MP Process Packet routine.
|
||||
*
|
||||
* NOTE: No MP Support YET in RTEMS ITRON implementation.
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -75,71 +77,71 @@ void _ITRON_Message_buffer_Manager_initialization(
|
||||
*/
|
||||
|
||||
ER cre_mbf(
|
||||
ID mbfid,
|
||||
T_CMBF *pk_cmbf
|
||||
)
|
||||
ID mbfid,
|
||||
T_CMBF *pk_cmbf
|
||||
)
|
||||
{
|
||||
CORE_message_queue_Attributes the_message_queue_attributes;
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
CORE_message_queue_Attributes the_message_queue_attributes;
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
|
||||
/*
|
||||
* Bad pointer to the attributes structure
|
||||
*/
|
||||
/*
|
||||
* Bad pointer to the attributes structure
|
||||
*/
|
||||
|
||||
if ( !pk_cmbf )
|
||||
return E_PAR;
|
||||
if ( !pk_cmbf )
|
||||
return E_PAR;
|
||||
|
||||
/*
|
||||
* Bits were set that were note defined.
|
||||
*/
|
||||
/*
|
||||
* Bits were set that were note defined.
|
||||
*/
|
||||
|
||||
if (pk_cmbf->mbfatr & ~(TA_TPRI))
|
||||
return E_RSATR;
|
||||
if (pk_cmbf->mbfatr & ~(TA_TPRI))
|
||||
return E_RSATR;
|
||||
|
||||
if (pk_cmbf->bufsz < 0 || pk_cmbf->maxmsz < 0)
|
||||
return E_PAR;
|
||||
if (pk_cmbf->bufsz < 0 || pk_cmbf->maxmsz < 0)
|
||||
return E_PAR;
|
||||
|
||||
if (pk_cmbf->bufsz < pk_cmbf->maxmsz)
|
||||
return E_PAR;
|
||||
if (pk_cmbf->bufsz < pk_cmbf->maxmsz)
|
||||
return E_PAR;
|
||||
|
||||
_Thread_Disable_dispatch(); /* prevents deletion */
|
||||
_Thread_Disable_dispatch(); /* prevents deletion */
|
||||
|
||||
the_message_buffer = _ITRON_Message_buffer_Allocate(mbfid);
|
||||
if ( !the_message_buffer ) {
|
||||
_Thread_Enable_dispatch();
|
||||
return _ITRON_Message_buffer_Clarify_allocation_id_error(mbfid);
|
||||
}
|
||||
the_message_buffer = _ITRON_Message_buffer_Allocate(mbfid);
|
||||
if ( !the_message_buffer ) {
|
||||
_Thread_Enable_dispatch();
|
||||
return _ITRON_Message_buffer_Clarify_allocation_id_error(mbfid);
|
||||
}
|
||||
|
||||
if ( pk_cmbf->mbfatr & TA_TPRI )
|
||||
the_message_queue_attributes.discipline =
|
||||
CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
|
||||
else
|
||||
the_message_queue_attributes.discipline =
|
||||
CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
|
||||
if ( pk_cmbf->mbfatr & TA_TPRI )
|
||||
the_message_queue_attributes.discipline =
|
||||
CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
|
||||
else
|
||||
the_message_queue_attributes.discipline =
|
||||
CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
|
||||
|
||||
_CORE_message_queue_Initialize(
|
||||
&the_message_buffer->message_queue,
|
||||
OBJECTS_ITRON_MESSAGE_BUFFERS,
|
||||
&the_message_queue_attributes,
|
||||
pk_cmbf->bufsz / pk_cmbf->maxmsz,
|
||||
pk_cmbf->maxmsz,
|
||||
NULL /* Multiprocessing not supported */
|
||||
);
|
||||
_CORE_message_queue_Initialize(
|
||||
&the_message_buffer->message_queue,
|
||||
OBJECTS_ITRON_MESSAGE_BUFFERS,
|
||||
&the_message_queue_attributes,
|
||||
pk_cmbf->bufsz / pk_cmbf->maxmsz,
|
||||
pk_cmbf->maxmsz,
|
||||
NULL /* Multiprocessing not supported */
|
||||
);
|
||||
|
||||
_ITRON_Objects_Open( &_ITRON_Message_buffer_Information,
|
||||
&the_message_buffer->Object );
|
||||
_ITRON_Objects_Open( &_ITRON_Message_buffer_Information,
|
||||
&the_message_buffer->Object );
|
||||
|
||||
/*
|
||||
* If multiprocessing were supported, this is where we would announce
|
||||
* the existence of the semaphore to the rest of the system.
|
||||
*/
|
||||
/*
|
||||
* 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
|
||||
|
||||
_Thread_Enable_dispatch();
|
||||
_Thread_Enable_dispatch();
|
||||
|
||||
return E_OK;
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -147,37 +149,36 @@ ER cre_mbf(
|
||||
*/
|
||||
|
||||
ER del_mbf(
|
||||
ID mbfid
|
||||
)
|
||||
ID mbfid
|
||||
)
|
||||
{
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
|
||||
the_message_buffer = _ITRON_Message_buffer_Get(mbfid, &location);
|
||||
|
||||
switch (location) {
|
||||
the_message_buffer = _ITRON_Message_buffer_Get(mbfid, &location);
|
||||
switch (location) {
|
||||
case OBJECTS_REMOTE:
|
||||
case OBJECTS_ERROR: /* Multiprocessing not supported */
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error(mbfid);
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error(mbfid);
|
||||
|
||||
case OBJECTS_LOCAL:
|
||||
_CORE_message_queue_Flush(&the_message_buffer->message_queue);
|
||||
_ITRON_Objects_Close(
|
||||
&_ITRON_Message_buffer_Information,
|
||||
&the_message_buffer->Object);
|
||||
_ITRON_Message_buffer_Free(the_message_buffer);
|
||||
/*
|
||||
* If multiprocessing were supported, this is where we would announce
|
||||
* the existence of the semaphore to the rest of the system.
|
||||
*/
|
||||
_CORE_message_queue_Flush(&the_message_buffer->message_queue);
|
||||
_ITRON_Objects_Close( &_ITRON_Message_buffer_Information,
|
||||
&the_message_buffer->Object);
|
||||
_ITRON_Message_buffer_Free(the_message_buffer);
|
||||
|
||||
/*
|
||||
* 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
|
||||
_Thread_Enable_dispatch();
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
return E_OK;
|
||||
_Thread_Enable_dispatch();
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -185,10 +186,10 @@ ER del_mbf(
|
||||
*/
|
||||
|
||||
ER snd_mbf(
|
||||
ID mbfid,
|
||||
VP msg,
|
||||
INT msgsz
|
||||
)
|
||||
ID mbfid,
|
||||
VP msg,
|
||||
INT msgsz
|
||||
)
|
||||
{
|
||||
return E_OK;
|
||||
}
|
||||
@@ -198,36 +199,36 @@ ER snd_mbf(
|
||||
*/
|
||||
|
||||
ER psnd_mbf(
|
||||
ID mbfid,
|
||||
VP msg,
|
||||
INT msgsz
|
||||
)
|
||||
ID mbfid,
|
||||
VP msg,
|
||||
INT msgsz
|
||||
)
|
||||
{
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
CORE_message_queue_Status status;
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
CORE_message_queue_Status status;
|
||||
|
||||
if (msgsz <= 0 || !msg)
|
||||
return E_PAR;
|
||||
if (msgsz <= 0 || !msg)
|
||||
return E_PAR;
|
||||
|
||||
the_message_buffer = _ITRON_Message_buffer_Get(mbfid, &location);
|
||||
switch (location) {
|
||||
the_message_buffer = _ITRON_Message_buffer_Get(mbfid, &location);
|
||||
switch (location) {
|
||||
case OBJECTS_REMOTE:
|
||||
case OBJECTS_ERROR: /* Multiprocessing not supported */
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error(mbfid);
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error(mbfid);
|
||||
|
||||
case OBJECTS_LOCAL:
|
||||
status = _CORE_message_queue_Submit(
|
||||
&the_message_buffer->message_queue,
|
||||
msg,
|
||||
msgsz,
|
||||
the_message_buffer->Object.id,
|
||||
NULL,
|
||||
CORE_MESSAGE_QUEUE_SEND_REQUEST);
|
||||
_Thread_Enable_dispatch();
|
||||
return
|
||||
_ITRON_Message_buffer_Translate_core_message_buffer_return_code(
|
||||
status);
|
||||
status = _CORE_message_queue_Submit(
|
||||
&the_message_buffer->message_queue,
|
||||
msg,
|
||||
msgsz,
|
||||
the_message_buffer->Object.id,
|
||||
NULL,
|
||||
CORE_MESSAGE_QUEUE_SEND_REQUEST
|
||||
);
|
||||
_Thread_Enable_dispatch();
|
||||
return
|
||||
_ITRON_Message_buffer_Translate_core_message_buffer_return_code(status);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -246,13 +247,13 @@ ER psnd_mbf(
|
||||
*/
|
||||
|
||||
ER tsnd_mbf(
|
||||
ID mbfid,
|
||||
VP msg,
|
||||
INT msgsz,
|
||||
TMO tmout
|
||||
)
|
||||
ID mbfid,
|
||||
VP msg,
|
||||
INT msgsz,
|
||||
TMO tmout
|
||||
)
|
||||
{
|
||||
return E_OK;
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -260,12 +261,12 @@ ER tsnd_mbf(
|
||||
*/
|
||||
|
||||
ER rcv_mbf(
|
||||
VP msg,
|
||||
INT *p_msgsz,
|
||||
ID mbfid
|
||||
)
|
||||
VP msg,
|
||||
INT *p_msgsz,
|
||||
ID mbfid
|
||||
)
|
||||
{
|
||||
return trcv_mbf(msg, p_msgsz, mbfid, TMO_FEVR);
|
||||
return trcv_mbf(msg, p_msgsz, mbfid, TMO_FEVR);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -273,12 +274,12 @@ ER rcv_mbf(
|
||||
*/
|
||||
|
||||
ER prcv_mbf(
|
||||
VP msg,
|
||||
INT *p_msgsz,
|
||||
ID mbfid
|
||||
)
|
||||
VP msg,
|
||||
INT *p_msgsz,
|
||||
ID mbfid
|
||||
)
|
||||
{
|
||||
return trcv_mbf(msg, p_msgsz, mbfid, TMO_POL);
|
||||
return trcv_mbf(msg, p_msgsz, mbfid, TMO_POL);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -286,54 +287,52 @@ ER prcv_mbf(
|
||||
*/
|
||||
|
||||
ER trcv_mbf(
|
||||
VP msg,
|
||||
INT *p_msgsz,
|
||||
ID mbfid,
|
||||
TMO tmout
|
||||
)
|
||||
VP msg,
|
||||
INT *p_msgsz,
|
||||
ID mbfid,
|
||||
TMO tmout
|
||||
)
|
||||
{
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
CORE_message_queue_Status status;
|
||||
boolean wait;
|
||||
Watchdog_Interval interval;
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
CORE_message_queue_Status status;
|
||||
boolean wait;
|
||||
Watchdog_Interval interval;
|
||||
|
||||
interval = 0;
|
||||
if (tmout == TMO_POL) {
|
||||
wait = FALSE;
|
||||
} else {
|
||||
wait = TRUE;
|
||||
if (tmout != TMO_FEVR)
|
||||
interval = TOD_MILLISECONDS_TO_TICKS(tmout);
|
||||
}
|
||||
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;
|
||||
if (wait && _ITRON_Is_in_non_task_state() )
|
||||
return E_CTX;
|
||||
|
||||
if (!p_msgsz || !msg || tmout <= -2)
|
||||
return E_PAR;
|
||||
if (!p_msgsz || !msg || tmout <= -2)
|
||||
return E_PAR;
|
||||
|
||||
the_message_buffer = _ITRON_Message_buffer_Get(mbfid, &location);
|
||||
switch (location) {
|
||||
the_message_buffer = _ITRON_Message_buffer_Get(mbfid, &location);
|
||||
switch (location) {
|
||||
case OBJECTS_REMOTE:
|
||||
case OBJECTS_ERROR: /* Multiprocessing not supported */
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error(mbfid);
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error(mbfid);
|
||||
|
||||
case OBJECTS_LOCAL:
|
||||
_CORE_message_queue_Seize(
|
||||
&the_message_buffer->message_queue,
|
||||
the_message_buffer->Object.id,
|
||||
msg,
|
||||
p_msgsz,
|
||||
wait,
|
||||
interval);
|
||||
_Thread_Enable_dispatch();
|
||||
status =
|
||||
(CORE_message_queue_Status)_Thread_Executing->Wait.return_code;
|
||||
return
|
||||
_ITRON_Message_buffer_Translate_core_message_buffer_return_code
|
||||
(status);
|
||||
|
||||
_CORE_message_queue_Seize(
|
||||
&the_message_buffer->message_queue,
|
||||
the_message_buffer->Object.id,
|
||||
msg,
|
||||
p_msgsz,
|
||||
wait,
|
||||
interval
|
||||
);
|
||||
_Thread_Enable_dispatch();
|
||||
status = (CORE_message_queue_Status)_Thread_Executing->Wait.return_code;
|
||||
return
|
||||
_ITRON_Message_buffer_Translate_core_message_buffer_return_code(status);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -351,62 +350,59 @@ ER trcv_mbf(
|
||||
*/
|
||||
|
||||
ER ref_mbf(
|
||||
T_RMBF *pk_rmbf,
|
||||
ID mbfid
|
||||
)
|
||||
T_RMBF *pk_rmbf,
|
||||
ID mbfid
|
||||
)
|
||||
{
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
CORE_message_queue_Control *the_core_msgq;
|
||||
|
||||
if ( !pk_rmbf )
|
||||
return E_PAR; /* XXX check this error code */
|
||||
if ( !pk_rmbf )
|
||||
return E_PAR; /* XXX check this error code */
|
||||
|
||||
the_message_buffer = _ITRON_Message_buffer_Get( mbfid, &location );
|
||||
switch ( location ) {
|
||||
case OBJECTS_REMOTE: /* Multiprocessing not supported */
|
||||
case OBJECTS_ERROR:
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error( mbfid );
|
||||
the_message_buffer = _ITRON_Message_buffer_Get( mbfid, &location );
|
||||
switch ( location ) {
|
||||
case OBJECTS_REMOTE: /* Multiprocessing not supported */
|
||||
case OBJECTS_ERROR:
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error( mbfid );
|
||||
|
||||
case OBJECTS_LOCAL:
|
||||
/*
|
||||
* Fill in the size of message to be sent
|
||||
*/
|
||||
case OBJECTS_LOCAL:
|
||||
the_core_msgq = &the_message_buffer->message_queue;
|
||||
|
||||
if(the_message_buffer->message_queue.
|
||||
number_of_pending_messages == 0) {
|
||||
pk_rmbf->msgsz = 0;
|
||||
}
|
||||
else {
|
||||
CORE_message_queue_Buffer_control *the_message;
|
||||
the_message = (CORE_message_queue_Buffer_control*)
|
||||
the_message_buffer->message_queue.
|
||||
Pending_messages.first;
|
||||
pk_rmbf->msgsz = the_message->Contents.size;
|
||||
}
|
||||
/*
|
||||
* Fill in the size of message to be sent
|
||||
*/
|
||||
|
||||
if (the_core_msgq->number_of_pending_messages == 0) {
|
||||
pk_rmbf->msgsz = 0;
|
||||
} else {
|
||||
pk_rmbf->msgsz = ((CORE_message_queue_Buffer_control *)
|
||||
the_core_msgq->Pending_messages.first)->Contents.size;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill in the size of free buffer
|
||||
*/
|
||||
/*
|
||||
* Fill in the size of free buffer
|
||||
*/
|
||||
|
||||
pk_rmbf->frbufsz =
|
||||
(the_message_buffer->message_queue.maximum_pending_messages-
|
||||
the_message_buffer->message_queue.number_of_pending_messages)*
|
||||
the_message_buffer->message_queue.maximum_message_size;
|
||||
pk_rmbf->frbufsz =
|
||||
(the_core_msgq->maximum_pending_messages -
|
||||
the_core_msgq->number_of_pending_messages) *
|
||||
the_core_msgq->maximum_message_size;
|
||||
|
||||
|
||||
/*
|
||||
* Fill in whether or not there is a waiting task
|
||||
*/
|
||||
/*
|
||||
* Fill in whether or not there is a waiting task
|
||||
*/
|
||||
|
||||
if ( !_Thread_queue_First(
|
||||
&the_message_buffer->message_queue.Wait_queue ) )
|
||||
pk_rmbf->wtsk = FALSE;
|
||||
else
|
||||
pk_rmbf->wtsk = TRUE;
|
||||
if ( !_Thread_queue_First(&the_core_msgq->Wait_queue ) )
|
||||
pk_rmbf->wtsk = FALSE;
|
||||
else
|
||||
pk_rmbf->wtsk = TRUE;
|
||||
|
||||
pk_rmbf->stsk = FALSE;
|
||||
_Thread_Enable_dispatch();
|
||||
return E_OK;
|
||||
}
|
||||
pk_rmbf->stsk = FALSE;
|
||||
_Thread_Enable_dispatch();
|
||||
return E_OK;
|
||||
}
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
/*
|
||||
* ITRON Message Buffer 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.
|
||||
@@ -12,22 +14,23 @@
|
||||
#include <rtems/itron/task.h>
|
||||
|
||||
ER _ITRON_Message_buffer_Translate_core_message_buffer_return_code(
|
||||
CORE_message_queue_Status status)
|
||||
CORE_message_queue_Status status
|
||||
)
|
||||
{
|
||||
switch (status) {
|
||||
switch (status) {
|
||||
case CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL:
|
||||
return E_OK;
|
||||
return E_OK;
|
||||
case CORE_MESSAGE_QUEUE_STATUS_TOO_MANY:
|
||||
return E_TMOUT;
|
||||
return E_TMOUT;
|
||||
case CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE:
|
||||
return E_PAR;
|
||||
return E_PAR;
|
||||
case CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT:
|
||||
return E_TMOUT;
|
||||
return E_TMOUT;
|
||||
case CORE_MESSAGE_QUEUE_STATUS_TIMEOUT:
|
||||
return E_TMOUT;
|
||||
return E_TMOUT;
|
||||
default:
|
||||
return E_ID;
|
||||
}
|
||||
return E_ID;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -43,31 +46,30 @@ ER _ITRON_Message_buffer_Translate_core_message_buffer_return_code(
|
||||
*/
|
||||
|
||||
void _ITRON_Message_buffer_Manager_initialization(
|
||||
unsigned32 maximum_message_buffers
|
||||
)
|
||||
unsigned32 maximum_message_buffers
|
||||
)
|
||||
{
|
||||
_Objects_Initialize_information(
|
||||
&_ITRON_Message_buffer_Information, /* object information table */
|
||||
OBJECTS_ITRON_MESSAGE_BUFFERS, /* object class */
|
||||
FALSE, /* TRUE if this is a
|
||||
global object class */
|
||||
maximum_message_buffers, /* maximum objects of this class */
|
||||
sizeof( ITRON_Message_buffer_Control ), /* size of this
|
||||
object's control
|
||||
block */
|
||||
FALSE, /* TRUE if names for this
|
||||
object are strings */
|
||||
RTEMS_MAXIMUM_NAME_LENGTH, /* maximum length of each
|
||||
object's name */
|
||||
FALSE /* TRUE if this class is threads */
|
||||
);
|
||||
|
||||
/*
|
||||
* Register the MP Process Packet routine.
|
||||
*
|
||||
* NOTE: No MP Support YET in RTEMS ITRON implementation.
|
||||
*/
|
||||
|
||||
_Objects_Initialize_information(
|
||||
&_ITRON_Message_buffer_Information, /* object information table */
|
||||
OBJECTS_ITRON_MESSAGE_BUFFERS, /* object class */
|
||||
FALSE, /* TRUE if this is a
|
||||
global object class */
|
||||
maximum_message_buffers, /* maximum objects of this class */
|
||||
sizeof( ITRON_Message_buffer_Control ), /* size of this
|
||||
object's control
|
||||
block */
|
||||
FALSE, /* TRUE if names for this
|
||||
object are strings */
|
||||
RTEMS_MAXIMUM_NAME_LENGTH, /* maximum length of each
|
||||
object's name */
|
||||
FALSE /* TRUE if this class is threads */
|
||||
);
|
||||
|
||||
/*
|
||||
* Register the MP Process Packet routine.
|
||||
*
|
||||
* NOTE: No MP Support YET in RTEMS ITRON implementation.
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -75,71 +77,71 @@ void _ITRON_Message_buffer_Manager_initialization(
|
||||
*/
|
||||
|
||||
ER cre_mbf(
|
||||
ID mbfid,
|
||||
T_CMBF *pk_cmbf
|
||||
)
|
||||
ID mbfid,
|
||||
T_CMBF *pk_cmbf
|
||||
)
|
||||
{
|
||||
CORE_message_queue_Attributes the_message_queue_attributes;
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
CORE_message_queue_Attributes the_message_queue_attributes;
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
|
||||
/*
|
||||
* Bad pointer to the attributes structure
|
||||
*/
|
||||
/*
|
||||
* Bad pointer to the attributes structure
|
||||
*/
|
||||
|
||||
if ( !pk_cmbf )
|
||||
return E_PAR;
|
||||
if ( !pk_cmbf )
|
||||
return E_PAR;
|
||||
|
||||
/*
|
||||
* Bits were set that were note defined.
|
||||
*/
|
||||
/*
|
||||
* Bits were set that were note defined.
|
||||
*/
|
||||
|
||||
if (pk_cmbf->mbfatr & ~(TA_TPRI))
|
||||
return E_RSATR;
|
||||
if (pk_cmbf->mbfatr & ~(TA_TPRI))
|
||||
return E_RSATR;
|
||||
|
||||
if (pk_cmbf->bufsz < 0 || pk_cmbf->maxmsz < 0)
|
||||
return E_PAR;
|
||||
if (pk_cmbf->bufsz < 0 || pk_cmbf->maxmsz < 0)
|
||||
return E_PAR;
|
||||
|
||||
if (pk_cmbf->bufsz < pk_cmbf->maxmsz)
|
||||
return E_PAR;
|
||||
if (pk_cmbf->bufsz < pk_cmbf->maxmsz)
|
||||
return E_PAR;
|
||||
|
||||
_Thread_Disable_dispatch(); /* prevents deletion */
|
||||
_Thread_Disable_dispatch(); /* prevents deletion */
|
||||
|
||||
the_message_buffer = _ITRON_Message_buffer_Allocate(mbfid);
|
||||
if ( !the_message_buffer ) {
|
||||
_Thread_Enable_dispatch();
|
||||
return _ITRON_Message_buffer_Clarify_allocation_id_error(mbfid);
|
||||
}
|
||||
the_message_buffer = _ITRON_Message_buffer_Allocate(mbfid);
|
||||
if ( !the_message_buffer ) {
|
||||
_Thread_Enable_dispatch();
|
||||
return _ITRON_Message_buffer_Clarify_allocation_id_error(mbfid);
|
||||
}
|
||||
|
||||
if ( pk_cmbf->mbfatr & TA_TPRI )
|
||||
the_message_queue_attributes.discipline =
|
||||
CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
|
||||
else
|
||||
the_message_queue_attributes.discipline =
|
||||
CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
|
||||
if ( pk_cmbf->mbfatr & TA_TPRI )
|
||||
the_message_queue_attributes.discipline =
|
||||
CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
|
||||
else
|
||||
the_message_queue_attributes.discipline =
|
||||
CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
|
||||
|
||||
_CORE_message_queue_Initialize(
|
||||
&the_message_buffer->message_queue,
|
||||
OBJECTS_ITRON_MESSAGE_BUFFERS,
|
||||
&the_message_queue_attributes,
|
||||
pk_cmbf->bufsz / pk_cmbf->maxmsz,
|
||||
pk_cmbf->maxmsz,
|
||||
NULL /* Multiprocessing not supported */
|
||||
);
|
||||
_CORE_message_queue_Initialize(
|
||||
&the_message_buffer->message_queue,
|
||||
OBJECTS_ITRON_MESSAGE_BUFFERS,
|
||||
&the_message_queue_attributes,
|
||||
pk_cmbf->bufsz / pk_cmbf->maxmsz,
|
||||
pk_cmbf->maxmsz,
|
||||
NULL /* Multiprocessing not supported */
|
||||
);
|
||||
|
||||
_ITRON_Objects_Open( &_ITRON_Message_buffer_Information,
|
||||
&the_message_buffer->Object );
|
||||
_ITRON_Objects_Open( &_ITRON_Message_buffer_Information,
|
||||
&the_message_buffer->Object );
|
||||
|
||||
/*
|
||||
* If multiprocessing were supported, this is where we would announce
|
||||
* the existence of the semaphore to the rest of the system.
|
||||
*/
|
||||
/*
|
||||
* 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
|
||||
|
||||
_Thread_Enable_dispatch();
|
||||
_Thread_Enable_dispatch();
|
||||
|
||||
return E_OK;
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -147,37 +149,36 @@ ER cre_mbf(
|
||||
*/
|
||||
|
||||
ER del_mbf(
|
||||
ID mbfid
|
||||
)
|
||||
ID mbfid
|
||||
)
|
||||
{
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
|
||||
the_message_buffer = _ITRON_Message_buffer_Get(mbfid, &location);
|
||||
|
||||
switch (location) {
|
||||
the_message_buffer = _ITRON_Message_buffer_Get(mbfid, &location);
|
||||
switch (location) {
|
||||
case OBJECTS_REMOTE:
|
||||
case OBJECTS_ERROR: /* Multiprocessing not supported */
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error(mbfid);
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error(mbfid);
|
||||
|
||||
case OBJECTS_LOCAL:
|
||||
_CORE_message_queue_Flush(&the_message_buffer->message_queue);
|
||||
_ITRON_Objects_Close(
|
||||
&_ITRON_Message_buffer_Information,
|
||||
&the_message_buffer->Object);
|
||||
_ITRON_Message_buffer_Free(the_message_buffer);
|
||||
/*
|
||||
* If multiprocessing were supported, this is where we would announce
|
||||
* the existence of the semaphore to the rest of the system.
|
||||
*/
|
||||
_CORE_message_queue_Flush(&the_message_buffer->message_queue);
|
||||
_ITRON_Objects_Close( &_ITRON_Message_buffer_Information,
|
||||
&the_message_buffer->Object);
|
||||
_ITRON_Message_buffer_Free(the_message_buffer);
|
||||
|
||||
/*
|
||||
* 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
|
||||
_Thread_Enable_dispatch();
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
return E_OK;
|
||||
_Thread_Enable_dispatch();
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -185,10 +186,10 @@ ER del_mbf(
|
||||
*/
|
||||
|
||||
ER snd_mbf(
|
||||
ID mbfid,
|
||||
VP msg,
|
||||
INT msgsz
|
||||
)
|
||||
ID mbfid,
|
||||
VP msg,
|
||||
INT msgsz
|
||||
)
|
||||
{
|
||||
return E_OK;
|
||||
}
|
||||
@@ -198,36 +199,36 @@ ER snd_mbf(
|
||||
*/
|
||||
|
||||
ER psnd_mbf(
|
||||
ID mbfid,
|
||||
VP msg,
|
||||
INT msgsz
|
||||
)
|
||||
ID mbfid,
|
||||
VP msg,
|
||||
INT msgsz
|
||||
)
|
||||
{
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
CORE_message_queue_Status status;
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
CORE_message_queue_Status status;
|
||||
|
||||
if (msgsz <= 0 || !msg)
|
||||
return E_PAR;
|
||||
if (msgsz <= 0 || !msg)
|
||||
return E_PAR;
|
||||
|
||||
the_message_buffer = _ITRON_Message_buffer_Get(mbfid, &location);
|
||||
switch (location) {
|
||||
the_message_buffer = _ITRON_Message_buffer_Get(mbfid, &location);
|
||||
switch (location) {
|
||||
case OBJECTS_REMOTE:
|
||||
case OBJECTS_ERROR: /* Multiprocessing not supported */
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error(mbfid);
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error(mbfid);
|
||||
|
||||
case OBJECTS_LOCAL:
|
||||
status = _CORE_message_queue_Submit(
|
||||
&the_message_buffer->message_queue,
|
||||
msg,
|
||||
msgsz,
|
||||
the_message_buffer->Object.id,
|
||||
NULL,
|
||||
CORE_MESSAGE_QUEUE_SEND_REQUEST);
|
||||
_Thread_Enable_dispatch();
|
||||
return
|
||||
_ITRON_Message_buffer_Translate_core_message_buffer_return_code(
|
||||
status);
|
||||
status = _CORE_message_queue_Submit(
|
||||
&the_message_buffer->message_queue,
|
||||
msg,
|
||||
msgsz,
|
||||
the_message_buffer->Object.id,
|
||||
NULL,
|
||||
CORE_MESSAGE_QUEUE_SEND_REQUEST
|
||||
);
|
||||
_Thread_Enable_dispatch();
|
||||
return
|
||||
_ITRON_Message_buffer_Translate_core_message_buffer_return_code(status);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -246,13 +247,13 @@ ER psnd_mbf(
|
||||
*/
|
||||
|
||||
ER tsnd_mbf(
|
||||
ID mbfid,
|
||||
VP msg,
|
||||
INT msgsz,
|
||||
TMO tmout
|
||||
)
|
||||
ID mbfid,
|
||||
VP msg,
|
||||
INT msgsz,
|
||||
TMO tmout
|
||||
)
|
||||
{
|
||||
return E_OK;
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -260,12 +261,12 @@ ER tsnd_mbf(
|
||||
*/
|
||||
|
||||
ER rcv_mbf(
|
||||
VP msg,
|
||||
INT *p_msgsz,
|
||||
ID mbfid
|
||||
)
|
||||
VP msg,
|
||||
INT *p_msgsz,
|
||||
ID mbfid
|
||||
)
|
||||
{
|
||||
return trcv_mbf(msg, p_msgsz, mbfid, TMO_FEVR);
|
||||
return trcv_mbf(msg, p_msgsz, mbfid, TMO_FEVR);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -273,12 +274,12 @@ ER rcv_mbf(
|
||||
*/
|
||||
|
||||
ER prcv_mbf(
|
||||
VP msg,
|
||||
INT *p_msgsz,
|
||||
ID mbfid
|
||||
)
|
||||
VP msg,
|
||||
INT *p_msgsz,
|
||||
ID mbfid
|
||||
)
|
||||
{
|
||||
return trcv_mbf(msg, p_msgsz, mbfid, TMO_POL);
|
||||
return trcv_mbf(msg, p_msgsz, mbfid, TMO_POL);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -286,54 +287,52 @@ ER prcv_mbf(
|
||||
*/
|
||||
|
||||
ER trcv_mbf(
|
||||
VP msg,
|
||||
INT *p_msgsz,
|
||||
ID mbfid,
|
||||
TMO tmout
|
||||
)
|
||||
VP msg,
|
||||
INT *p_msgsz,
|
||||
ID mbfid,
|
||||
TMO tmout
|
||||
)
|
||||
{
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
CORE_message_queue_Status status;
|
||||
boolean wait;
|
||||
Watchdog_Interval interval;
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
CORE_message_queue_Status status;
|
||||
boolean wait;
|
||||
Watchdog_Interval interval;
|
||||
|
||||
interval = 0;
|
||||
if (tmout == TMO_POL) {
|
||||
wait = FALSE;
|
||||
} else {
|
||||
wait = TRUE;
|
||||
if (tmout != TMO_FEVR)
|
||||
interval = TOD_MILLISECONDS_TO_TICKS(tmout);
|
||||
}
|
||||
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;
|
||||
if (wait && _ITRON_Is_in_non_task_state() )
|
||||
return E_CTX;
|
||||
|
||||
if (!p_msgsz || !msg || tmout <= -2)
|
||||
return E_PAR;
|
||||
if (!p_msgsz || !msg || tmout <= -2)
|
||||
return E_PAR;
|
||||
|
||||
the_message_buffer = _ITRON_Message_buffer_Get(mbfid, &location);
|
||||
switch (location) {
|
||||
the_message_buffer = _ITRON_Message_buffer_Get(mbfid, &location);
|
||||
switch (location) {
|
||||
case OBJECTS_REMOTE:
|
||||
case OBJECTS_ERROR: /* Multiprocessing not supported */
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error(mbfid);
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error(mbfid);
|
||||
|
||||
case OBJECTS_LOCAL:
|
||||
_CORE_message_queue_Seize(
|
||||
&the_message_buffer->message_queue,
|
||||
the_message_buffer->Object.id,
|
||||
msg,
|
||||
p_msgsz,
|
||||
wait,
|
||||
interval);
|
||||
_Thread_Enable_dispatch();
|
||||
status =
|
||||
(CORE_message_queue_Status)_Thread_Executing->Wait.return_code;
|
||||
return
|
||||
_ITRON_Message_buffer_Translate_core_message_buffer_return_code
|
||||
(status);
|
||||
|
||||
_CORE_message_queue_Seize(
|
||||
&the_message_buffer->message_queue,
|
||||
the_message_buffer->Object.id,
|
||||
msg,
|
||||
p_msgsz,
|
||||
wait,
|
||||
interval
|
||||
);
|
||||
_Thread_Enable_dispatch();
|
||||
status = (CORE_message_queue_Status)_Thread_Executing->Wait.return_code;
|
||||
return
|
||||
_ITRON_Message_buffer_Translate_core_message_buffer_return_code(status);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -351,62 +350,59 @@ ER trcv_mbf(
|
||||
*/
|
||||
|
||||
ER ref_mbf(
|
||||
T_RMBF *pk_rmbf,
|
||||
ID mbfid
|
||||
)
|
||||
T_RMBF *pk_rmbf,
|
||||
ID mbfid
|
||||
)
|
||||
{
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
ITRON_Message_buffer_Control *the_message_buffer;
|
||||
Objects_Locations location;
|
||||
CORE_message_queue_Control *the_core_msgq;
|
||||
|
||||
if ( !pk_rmbf )
|
||||
return E_PAR; /* XXX check this error code */
|
||||
if ( !pk_rmbf )
|
||||
return E_PAR; /* XXX check this error code */
|
||||
|
||||
the_message_buffer = _ITRON_Message_buffer_Get( mbfid, &location );
|
||||
switch ( location ) {
|
||||
case OBJECTS_REMOTE: /* Multiprocessing not supported */
|
||||
case OBJECTS_ERROR:
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error( mbfid );
|
||||
the_message_buffer = _ITRON_Message_buffer_Get( mbfid, &location );
|
||||
switch ( location ) {
|
||||
case OBJECTS_REMOTE: /* Multiprocessing not supported */
|
||||
case OBJECTS_ERROR:
|
||||
return _ITRON_Message_buffer_Clarify_get_id_error( mbfid );
|
||||
|
||||
case OBJECTS_LOCAL:
|
||||
/*
|
||||
* Fill in the size of message to be sent
|
||||
*/
|
||||
case OBJECTS_LOCAL:
|
||||
the_core_msgq = &the_message_buffer->message_queue;
|
||||
|
||||
if(the_message_buffer->message_queue.
|
||||
number_of_pending_messages == 0) {
|
||||
pk_rmbf->msgsz = 0;
|
||||
}
|
||||
else {
|
||||
CORE_message_queue_Buffer_control *the_message;
|
||||
the_message = (CORE_message_queue_Buffer_control*)
|
||||
the_message_buffer->message_queue.
|
||||
Pending_messages.first;
|
||||
pk_rmbf->msgsz = the_message->Contents.size;
|
||||
}
|
||||
/*
|
||||
* Fill in the size of message to be sent
|
||||
*/
|
||||
|
||||
if (the_core_msgq->number_of_pending_messages == 0) {
|
||||
pk_rmbf->msgsz = 0;
|
||||
} else {
|
||||
pk_rmbf->msgsz = ((CORE_message_queue_Buffer_control *)
|
||||
the_core_msgq->Pending_messages.first)->Contents.size;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill in the size of free buffer
|
||||
*/
|
||||
/*
|
||||
* Fill in the size of free buffer
|
||||
*/
|
||||
|
||||
pk_rmbf->frbufsz =
|
||||
(the_message_buffer->message_queue.maximum_pending_messages-
|
||||
the_message_buffer->message_queue.number_of_pending_messages)*
|
||||
the_message_buffer->message_queue.maximum_message_size;
|
||||
pk_rmbf->frbufsz =
|
||||
(the_core_msgq->maximum_pending_messages -
|
||||
the_core_msgq->number_of_pending_messages) *
|
||||
the_core_msgq->maximum_message_size;
|
||||
|
||||
|
||||
/*
|
||||
* Fill in whether or not there is a waiting task
|
||||
*/
|
||||
/*
|
||||
* Fill in whether or not there is a waiting task
|
||||
*/
|
||||
|
||||
if ( !_Thread_queue_First(
|
||||
&the_message_buffer->message_queue.Wait_queue ) )
|
||||
pk_rmbf->wtsk = FALSE;
|
||||
else
|
||||
pk_rmbf->wtsk = TRUE;
|
||||
if ( !_Thread_queue_First(&the_core_msgq->Wait_queue ) )
|
||||
pk_rmbf->wtsk = FALSE;
|
||||
else
|
||||
pk_rmbf->wtsk = TRUE;
|
||||
|
||||
pk_rmbf->stsk = FALSE;
|
||||
_Thread_Enable_dispatch();
|
||||
return E_OK;
|
||||
}
|
||||
pk_rmbf->stsk = FALSE;
|
||||
_Thread_Enable_dispatch();
|
||||
return E_OK;
|
||||
}
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user