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

📄 tkmbf.c

📁 T-kernel 的extension源代码
💻 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 + -