📄 mk_outp.c
字号:
| 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 + -