📄 fastmlock.c
字号:
/* *---------------------------------------------------------------------- * T-Kernel * * Copyright (C) 2004 by Ken Sakamura. All rights reserved. * T-Kernel is distributed under the T-License. *---------------------------------------------------------------------- * * Version: 1.01.00 * Released by T-Engine Forum(http://www.t-engine.org) at 2004/6/28. * *---------------------------------------------------------------------- *//* * @(#)fastmlock.c (libtk) * * High-speed exclusive control multi-lock */#include <basic.h>#include <tk/tkernel.h>#include <tk/util.h>#include <libstr.h>/* ------------------------------------------------------------------------ *//* * void INC( INT *val ) increment * void DEC( INT *val ) decrement * BOOL BTS( UINT *val, INT no ) bit test and set * void BR( UINT *val, INT no ) bit reset * * The above must be operated exclusively. */Inline void INC( INT *val ){ UINT imask; DI(imask); (*val)++; EI(imask);}Inline void DEC( INT *val ){ UINT imask; DI(imask); (*val)--; EI(imask);}Inline BOOL BTS( UINT *val, INT no ){ UINT imask; UINT b; UINT bm = 1 << no; DI(imask); b = *val & bm; *val |= bm; EI(imask); return b;}Inline void BR( UINT *val, INT no ){ UINT imask; DI(imask); *val &= ~(1 << no); EI(imask);}/* ------------------------------------------------------------------------ *//* * Lock with wait time designation * no lock number 0 - 31 */EXPORT ER MLockTmo( FastMLock *lock, INT no, TMO tmo ){ UINT ptn = 1 << no; UINT flg; ER err; INC(&lock->wai); for ( ;; ) { if ( !BTS(&lock->flg, no) ) { err = E_OK; break; } err = tk_wai_flg(lock->id, ptn, TWF_ORW|TWF_BITCLR, &flg, tmo); if ( err < E_OK ) break; } DEC(&lock->wai); return err;}/* * Lock * no Lock number 0 - 31 */EXPORT ER MLock( FastMLock *lock, INT no ){ return MLockTmo(lock, no, TMO_FEVR);}/* * Lock release * no Lock number 0 - 31 */EXPORT ER MUnlock( FastMLock *lock, INT no ){ UINT ptn = 1 << no; ER err; BR(&lock->flg, no); err = ( lock->wai == 0 )? E_OK: tk_set_flg(lock->id, ptn); return err;}/* * Create multi-lock */EXPORT ER CreateMLock( FastMLock *lock, UB *name ){ T_CFLG cflg; ER err; if ( name == NULL ) { cflg.exinf = NULL; } else { strncpy((B*)&cflg.exinf, name, sizeof(cflg.exinf)); } cflg.flgatr = TA_TPRI | TA_WMUL | TA_NODISWAI; cflg.iflgptn = 0; lock->id = err = tk_cre_flg(&cflg); if ( err < E_OK ) return err; lock->wai = 0; lock->flg = 0; return E_OK;}/* * Delete multi-lock */EXPORT ER DeleteMLock( FastMLock *lock ){ ER err; if ( lock->id <= 0 ) return E_PAR; err = tk_del_flg(lock->id); if ( err < E_OK ) return err; lock->id = 0; return E_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -