📄 tksem.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. * *---------------------------------------------------------------------- *//* * tksem.c (taskcomm) * * T-Kernel compatible semaphore */#include "tcmgr.h"/* * Generate semaphore * T_CSEM * exinf Ignored * sematr TA_NODISWAI cannot be specified * sematr:= (TA_TFIFO || TA_TPRI) | * (TA_FIRST || TA_CNT) | TA_DELEXIT */EXPORT ID _tkse_cre_sem( T_CSEM *pk_csem ){ T_CSEM csem; ID id; ER err; /* Parameter check */ err = ChkSpaceR(pk_csem, sizeof(T_CSEM)); if ( err < E_OK ) { goto err_ret1; } if ( (pk_csem->sematr & (TA_DSNAME | TA_NODISWAI) ) != 0U ) { err = E_RSATR; goto err_ret1; } csem = *pk_csem; if ( (pk_csem->sematr & (UW)TA_DELEXIT) != 0U ) { csem.exinf = GetTCinfo(TSK_SELF); csem.sematr &= ~(UW)TA_DELEXIT; } else { csem.exinf = NULL; } /* Generate semaphore */ id = tk_cre_sem(&csem); if ( id < E_OK ) { err = id; goto err_ret1; } id = toBID(O_SEM, id); if (csem.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_sem(toIID(id));err_ret1: DEBUG_PRINT(("_tkse_cre_sem err = %d\n", err)); return err;}/* * Delete semaphore * When semaphore generation process terminates, * the semaphore is deleted automatically. */EXPORT ER _tkse_del_sem( ID id ){ TCINFO *tcinfo; T_RSEM rsem; ER err; /* Check ID */ err = tcmTkCheckID(O_SEM, id); if ( err < E_OK ) { goto err_ret; } /* Obtain semaphore information */ err = tk_ref_sem(toIID(id), &rsem); if ( err < E_OK ) { goto err_ret; } tcinfo = rsem.exinf; /* Generation process */ /* Delete semaphore */ err = tk_del_sem(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_sem err = %d\n", err)); return err;}/* * Return resource to semaphore */EXPORT ER _tkse_sig_sem( ID id, INT cnt ){ ER err; /* Check ID */ err = tcmTkCheckID(O_SEM, id); if ( err < E_OK ) { goto err_ret; } /* Return semaphore */ err = tk_sig_sem(toIID(id), cnt); if ( err < E_OK ) { goto err_ret; } return E_OK;err_ret: DEBUG_PRINT(("_tkse_sig_sem err = %d\n", err)); return err;}/* * Obtain resource from semaphore * When interrupted by message handler, * wait state is reset and E_DISWAI is returned. */EXPORT ER _tkse_wai_sem( ID id, INT cnt, TMO tmout ){ ER err; /* Check ID */ err = tcmTkCheckID(O_SEM, id); if ( err < E_OK ) { goto err_ret; } /* Obtain semaphore */ err = tk_wai_sem(toIID(id), cnt, tmout); if ( err < E_OK ) { goto err_ret; } return E_OK;err_ret: DEBUG_PRINT(("_tkse_wai_sem err = %d\n", err)); return err;}/* * Refer to semaphore state * T_RSEM * exinf Always return NULL */EXPORT ER _tkse_ref_sem( ID id, T_RSEM *pk_rsem ){ T_RSEM rsem; ER err; /* Parameter check */ err = ChkSpaceRW(pk_rsem, sizeof(T_RSEM)); if ( err < E_OK ) { goto err_ret; } /* Check ID */ err = tcmTkCheckID(O_SEM, id); if ( err < E_OK ) { goto err_ret; } /* Obtain semaphore information */ err = tk_ref_sem(toIID(id), &rsem); if ( err < E_OK ) { goto err_ret; } *pk_rsem = rsem; pk_rsem->exinf = NULL; return E_OK;err_ret: DEBUG_PRINT(("_tkse_ref_sem err = %d\n", err)); return err;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -