⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coremsgbroadcast.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
字号:
/* *  CORE Message Queue Handler * *  DESCRIPTION: * *  This package is the implementation of the CORE Message Queue Handler. *  This core object provides task synchronization and communication functions *  via messages passed to queue objects. * *  COPYRIGHT (c) 1989-1999. *  On-Line Applications Research Corporation (OAR). * *  The license and distribution terms for this file may be *  found in the file LICENSE in this distribution or at *  http://www.rtems.com/license/LICENSE. * *  $Id: coremsgbroadcast.c,v 1.3.6.1 2003/09/04 18:52:47 joel Exp $ */#include <rtems/system.h>#include <rtems/score/chain.h>#include <rtems/score/isr.h>#include <rtems/score/object.h>#include <rtems/score/coremsg.h>#include <rtems/score/states.h>#include <rtems/score/thread.h>#include <rtems/score/wkspace.h>#if defined(RTEMS_MULTIPROCESSING)#include <rtems/score/mpci.h>#endif/*PAGE * *  _CORE_message_queue_Broadcast * *  This function sends a message for every thread waiting on the queue and *  returns the number of threads made ready by the message. * *  Input parameters: *    the_message_queue            - message is submitted to this message queue *    buffer                       - pointer to message buffer *    size                         - size in bytes of message to send *    id                           - id of message queue *    api_message_queue_mp_support - api specific mp support callout *    count                        - area to store number of threads made ready * *  Output parameters: *    count                         - number of threads made ready *    CORE_MESSAGE_QUEUE_SUCCESSFUL - if successful *    error code                    - if unsuccessful */CORE_message_queue_Status _CORE_message_queue_Broadcast(  CORE_message_queue_Control                *the_message_queue,  void                                      *buffer,  unsigned32                                 size,  Objects_Id                                 id,  CORE_message_queue_API_mp_support_callout  api_message_queue_mp_support,  unsigned32                                *count){  Thread_Control          *the_thread;  unsigned32               number_broadcasted;  Thread_Wait_information *waitp;  unsigned32               constrained_size;  /*   *  If there are pending messages, then there can't be threads   *  waiting for us to send them a message.   *   *  NOTE: This check is critical because threads can block on   *        send and receive and this ensures that we are broadcasting   *        the message to threads waiting to receive -- not to send.   */  if ( the_message_queue->number_of_pending_messages != 0 ) {    *count = 0;    return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;  }  /*   *  There must be no pending messages if there is a thread waiting to   *  receive a message.   */  number_broadcasted = 0;  while ((the_thread = _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) {    waitp = &the_thread->Wait;    number_broadcasted += 1;    constrained_size = size;    if ( size > the_message_queue->maximum_message_size )        constrained_size = the_message_queue->maximum_message_size;    _CORE_message_queue_Copy_buffer(      buffer,      waitp->return_argument,      constrained_size    );    *(unsigned32 *)the_thread->Wait.return_argument_1 = size;#if defined(RTEMS_MULTIPROCESSING)    if ( !_Objects_Is_local_id( the_thread->Object.id ) )      (*api_message_queue_mp_support) ( the_thread, id );#endif  }  *count = number_broadcasted;  return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -