syslog.c

説明を見る。
00001 /*
00002  *  TOPPERS/ASP Kernel
00003  *      Toyohashi Open Platform for Embedded Real-Time Systems/
00004  *      Advanced Standard Profile Kernel
00005  * 
00006  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
00007  *                              Toyohashi Univ. of Technology, JAPAN
00008  *  Copyright (C) 2005-2007 by Embedded and Real-Time Systems Laboratory
00009  *              Graduate School of Information Science, Nagoya Univ., JAPAN
00010  * 
00011  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
00012  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
00013  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
00014  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
00015  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
00016  *      スコード中に含まれていること.
00017  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
00018  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
00019  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
00020  *      の無保証規定を掲載すること.
00021  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
00022  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
00023  *      と.
00024  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
00025  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
00026  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
00027  *        報告すること.
00028  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
00029  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
00030  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
00031  *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
00032  *      免責すること.
00033  * 
00034  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
00035  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
00036  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
00037  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
00038  *  の責任を負わない.
00039  * 
00040  *  @(#) $Id: syslog.c 713 2008-01-01 02:14:21Z hiro $
00041  */
00042 
00043 /*
00044  *      システムログ機能
00045  */
00046 
00047 #include <sil.h>
00048 #undef TOPPERS_OMIT_SYSLOG
00049 #include <t_syslog.h>
00050 #include <log_output.h>
00051 #include "target_syssvc.h"
00052 #include "syslog.h"
00053 
00054 /*
00055  *  トレースログマクロのデフォルト定義
00056  */
00057 #ifndef LOG_SYSLOG_WRI_LOG_ENTER
00058 #define LOG_SYSLOG_WRI_LOG_ENTER(prio, p_syslog)
00059 #endif /* LOG_SYSLOG_WRI_LOG_ENTER */
00060 
00061 #ifndef LOG_SYSLOG_WRI_LOG_LEAVE
00062 #define LOG_SYSLOG_WRI_LOG_LEAVE(ercd)
00063 #endif /* LOG_SYSLOG_WRI_LOG_LEAVE */
00064 
00065 #ifndef LOG_SYSLOG_REA_LOG_ENTER
00066 #define LOG_SYSLOG_REA_LOG_ENTER(p_syslog)
00067 #endif /* LOG_SYSLOG_REA_LOG_ENTER */
00068 
00069 #ifndef LOG_SYSLOG_REA_LOG_LEAVE
00070 #define LOG_SYSLOG_REA_LOG_LEAVE(ercd, p_syslog)
00071 #endif /* LOG_SYSLOG_REA_LOG_LEAVE */
00072 
00073 #ifndef LOG_SYSLOG_MSK_LOG_ENTER
00074 #define LOG_SYSLOG_MSK_LOG_ENTER(logmask, lowmask)
00075 #endif /* LOG_SYSLOG_MSK_LOG_ENTER */
00076 
00077 #ifndef LOG_SYSLOG_MSK_LOG_LEAVE
00078 #define LOG_SYSLOG_MSK_LOG_LEAVE(ercd)
00079 #endif /* LOG_SYSLOG_MSK_LOG_LEAVE */
00080 
00081 #ifndef LOG_SYSLOG_REF_LOG_ENTER
00082 #define LOG_SYSLOG_REF_LOG_ENTER(pk_rlog)
00083 #endif /* LOG_SYSLOG_REF_LOG_ENTER */
00084 
00085 #ifndef LOG_SYSLOG_REF_LOG_LEAVE
00086 #define LOG_SYSLOG_REF_LOG_LEAVE(pk_rlog)
00087 #endif /* LOG_SYSLOG_REF_LOG_LEAVE */
00088 
00089 /*
00090  *  現在のシステム時刻
00091  *
00092  *  ログ時刻を取り出すために,やむなく,カーネルの内部変数を参照してい
00093  *  る.
00094  */
00095 extern ulong_t  _kernel_current_time;
00096 
00097 /*
00098  *  ログバッファとそれにアクセスするためのポインタ
00099  */
00100 static SYSLOG   syslog_buffer[TCNT_SYSLOG_BUFFER];  /* ログバッファ */
00101 static uint_t   syslog_count;           /* ログバッファ中のログの数 */
00102 static uint_t   syslog_head;            /* 先頭のログの格納位置 */
00103 static uint_t   syslog_tail;            /* 次のログの格納位置 */
00104 static uint_t   syslog_lost;            /* 失われたログの数 */
00105 
00106 /*
00107  *  出力すべきログ情報の重要度(ビットマップ)
00108  */
00109 static uint_t   syslog_logmask;         /* ログバッファに記録すべき重要度 */
00110 static uint_t   syslog_lowmask;         /* 低レベル出力すべき重要度 */
00111 
00112 /*
00113  *  システムログ機能の初期化
00114  */
00115 void
00116 syslog_initialize(intptr_t exinf)
00117 {
00118     syslog_count = 0U;
00119     syslog_head = syslog_tail = 0U;
00120     syslog_lost = 0U;
00121 
00122     syslog_logmask = 0U;
00123     syslog_lowmask = LOG_UPTO(LOG_NOTICE);
00124 }     
00125 
00126 /* 
00127  *  ログ情報の出力
00128  *
00129  *  CPUロック状態や実行コンテキストによらず動作できるように実装してある.
00130  */
00131 ER
00132 syslog_wri_log(uint_t prio, SYSLOG *p_syslog)
00133 {
00134     SIL_PRE_LOC;
00135 
00136     LOG_SYSLOG_WRI_LOG_ENTER(prio, p_syslog);
00137     SIL_LOC_INT();
00138 
00139     /*
00140      *  ログ時刻の設定
00141      */
00142     p_syslog->logtim = _kernel_current_time;
00143 
00144     /*
00145      *  ログバッファに記録
00146      */
00147     if ((syslog_logmask & LOG_MASK(prio)) != 0U) {
00148         syslog_buffer[syslog_tail] = *p_syslog;
00149         syslog_tail++;
00150         if (syslog_tail >= TCNT_SYSLOG_BUFFER) {
00151             syslog_tail = 0U;
00152         }
00153         if (syslog_count < TCNT_SYSLOG_BUFFER) {
00154             syslog_count++;
00155         }
00156         else {
00157             syslog_head = syslog_tail;
00158             syslog_lost++;
00159         }
00160     }
00161 
00162     /*
00163      *  低レベル出力
00164      */
00165     if ((syslog_lowmask & LOG_MASK(prio)) != 0U) {
00166         syslog_print(p_syslog, target_fput_log);
00167         (*target_fput_log)('\n');
00168     }
00169 
00170     SIL_UNL_INT();
00171     LOG_SYSLOG_WRI_LOG_LEAVE(E_OK);
00172     return(E_OK);
00173 }
00174 
00175 /*
00176  *  ログバッファからの読出し
00177  *
00178  *  CPUロック状態や実行コンテキストによらず動作できるように実装してある.
00179  */
00180 ER_UINT
00181 syslog_rea_log(SYSLOG *p_syslog)
00182 {
00183     ER_UINT ercd;
00184     SIL_PRE_LOC;
00185 
00186     LOG_SYSLOG_REA_LOG_ENTER(p_syslog);
00187     SIL_LOC_INT();
00188 
00189     /*
00190      *  ログバッファからの取出し
00191      */
00192     if (syslog_count > 0U) {
00193         *p_syslog = syslog_buffer[syslog_head];
00194         syslog_count--;
00195         syslog_head++;
00196         if (syslog_head >= TCNT_SYSLOG_BUFFER) {
00197             syslog_head = 0U;
00198         }
00199         ercd = (ER_UINT) syslog_lost;
00200         syslog_lost = 0U;
00201     }
00202     else {
00203         ercd = E_OBJ;
00204     }
00205 
00206     SIL_UNL_INT();
00207     LOG_SYSLOG_REA_LOG_LEAVE(ercd, p_syslog);
00208     return(ercd);
00209 }
00210 
00211 /* 
00212  *  出力すべきログ情報の重要度の設定
00213  */
00214 ER
00215 syslog_msk_log(uint_t logmask, uint_t lowmask)
00216 {
00217     LOG_SYSLOG_MSK_LOG_ENTER(logmask, lowmask);
00218     syslog_logmask = logmask;
00219     syslog_lowmask = lowmask;
00220     LOG_SYSLOG_MSK_LOG_LEAVE(E_OK);
00221     return(E_OK);
00222 }
00223 
00224 /*
00225  *  ログバッファの状態参照
00226  */
00227 ER_UINT
00228 syslog_ref_log(T_SYSLOG_RLOG *pk_rlog)
00229 {
00230     SIL_PRE_LOC;
00231 
00232     LOG_SYSLOG_REF_LOG_ENTER(pk_rlog);
00233     SIL_LOC_INT();
00234 
00235     pk_rlog->count = syslog_count;
00236     pk_rlog->lost = syslog_lost;
00237     pk_rlog->logmask = syslog_logmask;
00238     pk_rlog->lowmask = syslog_lowmask;
00239 
00240     SIL_UNL_INT();
00241     LOG_SYSLOG_REF_LOG_LEAVE(pk_rlog);
00242     return(E_OK);
00243 }

Copyright © 2008 by Kijineko Inc.

ホームページ制作