📄 tkmbf.c
字号:
/* *---------------------------------------------------------------------- * T-Kernel / Standard Extension * * Copyright (C) 2006 by Ken Sakamura. All rights reserved. * T-Kernel / Standard Extension is distributed * under the T-License for T-Kernel / Standard Extension. *---------------------------------------------------------------------- * * Version: 1.00.00 * Released by T-Engine Forum(http://www.t-engine.org) at 2006/8/11. * *---------------------------------------------------------------------- *//* * tkmbf.c (taskcomm) * * T-Kernel compatible message buffer */#include "tcmgr.h"/* * Generate message buffer * T_CMBF * exinf Ignored * mbfatr TA_NODISWAI cannot be specified * mbfatr := (TA_TFIFO || TA_TPRI) | TA_DELEXIT * maxmsz Up to 4096 bytes * * Maximum message size can be changed by * TcBufLim of SYSCONF. */EXPORT ID _tkse_cre_mbf( T_CMBF *pk_cmbf ){ T_CMBF cmbf; ID id; ER err; /* Parameter check */ err = ChkSpaceR(pk_cmbf, sizeof(T_CMBF)); if ( err < E_OK ) { goto err_ret1; } if ( (pk_cmbf->mbfatr & (TA_DSNAME | TA_NODISWAI) ) != 0U ) { err = E_RSATR; goto err_ret1; } err = tcmTkCheckBuffSize(pk_cmbf->maxmsz); if ( err < E_OK ) { goto err_ret1; } cmbf = *pk_cmbf; if ( (pk_cmbf->mbfatr & (UW)TA_DELEXIT) != 0U ) { cmbf.exinf = GetTCinfo(TSK_SELF); cmbf.mbfatr &= ~(UW)TA_DELEXIT; } else { cmbf.exinf = NULL; } /* Generate message buffer */ id = tk_cre_mbf(&cmbf); if ( id < E_OK ) { err = id; goto err_ret1; } id = toBID(O_MBF, id); if (cmbf.exinf != NULL) { /* Register ID for deletion at termination. */ err = tcmTkRegistObject(id); if ( err < E_OK ) { goto err_ret2; } } return id;err_ret2: (void)tk_del_mbf(toIID(id));err_ret1: DEBUG_PRINT(("_tkse_cre_mbf err = %d\n", err)); return err;}/* * Delete message buffer * When message buffer generation process terminates, * the message buffer is deleted automatically. */EXPORT ER _tkse_del_mbf( ID id ){ TCINFO *tcinfo; T_RMBF rmbf; ER err; /* Check ID */ err = tcmTkCheckID(O_MBF, id); if ( err < E_OK ) { goto err_ret; } /* Obtain message buffer information */ err = tk_ref_mbf(toIID(id), &rmbf); if ( err < E_OK ) { goto err_ret; } tcinfo = rmbf.exinf; /* Message buffer generation process */ /* Delete message buffer */ err = tk_del_mbf(toIID(id)); if ( err < E_OK ) { goto err_ret; } if ( tcinfo != NULL ) { /* Deregister ID */ err = tcmTkDeleteObject(id, tcinfo); if ( err < E_OK ) { goto err_ret; } } return E_OK;err_ret: DEBUG_PRINT(("_tkse_del_mbf err = %d\n", err)); return err;}/* * Send to message buffer * When interrupted by message handler, * wait state is reset and E_DISWAI is returned. */EXPORT ER _tkse_snd_mbf( ID id, VP msg, INT sz, TMO tmout ){ ER err; /* Parameter check */ if ( ((err = tcmTkCheckBuffSize(sz)) < E_OK ) || ((err = ChkSpaceR(msg, sz)) < E_OK )) { goto err_ret; } /* Check ID */ err = tcmTkCheckID(O_MBF, id); if ( err < E_OK ) { goto err_ret; }#if VIRTUAL_ADDRESS /* In the case of virtual storage, message is copied on system stack. */ msg = memcpy(alloca((size_t)sz), msg, (size_t)sz);#endif /* Send message */ err = tk_snd_mbf(toIID(id), msg, sz, tmout); if ( err < E_OK ) { goto err_ret; } return E_OK;err_ret: DEBUG_PRINT(("_tkse_snd_mbf err = %d\n", err)); return err;}/* * Receive from message buffer * When interrupted by message handler, * wait state is reset and E_DISWAI is returned. */EXPORT INT _tkse_rcv_mbf( ID id, VP msg, TMO tmout ){ T_RMBF rmbf; VP rbuf; INT rsz; ER err; /* Check ID */ err = tcmTkCheckID(O_MBF, id); if ( err < E_OK ) { goto err_ret; } /* Obtain message buffer information */ err = tk_ref_mbf(toIID(id), &rmbf); if ( err < E_OK ) { goto err_ret; } /* Address check */ err = ChkSpaceRW(msg, rmbf.maxmsz); if ( err < E_OK ) { goto err_ret; }#if VIRTUAL_ADDRESS /* In the case of virtual storage, message is received on system stack first. */ rbuf = alloca((size_t)rmbf.maxmsz);#else rbuf = msg;#endif /* Receive message */ rsz = tk_rcv_mbf(toIID(id), rbuf, tmout); if ( rsz < E_OK ) { err = rsz; goto err_ret; }#if VIRTUAL_ADDRESS /* Copied from system stack to specified buffer. */ memcpy(msg, rbuf, (size_t)rsz);#endif return rsz;err_ret: DEBUG_PRINT(("_tkse_rcv_mbf err = %d\n", err)); return err;}/* * Refer to message buffer state * T_RMBF * exinf Always return NULL */EXPORT ER _tkse_ref_mbf( ID id, T_RMBF *pk_rmbf ){ T_RMBF rmbf; ER err; /* Parameter check */ err = ChkSpaceRW(pk_rmbf, sizeof(T_RMBF)); if ( err < E_OK ) { goto err_ret; } /* Check ID */ err = tcmTkCheckID(O_MBF, id); if ( err < E_OK ) { goto err_ret; } /* Obtain message buffer information */ err = tk_ref_mbf(toIID(id), &rmbf); if ( err < E_OK ) { goto err_ret; } *pk_rmbf = rmbf; pk_rmbf->exinf = NULL; return E_OK;err_ret: DEBUG_PRINT(("_tkse_ref_mbf err = %d\n", err)); return err;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -