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

📄 mk_outp.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
|                 p_data       - pointer to dynamically allocated memory area  |
|                                containing the signal's parameter             |
|                                (NULL if parameter contained within signal)   |
|                 Receiver     - PID of the receiver-process                   |
|                                                                              |
|  Return       : 0 - no error (o.k.)                                          |
|                 1 - no more signals left free                                |
|                 2 - no more memory allocatable                               |
|                 3 - semantic error (cannot send to NULL-PID, ..)             |
|                 4 - no error - signal was sent to environment                |
|                 5 - Indexing error in receiver - PID                         |
|                 6 - System is suspended                                      |
|                                                                              |
+------------------------------------------------------------------------------+
*/
/*-FHDR E*/

/*+FDEF E*/

#ifndef XNOPROTO

         RETDCL xmk_Send(xmk_T_SIGNAL sig

                         #ifdef XMK_USE_SIGNAL_PRIORITIES
                          , xmk_T_PRIO prio
                         #endif

                         #ifdef XMK_USED_SIGNAL_WITH_PARAMS
                          , xmk_T_MESS_LENGTH data_len,
                           void               xmk_RAM_ptr p_data
                         #endif

                         #ifdef XMK_USE_RECEIVER_PID_IN_SIGNAL
                          , xPID Receiver
                         #endif
                         )

#else

         RETDCL xmk_Send (sig

                          #ifdef XMK_USE_SIGNAL_PRIORITIES
                          ,  prio
                          #endif

                          #ifdef XMK_USED_SIGNAL_WITH_PARAMS
                          , data_len,
                            p_data
                          #endif

                          #ifdef XMK_USE_RECEIVER_PID_IN_SIGNAL
                          , Receiver
                          #endif

                          )

                          xmk_T_SIGNAL       sig;

                          #ifdef XMK_USE_SIGNAL_PRIORITIES
                            xmk_T_PRIO         prio;
                          #endif

                          #ifdef XMK_USED_SIGNAL_WITH_PARAMS
                            xmk_T_MESS_LENGTH  data_len;
                            void               xmk_RAM_ptr p_data;
                          #endif

                          #ifdef XMK_USE_RECEIVER_PID_IN_SIGNAL
                            xPID               Receiver;
                          #endif

#endif

