📄 syslog.c
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000,2001 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * 惧淡螟侯涪荚は·Free Software Foundation によって给山されている * GNU General Public License の Version 2 に淡揭されている掘凤か·笆 * 布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ * アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ * ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 * に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· * この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 * み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ * (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する * ことˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚を倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· * 塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ * ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい * かなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: syslog.c,v 1.5 2002/03/26 08:19:38 hiro Exp $ *//* * システムログ怠墙 */#include "jsp_kernel.h"#include "time_event.h"/* * ログバッファとそれにアクセスするためのポインタ */#define TCNT_SYSLOG_BUFFER 32static SYSLOG syslog_buffer[TCNT_SYSLOG_BUFFER];static UINT syslog_count;static UINT syslog_head;static UINT syslog_tail;static UINT syslog_lost;/* * 叫蜗すべきログ攫鼠の脚妥刨∈ビットマップ∷ */static UINT syslog_logmask; /* 淡峡】叫蜗すべき脚妥刨 */static UINT syslog_lowmask; /* 你レベル叫蜗すべき脚妥刨 *//* * コンテキストに巴らないCPUロック】ロック豺近 */#define lock_cpu() (sense_context() ? i_lock_cpu() : t_lock_cpu())#define unlock_cpu() (sense_context() ? i_unlock_cpu() : t_unlock_cpu())/* * システムログ怠墙の介袋步 */voidsyslog_initialize(){ syslog_count = 0; syslog_head = syslog_tail = 0; syslog_lost = 0; syslog_logmask = LOG_UPTO(LOG_NOTICE); syslog_lowmask = LOG_UPTO(LOG_NOTICE);} /* * ログ攫鼠の叫蜗 */ERsyslog_write(UINT prio, SYSLOG *p_syslog){ BOOL locked; p_syslog->logtim = systim_offset + current_time; if ((syslog_logmask & LOG_MASK(prio)) != 0) { /* * CPUロック觉轮や悸乖コンテキストによらず瓢侯できる * ようにするˉ */ locked = sense_lock(); if (!locked) { lock_cpu(); } if ((syslog_lowmask & LOG_MASK(prio)) != 0) { /* * 你レベル叫蜗への今叫し */ syslog_printf(p_syslog, sys_putc); sys_putc('\n'); } else { /* * ログバッファへの今哈み */ syslog_buffer[syslog_tail] = *p_syslog; syslog_tail++; if (syslog_tail >= TCNT_SYSLOG_BUFFER) { syslog_tail = 0; } if (syslog_count < TCNT_SYSLOG_BUFFER) { syslog_count++; } else { syslog_head = syslog_tail; syslog_lost++; } } if (!locked) { unlock_cpu(); } } return(E_OK);}/* * ログバッファからの粕叫し */ER_UINTsyslog_read(SYSLOG *p_syslog){ BOOL locked; INT n; /* * CPUロック觉轮や悸乖コンテキストによらず瓢侯できるようにす * るˉ */ locked = sense_lock(); if (!locked) { lock_cpu(); } if (syslog_count > 0) { *p_syslog = syslog_buffer[syslog_head]; syslog_count--; syslog_head++; if (syslog_head >= TCNT_SYSLOG_BUFFER) { syslog_head = 0; } n = syslog_lost; syslog_lost = 0; } else { n = E_OBJ; } if (!locked) { unlock_cpu(); } return(n);}/* * 叫蜗すべきログ攫鼠の脚妥刨の肋年 */ERsyslog_setmask(UINT logmask, UINT lowmask){ syslog_logmask = logmask; syslog_lowmask = lowmask; return(E_OK);}/* * システムログ怠墙の姜位借妄 * * ログバッファに淡峡されたログ攫鼠を·你レベル叫蜗怠墙を脱いて叫蜗す * るˉ */voidsyslog_terminate(){ SYSLOG syslog, lostlog; char *bufmsg = "-- buffered messages --"; char *lostmsg = "%d messages are lost."; INT n; lostlog.loginfo[0] = (VP_INT) bufmsg; syslog_printf(&lostlog, sys_putc); sys_putc('\n'); while ((n = syslog_read(&syslog)) >= 0) { if (n > 0) { lostlog.loginfo[0] = (VP_INT) lostmsg; lostlog.loginfo[1] = (VP_INT) n; syslog_printf(&lostlog, sys_putc); sys_putc('\n'); } syslog_printf(&syslog, sys_putc); sys_putc('\n'); } sys_putc('\n');}/* * 眶猛を矢机误に恃垂 */static voidconvert(unsigned int val, int radix, const char *radchar, int width, int minus, int padzero, void (*putc)(char)){ char buf[12]; int i, j; i = 0; do { buf[i++] = radchar[val % radix]; val /= radix; } while (val != 0); width -= minus; if (minus > 0 && padzero > 0) { (*putc)('-'); } for (j = i; j < width; j++) { (*putc)((char)(padzero > 0 ? '0' : ' ')); } if (minus > 0 && padzero <= 0) { (*putc)('-'); } while (i > 0) { (*putc)(buf[--i]); }}/* * ログ攫鼠フォ〖マット脱ライブラリ簇眶 */static char const raddec[] = "0123456789";static char const radhex[] = "0123456789abcdef";static char const radHEX[] = "0123456789ABCDEF";voidsyslog_printf(SYSLOG *p_syslog, void (*putc)(char)){ char *format; int argno; int c; int width; int padzero; int val; char *str; format = (char *)(p_syslog->loginfo[0]); argno = 1; while ((c = *format++) != '\0') { if (c != '%') { (*putc)((char) c); continue; } width = padzero = 0; if ((c = *format++) == '0') { padzero = 1; c = *format++; } while ('0' <= c && c <= '9') { width = width*10 + c - '0'; c = *format++; } switch (c) { case 'd': val = (int)(p_syslog->loginfo[argno++]); if (val >= 0) { convert(val, 10, raddec, width, 0, padzero, putc); } else { convert(-val, 10, raddec, width, 1, padzero, putc); } break; case 'u': val = (int)(p_syslog->loginfo[argno++]); convert(val, 10, raddec, width, 0, padzero, putc); break; case 'x': val = (int)(p_syslog->loginfo[argno++]); convert(val, 16, radhex, width, 0, padzero, putc); break; case 'X': val = (int)(p_syslog->loginfo[argno++]); convert(val, 16, radHEX, width, 0, padzero, putc); break; case 'c': (*putc)((char)(int)(p_syslog->loginfo[argno++])); break; case 's': str = (char *)(p_syslog->loginfo[argno++]); while ((c = *str++) != '\0') { (*putc)((char) c); } break; case '%': (*putc)('%'); break; case '\0': format--; break; default: break; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -