📄 multsk.c
字号:
/*
* asixos/fs/multsk.c
*
* Copyright (C) 2002 Asic Center
*
* 2002-08-21 Created by Pessia
*/
/*
* 'multsk.c' is the file of multi-task operation in AsixOS file system.
* It contains
*/
#include <kernel\ros33\ros33.h>
#include <..\syssrc\kernel\ros33\drball\internal.h>
/*
* Get current task's read/write pointer of the file according to the
* flag 'fp'.
* Return value:
* >0: curp
* 0 : failed
*/
unsigned int get_curp( unsigned int fp ){
register T_FSCB_ITEM *p;
unsigned int curp;
register int i;
UH psr;
curp = 0;
psr = ent_cri();
p = (T_FSCB_ITEM *)(g_pCurTsk->fscb.items);
for ( i=0; i<MAX_OPENED_FILE_NUM_PER_TASK; i++, p++ ){
if ( fp == p->fp ){
curp = p->curp;
break;
}
}
ret_cri(psr);
return curp;
}
/*
* Set current task's read/write pointer of the file according to the
* flag 'fp'.
* Return value:
* >0: curp
* 0 : failed
*/
unsigned int set_curp( unsigned int fp, unsigned int curp ){
register T_FSCB_ITEM *p;
register int i;
UH psr;
psr = ent_cri();
p = (T_FSCB_ITEM *)(g_pCurTsk->fscb.items);
for ( i=0; i<MAX_OPENED_FILE_NUM_PER_TASK; i++, p++ ){
if ( fp == p->fp ){
p->curp = curp;
break;
}
}
ret_cri(psr);
return curp;
}
/*
* Init 'T_FSCB'.
* It is only called during system initial, so it needn't
* critical section.
*/
void init_fscb( T_FSCB *pfscb ){
register int i;
register T_FSCB_ITEM *p;
p = (T_FSCB_ITEM *)(pfscb->items);
for ( i=0; i<MAX_OPENED_FILE_NUM_PER_TASK; i++, p++ ){
p->fp = 0;
p->curp = 0;
}
pfscb->opened_num = 0;
}
/*
* Check whether current task can open a new file or not.
* 0 : Yes
* -1 : No
*/
int check_opened_file_num( void ){
register T_FSCB *pfscb;
pfscb = &g_pCurTsk->fscb;
if ( pfscb->opened_num < MAX_OPENED_FILE_NUM_PER_TASK )
return 0;
else
return -1;
}
/*
* Get an item from current task's 'T_FSCB'.
* 0 : succes
* -1 : fail
*/
int get_fscb_item( unsigned int fp ){
register T_FSCB_ITEM *p;
register T_FSCB *pfscb;
register int i;
UH psr;
psr = ent_cri();
pfscb = &g_pCurTsk->fscb;
if ( pfscb->opened_num <= MAX_OPENED_FILE_NUM_PER_TASK ){
p = (T_FSCB_ITEM *)(pfscb->items);
for ( i=0; i<MAX_OPENED_FILE_NUM_PER_TASK; i++, p++ ){
if ( p->fp == fp ){
ret_cri(psr);
return 0;
}
}
p = (T_FSCB_ITEM *)(pfscb->items);
for ( i=0; i<MAX_OPENED_FILE_NUM_PER_TASK; i++, p++ ){
if ( p->fp == 0 ){
p->fp = fp;
p->curp = 0;
pfscb->opened_num++;
ret_cri(psr);
return 0;
}
}
}
ret_cri(psr);
return (-1);
}
/*
* Remove an item from current task's 'T_FSCB'.
* 0 : succes
* -1 : fail
*/
int remove_fscb_item( unsigned int fp ){
register T_FSCB_ITEM *p;
register T_FSCB *pfscb;
register int i;
UH psr;
psr = ent_cri();
pfscb = &g_pCurTsk->fscb;
if ( pfscb->opened_num ){
p = (T_FSCB_ITEM *)(pfscb->items);
for ( i=0; i<MAX_OPENED_FILE_NUM_PER_TASK; i++, p++ ){
if ( p->fp == fp ){
p->fp = 0;
p->curp = 0;
pfscb->opened_num--;
ret_cri(psr);
return 0;
}
}
}
ret_cri(psr);
return (-1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -