mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-10 17:08:09 +08:00
@@ -101,27 +101,6 @@ RTEMS_INLINE_ROUTINE void _Message_queue_Free (
|
||||
_Objects_Free( &_Message_queue_Information, &the_message_queue->Object );
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Maps message queue IDs to message queue control blocks.
|
||||
*
|
||||
* This function maps message queue IDs to message queue control
|
||||
* blocks. If ID corresponds to a local message queue, then it
|
||||
* returns the_message_queue control pointer which maps to ID
|
||||
* and location is set to OBJECTS_LOCAL. If the message queue ID is
|
||||
* global and resides on a remote node, then location is set
|
||||
* to OBJECTS_REMOTE, and the_message_queue is undefined.
|
||||
* Otherwise, location is set to OBJECTS_ERROR and
|
||||
* the_message_queue is undefined.
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE Message_queue_Control *_Message_queue_Get (
|
||||
Objects_Id id,
|
||||
Objects_Locations *location
|
||||
)
|
||||
{
|
||||
return (Message_queue_Control *)
|
||||
_Objects_Get( &_Message_queue_Information, id, location );
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE Message_queue_Control *
|
||||
_Message_queue_Get_interrupt_disable(
|
||||
Objects_Id id,
|
||||
|
||||
@@ -18,55 +18,42 @@
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/system.h>
|
||||
#include <rtems/score/chain.h>
|
||||
#include <rtems/score/isr.h>
|
||||
#include <rtems/score/coremsgimpl.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/wkspace.h>
|
||||
#include <rtems/rtems/status.h>
|
||||
#include <rtems/rtems/attrimpl.h>
|
||||
#include <rtems/rtems/messageimpl.h>
|
||||
#include <rtems/rtems/options.h>
|
||||
#include <rtems/rtems/support.h>
|
||||
|
||||
/*
|
||||
* rtems_message_queue_get_number_pending
|
||||
*
|
||||
* This directive returns the number of messages pending.
|
||||
*
|
||||
* Input parameters:
|
||||
* id - queue id
|
||||
* count - return area for count
|
||||
*
|
||||
* Output parameters:
|
||||
* count - number of messages removed ( 0 = empty queue )
|
||||
* RTEMS_SUCCESSFUL - if successful
|
||||
* error code - if unsuccessful
|
||||
*/
|
||||
|
||||
rtems_status_code rtems_message_queue_get_number_pending(
|
||||
rtems_id id,
|
||||
uint32_t *count
|
||||
)
|
||||
{
|
||||
Message_queue_Control *the_message_queue;
|
||||
Objects_Locations location;
|
||||
Message_queue_Control *the_message_queue;
|
||||
Objects_Locations location;
|
||||
ISR_lock_Context lock_context;
|
||||
|
||||
if ( !count )
|
||||
return RTEMS_INVALID_ADDRESS;
|
||||
|
||||
the_message_queue = _Message_queue_Get( id, &location );
|
||||
the_message_queue = _Message_queue_Get_interrupt_disable(
|
||||
id,
|
||||
&location,
|
||||
&lock_context
|
||||
);
|
||||
switch ( location ) {
|
||||
|
||||
case OBJECTS_LOCAL:
|
||||
_CORE_message_queue_Acquire_critical(
|
||||
&the_message_queue->message_queue,
|
||||
&lock_context
|
||||
);
|
||||
*count = the_message_queue->message_queue.number_of_pending_messages;
|
||||
_Objects_Put( &the_message_queue->Object );
|
||||
_CORE_message_queue_Release(
|
||||
&the_message_queue->message_queue,
|
||||
&lock_context
|
||||
);
|
||||
return RTEMS_SUCCESSFUL;
|
||||
|
||||
#if defined(RTEMS_MULTIPROCESSING)
|
||||
case OBJECTS_REMOTE:
|
||||
_Thread_Executing->Wait.return_argument = count;
|
||||
_Thread_Get_executing()->Wait.return_argument = count;
|
||||
|
||||
return _Message_queue_MP_Send_request_packet(
|
||||
MESSAGE_QUEUE_MP_GET_NUMBER_PENDING_REQUEST,
|
||||
|
||||
Reference in New Issue
Block a user