/*-FDEF E*/
{
  X_REGISTER xmk_T_MESSAGE  xmk_RAM_ptr P_Signal;  /* Pointer to signal             */

  #ifdef XMK_USED_SIGNAL_WITH_PARAMS
    X_STATIC   void   xmk_RAM_ptr P_Parameter     ;  /* Pointer to signal's parameter */
  #endif

  #ifdef XMK_USE_SIGNAL_TIME_STAMP
    xmk_T_TIME timestamp            ;  /* set signal's timestamp        */
  #endif

  #ifdef XMK_ADD_PRINTF_OUTPUT
    XMK_FUNCTION("xmk_Send");
  #endif

  #ifdef XMK_USE_DEBUGGING
    if (xmk_SystemState & XMK_SYSTEM_SUSPENDED)
    {
      #ifdef XMK_ADD_PRINTF_OUTPUT
        XMK_TRACE_EXIT("xmk_Send");
      #endif
      RETURN(6);
    }
  #endif

  #ifdef XMK_ADD_PRINTF_ADDITIONAL
    STDOUT_WRITE_SIG(sig)              ;
    STDOUT_WRITE_PRIO(prio)            ;
    if (OUTPUT_IS_NOT_A_TIMER)
    {
      STDOUT_WRITE_SEND(xRunPID)       ;
    }
    else
    {
      STDOUT_WRITE_SEND( XCOND_RECEIVER( Receiver ) ) ;
    }
    STDOUT_WRITE_REC( XCOND_RECEIVER( Receiver) )     ;
    STDOUT_WRITE_DATA(data_len,p_data) ;
  #endif

  #ifdef XMK_USE_SIGNAL_TIME_STAMP
    #ifdef XMK_ADD_REALTIME_PLAY
      timestamp   = xmk_NOW() - xmk_StartupTime ;
    #else
      timestamp   = xmk_NOW()         ;
    #endif  
  #endif

  /*
  **   Check if correct Receiver
  **   (unnecessary of using SDT-Analyzer)
  */
  #ifdef XMK_USE_MAX_ERR_CHECK
    if (Receiver == xNULLPID)
    {
      ErrorHandler (ERR_N_SEND_TO_NULLPID);
      #ifdef XMK_ADD_PRINTF_OUTPUT
        XMK_TRACE_EXIT("xmk_Send");
      #endif
      RETURN (3);
    }
  #endif

  #ifdef XMK_ADD_TOUTPUT
    /*
    **   Outputtrace and redirecting the
    **   signal, if necessary ....
    */
    if ( xmk_TSDL_Output ( sig                         ,
                           XCOND_PRIO      (prio)      ,
                           XCOND_TIMESTAMP (timestamp) ,
                           XCOND_DATA_LEN  (data_len)  ,
                           XCOND_DATA      (p_data)    ,
                           XCOND_RECEIVER  (Receiver)  ) != XMK_OKAY )
    {
      /*
      ** and if something was wrong with the
      ** signal (parameters), then discard the signal ...
      */
      #ifdef XMK_ADD_PRINTF_OUTPUT
        XMK_TRACE_EXIT("xmk_Send");
      #endif
      RETURN (2);
    }
  #endif /* ... XMK_ADD_TOUTPUT */

  /*
  ** Send to environment ?
  */
  if ( XCOND_RECEIVER( Receiver ) == ENV)
  {
    #ifdef XMK_USE_xOutEnv
      /*
      ** Direct signal to the environment
      */
      if ( xOutEnv (sig
                    #ifdef XMK_USE_SIGNAL_PRIORITIES
                      , prio
                    #endif
                    #ifdef XMK_USED_SIGNAL_WITH_PARAMS
                      , data_len, p_data
                    #endif
                    #ifdef XMK_USE_RECEIVER_PID_IN_SIGNAL
                      , Receiver
                    #endif
                    ) == XMK_TRUE )
      {
        /* 
        ** Signal was correctly sent to the Environment 
        */
        #ifdef XMK_ADD_PRINTF_OUTPUT
          XMK_TRACE_EXIT("xmk_Send");
        #endif
        RETURN (4);
      }
      else
    #endif /*... XMK_USE_xOutEnv */
      {
        /* 
        ** Signal was not consumed in the Environment,
        ** this is an error !
        */
        ErrorHandler (ERR_N_xOutEnv);
        #ifdef XMK_ADD_PRINTF_OUTPUT
          XMK_TRACE_EXIT("xmk_Send");
        #endif
        RETURN (4);
      } /* ... if ( xOutEnv (sig ... */
  } /* ...   if ( XCOND_RECEIVER( Receiver ) == ENV) */

  /*
  ** Signal not to be sent to the environment
  */
  #ifdef XMK_USE_BROADCAST_OUTPUT
    if (sig == BROADCAST)
      xmk_DistributeSignal (sig
                            #ifdef XMK_USE_SIGNAL_PRIORITIES
                            , prio
                            #endif
                            #ifdef XMK_USED_SIGNAL_WITH_PARAMS
                            , data_len, p_data
                            #endif
                            );
  #endif /* ... XMK_USE_BROADCAST_OUTPUT */

  #ifdef XMK_USE_RECEIVER_PID_IN_SIGNAL
    #ifdef XMK_USE_MAX_ERR_CHECK
      if (! xmk_IfExist (Receiver))
      {
        ErrorHandler(ERR_N_PID_INDEX);
        #ifdef XMK_ADD_PRINTF_OUTPUT
          XMK_TRACE_EXIT("xmk_Send");
        #endif

        RETURN (5);
      }
    #endif /* ... XMK_USE_MAX_ERR_CHECK */
  #endif /* ... XMK_USE_RECEIVER_PID_IN_SIGNAL */

  /*
  ** Allocate signal. If there is no free signal 
  ** instance left, return with an error code
  */
  P_Signal = xmk_AllocSignal();
  if (P_Signal == NULL)
  {
        ErrorHandler (ERR_N_NO_FREE_SIGNAL);
        #ifdef XMK_ADD_PRINTF_OUTPUT
          XMK_TRACE_EXIT("xmk_Send");
        #endif

    RETURN (1);
  }

  P_Signal->signal      = sig         ; /* set signal's code                  */
  #ifdef XMK_USE_SIGNAL_PRIORITIES
    P_Signal->prio        = prio      ; /* set signal's priority              */
  #endif
  #ifdef XMK_USE_SIGNAL_TIME_STAMP
    P_Signal->timestamp   = timestamp ; /* set signal's timestamp             */
  #endif
  #ifdef XMK_USED_SIGNAL_WITH_PARAMS
     P_Signal->mess_length = data_len ; /* set length of signal's parameter   */
  #endif
  #ifdef XMK_USE_RECEIVER_PID_IN_SIGNAL
    P_Signal->rec         = Receiver  ; /* set signal's receiver              */
  #endif

  #ifdef XMK_USE_SENDER_PID_IN_SIGNAL
    #if defined(XMK_USED_TIMER) && defined(XMK_USED_SENDER)
      if (OUTPUT_IS_A_TIMER)
      {
        P_Signal->send      = Receiver  ; /* set signal's sender           */
      }
      else
    #endif
    {
      P_Signal->send        = xRunPID   ; /* set signal's sender           */
    }
   #endif

  /*
  **  if number of bytes of the signal's parameter is greater than
  **  the number of bytes contained in the signal
  */
#ifdef XMK_USED_SIGNAL_WITH_PARAMS
  if (data_len > XMK_MSG_BORDER_LEN)
  {
    /*
    ** Allocate memory area
    */
    P_Parameter = (xmk_T_MESSAGE xmk_RAM_ptr ) xAlloc (data_len);

    /*
    ** if memory allocation failed, free signal and return errorcode
    */
    if (P_Parameter == NULL)
    {
      ErrorHandler (ERR_N_PARAMETER_MEM_ALLOC);
      xmk_FreeSignal (P_Signal);
          #ifdef XMK_ADD_PRINTF_OUTPUT
            XMK_TRACE_EXIT("xmk_Send");
          #endif

      RETURN (2);
    }

    /*
    ** copy parameter into the allocated memory area
    */
    (void)memcpy (P_Parameter, p_data, data_len); /* accept cast problem in cast from u_int to int. */

    /*
    **  store pointer to memory area in signal
    */
    P_Signal->ParUnion.ParPtr = P_Parameter;
  }

  /*
  ** if parameters can be stored within the signal itself
  */
  else
  {
    if( data_len > 0 )
    {
      /*
      ** copy the parameters into the signal
      */
      (void)memcpy ((void xmk_RAM_ptr ) (P_Signal->ParUnion.ParCopy), (void xmk_RAM_ptr) p_data,
                XMK_MSG_BORDER_LEN);

⌨️ 快捷键说明

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