📄 tkflg.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. * *---------------------------------------------------------------------- *//* * tkflg.c (taskcomm) * * T-Kernel compatible event flag */#include "tcmgr.h"/* * Generate event flag * T_CFLG * exinf Ignored * flgatr TA_NODISWAI cannot be specified * flgatr:= (TA_TFIFO || TA_TPRI) | * (TA_WMUL || TA_WSGL) | TA_DELEXIT */EXPORT ID _tkse_cre_flg( T_CFLG *pk_cflg ){ T_CFLG cflg; ID id; ER err; /* Parameter check */ err = ChkSpaceR(pk_cflg, sizeof(T_CFLG)); if ( err < E_OK ) { goto err_ret1; } if ( (pk_cflg->flgatr & (TA_DSNAME | TA_NODISWAI) ) != 0U ) { err = E_RSATR; goto err_ret1; } cflg = *pk_cflg; if ( (pk_cflg->flgatr & (UW)TA_DELEXIT) != 0U ) { cflg.exinf = GetTCinfo(TSK_SELF); cflg.flgatr &= ~(UW)TA_DELEXIT; } else { cflg.exinf = NULL; } /* Generate event flag */ id = tk_cre_flg(&cflg); if ( id < E_OK ) { err = id; goto err_ret1; } id = toBID(O_FLG, id); if (cflg.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_flg(toIID(id));err_ret1: DEBUG_PRINT(("_tkse_cre_flg err = %d\n", err)); return err;}/* * Delete event flag * When event flag generation process terminates, * the event flag is deleted automatically. */EXPORT ER _tkse_del_flg( ID id ){ TCINFO *tcinfo; T_RFLG rflg; ER err; /* Check ID */ err = tcmTkCheckID(O_FLG, id); if ( err < E_OK ) { goto err_ret; } /* Obtain event flag information */ err = tk_ref_flg(toIID(id), &rflg); if ( err < E_OK ) { goto err_ret; } tcinfo = rflg.exinf; /* Event flag generation process */ /* Delete event flag */ err = tk_del_flg(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_flg err = %d\n", err)); return err;}/* * Set event flag */EXPORT ER _tkse_set_flg( ID id, UINT setptn ){ ER err; /* Check ID */ err = tcmTkCheckID(O_FLG, id); if ( err < E_OK ) { goto err_ret; } /* Set event flag */ err = tk_set_flg(toIID(id), setptn); if ( err < E_OK ) { goto err_ret; } return E_OK;err_ret: DEBUG_PRINT(("_tkse_set_flg err = %d\n", err)); return err;}/* * Clear event flag */EXPORT ER _tkse_clr_flg( ID id, UINT clrptn ){ ER err; /* Check ID */ err = tcmTkCheckID(O_FLG, id); if ( err < E_OK ) { goto err_ret; } /* Clear event flag */ err = tk_clr_flg(toIID(id), clrptn); if ( err < E_OK ) { goto err_ret; } return E_OK;err_ret: DEBUG_PRINT(("_tkse_clr_flg err = %d\n", err)); return err;}/* * Wait for event flag * When interrupted by message handler, * wait state is reset and E_DISWAI is returned. */EXPORT ER _tkse_wai_flg( ID id, UINT waiptn, UINT wfmode, UINT *p_flgptn, TMO tmout ){ UINT flgptn; ER err; /* Parameter check */ err = ChkSpaceRW(p_flgptn, sizeof(UINT)); if ( err < E_OK ) { goto err_ret; } /* Check ID */ err = tcmTkCheckID(O_FLG, id); if ( err < E_OK ) { goto err_ret; } /* Wait for event flag */ err = tk_wai_flg(toIID(id), waiptn, wfmode, &flgptn, tmout); if ( err < E_OK ) { goto err_ret; } *p_flgptn = flgptn; return E_OK;err_ret: DEBUG_PRINT(("_tkse_wai_flg err = %d\n", err)); return err;}/* * Refer to event flag state * T_RFLG * exinf Always return NULL */EXPORT ER _tkse_ref_flg( ID id, T_RFLG *pk_rflg ){ T_RFLG rflg; ER err; /* Parameter check */ err = ChkSpaceRW(pk_rflg, sizeof(T_RFLG)); if ( err < E_OK ) { goto err_ret; } /* Check ID */ err = tcmTkCheckID(O_FLG, id); if ( err < E_OK ) { goto err_ret; } /* Obtain event flag information */ err = tk_ref_flg(toIID(id), &rflg); if ( err < E_OK ) { goto err_ret; } *pk_rflg = rflg; pk_rflg->exinf = NULL; return E_OK;err_ret: DEBUG_PRINT(("_tkse_ref_flg err = %d\n", err)); return err;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -