⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svcentry.c

📁 T-kernel 的extension源代码
💻 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;	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;	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 + -