epos_status_code epos_message_queue_send( epos_id id, const void *buffer, size_t size ) { register Message_queue_Control *the_message_queue; Objects_Locations location; CORE_message_queue_Status status; if ( !buffer ) return RTEMS_INVALID_ADDRESS; the_message_queue = _Message_queue_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: status = _CORE_message_queue_Send( &the_message_queue->message_queue, buffer, size, id, MESSAGE_QUEUE_MP_HANDLER, false, /* sender does not block */ 0 /* no timeout */ ); _Thread_Enable_dispatch(); /* * Since this API does not allow for blocking sends, we can directly * return the returned status. */ return _Message_queue_Translate_core_message_queue_return_code(status); #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: return _Message_queue_MP_Send_request_packet( MESSAGE_QUEUE_MP_SEND_REQUEST, id, buffer, &size, 0, /* option_set */ MPCI_DEFAULT_TIMEOUT ); break; #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; }
static rtems_status_code rtems_message_queue_send_timeout( rtems_id id, void *buffer, uint32_t size, rtems_interval timeout) { Message_queue_Control *the_message_queue; Objects_Locations location; CORE_message_queue_Status msg_status; the_message_queue = _Message_queue_Get( id, &location ); switch ( location ) { case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: msg_status = _CORE_message_queue_Send( &the_message_queue->message_queue, buffer, size, id, NULL, 1, timeout ); _Thread_Enable_dispatch(); /* * If we had to block, then this is where the task returns * after it wakes up. The returned status is correct for * non-blocking operations but if we blocked, then we need * to look at the status in our TCB. */ if ( msg_status == CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT ) msg_status = _Thread_Executing->Wait.return_code; return _Message_queue_Translate_core_message_queue_return_code( msg_status ); } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ }
rtems_status_code rtems_message_queue_send( rtems_id id, const void *buffer, size_t size ) { Message_queue_Control *the_message_queue; Thread_queue_Context queue_context; Status_Control status; if ( buffer == NULL ) { return RTEMS_INVALID_ADDRESS; } the_message_queue = _Message_queue_Get( id, &queue_context ); if ( the_message_queue == NULL ) { #if defined(RTEMS_MULTIPROCESSING) return _Message_queue_MP_Send( id, buffer, size ); #else return RTEMS_INVALID_ID; #endif } _CORE_message_queue_Acquire_critical( &the_message_queue->message_queue, &queue_context ); _Thread_queue_Context_set_MP_callout( &queue_context, _Message_queue_Core_message_queue_mp_support ); status = _CORE_message_queue_Send( &the_message_queue->message_queue, buffer, size, false, /* sender does not block */ &queue_context ); return _Status_Get( status ); }