📄 svcentry.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. * *---------------------------------------------------------------------- *//* * svcentry.c (file) * * File management * * System call extended SVC entry * Manager service function entry */#include "filemgr.h"#include "cmdpkt.h"LOCAL WER fmSyscallEntry( VP para, W fn );LOCAL void fmStartupEntry( ID resid, W pid );LOCAL void fmCleanupEntry( ID resid, W pid );LOCAL void fmBreakEntry( ID tskid );/* * Extended SVC entry */LOCAL WER fmSyscallEntry( VP para, W fn ){ FmCmdPkt pkt = NIL; ER err; /* Set the packet. */ pkt.cmd.tid = tk_get_tid(); pkt.cmd.fno.w = (UW)fn; pkt.cmd.para = para; /* Call the rendezvous. */ err = fmCallMgrTask(&pkt, Syscall_APL); if ( err != E_OK ) { DEBUG_PRINT(("fmSyscallEntry err = %d\n", err)); return err; } return pkt.cmd.ret;}/* * Startup service entry */LOCAL void fmStartupEntry( ID resid, W pid ){ FINFO *finfo; LINK wrk; PINFO *pinfo, *parent; ER err; err = GetPidToPinfo(pid, &pinfo); if ( err < E_OK ) { return; } finfo = &pinfo->file; LOCK_PINFO_SECTION( /* FINFO initialization */ memset(finfo, 0, (size_t)sizeof(FINFO)); QueInit(&finfo->fdList); /* Obtain the work file of parent process. */ parent = pinfo->parent; if ( parent != NULL ) { wrk = parent->file.workFile; } else { setUndefLink(&wrk); } ); if ( !isUndefLink(&wrk) ) { /* Set the work file. */ err = fmISetWorkFile(&wrk, pinfo); }#ifdef DEBUG if ( err < E_OK ) { DEBUG_PRINT(("fmStartup err = %d\n", err)); }#endif}/* * Cleanup service entry */LOCAL void fmCleanupEntry( ID resid, W pid ){ FM_CLEANUP_PARA para; FmCmdPkt pkt = NIL; BOOL nouse; PINFO *pinfo; ER err; err = GetPidToPinfo(pid, &pinfo); if ( err < E_OK ) { return; } /* Unless the resource of the file management is used, it ends without change. */ LOCK_PINFO_SECTION( nouse = ( isQueEmpty(&pinfo->file.fdList) && isUndefLink(&pinfo->file.workFile) ); ); if ( nouse != 0 ) { return; } /* Set the packet. */ pkt.cmd.fno.w = FM_CLEANUP_FN; pkt.cmd.para = ¶ para.pinfo = pinfo; /* Call the rendezvous. */ err = fmCallMgrTask(&pkt, Syscall_OS); if ( err != E_OK ) { DEBUG_PRINT(("fmCleanup err = %d\n", err)); }}/* * Break service entry */LOCAL void fmBreakEntry( ID tskid ){ FM_BREAK_PARA para; FmCmdPkt pkt = NIL; ER err; /* Set the packet. */ pkt.cmd.fno.w = FM_BREAK_FN; pkt.cmd.para = ¶ para.tskid = tskid; /* Call the rendezvous. */ err = fmCallMgrTask(&pkt, Syscall_OS); if ( err != E_OK ) { DEBUG_PRINT(("fmBreak err = %d\n", err)); }}/* * Register/Delete the extended SVC manager service function. * StartUp = TRUE:Register/FALSE:Delete */EXPORT ER fmDefineEntries( BOOL StartUp ){ T_DSSY dssy; ER err; if ( StartUp != 0 ) { /* Register the manager. */ dssy.ssyatr = TA_NULL; dssy.ssypri = FM_PRI; dssy.svchdr = (FP)fmSyscallEntry; dssy.breakfn = fmBreakEntry; dssy.startupfn = fmStartupEntry; dssy.cleanupfn = fmCleanupEntry; dssy.eventfn = NULL; dssy.resblksz = 0; err = tk_def_ssy(FM_SVC, &dssy); } else { /* Deregister the manager. */ err = tk_def_ssy(FM_SVC, NULL); }#ifdef DEBUG if ( err != E_OK ) { DEBUG_PRINT(("DefManager err = %d\n", err)); }#endif return ERtoERR(err);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -