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

📄 syslog.c

📁 tkernel操作系统的源代码,是一位日本教授领导开发的,占有很大市场
💻 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. * *---------------------------------------------------------------------- *//* *	syslog.c (T-Kernel/SM) *	System Log Task */#include <basic.h>#include <tk/tkernel.h>#include <tk/util.h>#include <tm/tmonitor.h>#include <sys/debug.h>#include "syslog.h"#if USE_SYSLOG_CONSIO#include <sys/consio.h>#endifEXPORT	W	logtask_alive = 0;	/* Is log task running? */#if USE_SYSLOG_CONSIOLOCAL	W	log_msg_maxmsz;		/* Maximum length of log message */LOCAL	ID	log_mbfid;		/* Message buffer ID for log */#endif/* * Low level output using monitor */LOCAL void sys_write( const char *s, int len ){	while ( len-- > 0 ) tm_putchar(*s++);}/* * Wait until log is completed. */LOCAL ER svc_syslog_wait( void ){#if USE_SYSLOG_CONSIO	T_RMBF	rmbf;	W	i;	ER	er;	if ( logtask_alive ) {		for ( i = 0; i < 50; i++ ) {			tk_dly_tsk(100);			er = tk_ref_mbf(log_mbfid, &rmbf);			if ( er != E_OK || rmbf.wtsk > 0 ) break;		}	}#endif	return E_OK;}/* * Extension SVC handler for log */EXPORT ER __syslog_send( const char *string, int len ){	ER	er;	if ( string == NULL ) return svc_syslog_wait();	if ( len <= 0 ) return E_OK;#if USE_SYSLOG_CONSIO	if ( logtask_alive ) {		/* When log task is running, send message to log task */		if ( len > log_msg_maxmsz ) len = log_msg_maxmsz;		er = tk_snd_mbf(log_mbfid, (VP)string, len, TMO_POL);		if ( er != E_OK ) logtask_alive = 0;	}#endif	if ( !logtask_alive ) {		/* When it is not running, use low level character		   output routine directly. */		sys_write(string, len);		sys_write("\n", 1);	}	return E_OK;}#if USE_SYSLOG_CONSIO/* * Log task */LOCAL void log_task( INT logtask_port ){	static B	logtask_buf[MBF_LOG_MAXMSZ+1];	INT		msgsz;	ER		er;	logtask_alive = 1;	log_msg_maxmsz = MBF_LOG_MAXMSZ;	for ( ;; ) {		er = tk_rcv_mbf(log_mbfid, logtask_buf, TMO_FEVR);		if ( er < E_OK ) break;		msgsz = er;		logtask_buf[msgsz++] = '\n';		er = console_out(logtask_port, logtask_buf, msgsz);		if ( er < E_OK ) {			sys_write(logtask_buf, msgsz);		}	}	logtask_alive = 0;	tk_exd_tsk();}#endif/* * syslog initialization */EXPORT ER initialize_syslog( void ){#if USE_SYSLOG_CONSIO	T_CMBF	cmbf;	T_CTSK	ctsk;	ID	tskid;	ER	err;	/* Generate message buffer */	SetOBJNAME(cmbf.exinf, "SLog");	cmbf.mbfatr = TA_TFIFO | TA_NODISWAI;	cmbf.bufsz  = MBF_LOG_BUFSZ;	cmbf.maxmsz = MBF_LOG_MAXMSZ;	err = tk_cre_mbf(&cmbf);	if ( err < E_OK ) goto err_ret1;	log_mbfid = err;	/* Temporarily lower the local task priority 	   so that the system log task executes initialization sequence. */	tk_chg_pri(TSK_SELF, 10);	/* Start log task */	SetOBJNAME(ctsk.exinf, "SLog");	ctsk.tskatr  = TA_HLNG | TA_RNG0;	ctsk.task    = log_task;	ctsk.itskpri = 6;	ctsk.stksz   = 512;	err = tk_cre_tsk(&ctsk);	if ( err < E_OK ) goto err_ret1;	tskid = err;	err = tk_sta_tsk(tskid, CONSOLE_PORT);	if ( err < E_OK ) goto err_ret2;	/* Return local task priority */	tk_chg_pri(TSK_SELF, TPRI_INI);	return E_OK;err_ret2:	tk_del_tsk(tskid);err_ret1:	DEBUG_PRINT(("initialize_syslog err = %d\n", err));	return err;#else	return E_OK;#endif}/* * syslog finalization sequence */EXPORT ER finish_syslog( void ){#if USE_SYSLOG_CONSIO	ER	err, error = E_OK;	/* Delete message buffer	   This also stops log task */	err = tk_del_mbf(log_mbfid);	if ( err < E_OK ) error = err;#ifdef DEBUG	if ( error < E_OK ) DEBUG_PRINT(("finish_syslog err = %d\n", error));#endif	return error;#else	return E_OK;#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -