syslog.c

説明を見る。
00001 /*
00002  *  TOPPERS/FDMP Kernel
00003  *      Toyohashi Open Platform for Embedded Real-Time Systems/
00004  *      Function Distributed Multiprocessor Kernel
00005  * 
00006  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
00007  *                              Toyohashi Univ. of Technology, JAPAN
00008  *  Copyright (C) 2006 by Embedded and Real-Time Systems Laboratory
00009  *              Graduate School of Information Science, Nagoya Univ., JAPAN      
00010  * 
00011  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
00012  *  によって公表されている GNU General Public License の Version 2 に記
00013  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
00014  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
00015  *  利用と呼ぶ)することを無償で許諾する.
00016  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
00017  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
00018  *      スコード中に含まれていること.
00019  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
00020  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
00021  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
00022  *      の無保証規定を掲載すること.
00023  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
00024  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
00025  *      と.
00026  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
00027  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
00028  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
00029  *        報告すること.
00030  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
00031  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
00032  * 
00033  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
00034  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
00035  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
00036  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
00037  * 
00038  *  @(#) $Id: syslog.c,v 1.3 2006/03/14 04:37:54 honda Exp $
00039  */
00040 
00045 #undef OMIT_SYSLOG
00046 #include "fdmp_kernel.h"
00047 #include "time_event.h"
00048 #include "syslog.h"
00049 
00050 /*
00051  *  コンテキストに依らないCPUロック/ロック解除
00052  */
00053 #define lock_cpu()  (sense_context() ? i_lock_cpu() : t_lock_cpu())
00054 #define unlock_cpu()    (sense_context() ? i_unlock_cpu() : t_unlock_cpu())
00055 
00056 #ifdef __logini
00057 
00058 /*
00059  *  ログバッファとそれにアクセスするためのポインタ
00060  */
00061 SYSLOG  syslog_buffer[TCNT_SYSLOG_BUFFER];  /* ログバッファ */
00062 UINT    syslog_count;           /* ログバッファ中のログの数 */
00063 UINT    syslog_head;            /* 先頭のログの格納位置 */
00064 UINT    syslog_tail;            /* 次のログの格納位置 */
00065 UINT    syslog_lost;            /* 失われたログの数 */
00066 
00067 /*
00068  *  出力すべきログ情報の重要度(ビットマップ)
00069  */
00070 UINT    syslog_logmask;         /* ログバッファに記録すべき重要度 */
00071 UINT    syslog_lowmask;         /* 低レベル出力すべき重要度 */
00072 
00077 void
00078 syslog_initialize()
00079 {
00080     syslog_count = 0;
00081     syslog_head = syslog_tail = 0;
00082     syslog_lost = 0;
00083 
00084     syslog_logmask = 0;
00085     syslog_lowmask = LOG_UPTO(LOG_NOTICE);
00086 }     
00087 
00088 #endif /* __logini */
00089 
00095 #ifdef __vwri_log
00096 
00097 SYSCALL ER
00098 vwri_log(UINT prio, SYSLOG *p_log)
00099 {
00100     BOOL    locked;
00101 
00102     locked = sense_lock();
00103     if (!locked) {
00104         lock_cpu();
00105     }
00106 
00107     /*
00108      *  ログ時刻の設定
00109      */
00110     p_log->logtim = systim_offset + current_time;
00111 
00112     /*
00113      *  ログバッファに記録
00114      */
00115     if ((syslog_logmask & LOG_MASK(prio)) != 0) {
00116         syslog_buffer[syslog_tail] = *p_log;
00117         syslog_tail++;
00118         if (syslog_tail >= TCNT_SYSLOG_BUFFER) {
00119             syslog_tail = 0;
00120         }
00121         if (syslog_count < TCNT_SYSLOG_BUFFER) {
00122             syslog_count++;
00123         }
00124         else {
00125             syslog_head = syslog_tail;
00126             syslog_lost++;
00127         }
00128     }
00129 
00130     /*
00131      *  低レベル出力
00132      */
00133     if ((syslog_lowmask & LOG_MASK(prio)) != 0) {
00134         syslog_print(p_log, sys_putc);
00135     }
00136 
00137     if (!locked) {
00138         unlock_cpu();
00139     }
00140     return(E_OK);
00141 }
00142 
00143 #endif /* __vwri_log */
00144 
00150 #ifdef __vrea_log
00151 
00152 SYSCALL ER_UINT
00153 vrea_log(SYSLOG *p_log)
00154 {
00155     BOOL    locked;
00156     ER_UINT ercd;
00157 
00158     locked = sense_lock();
00159     if (!locked) {
00160         lock_cpu();
00161     }
00162     if (syslog_count > 0) {
00163         *p_log = syslog_buffer[syslog_head];
00164         syslog_count--;
00165         syslog_head++;
00166         if (syslog_head >= TCNT_SYSLOG_BUFFER) {
00167             syslog_head = 0;
00168         }
00169         ercd = (ER_UINT) syslog_lost;
00170         syslog_lost = 0;
00171     }
00172     else {
00173         ercd = E_OBJ;
00174     }
00175     if (!locked) {
00176         unlock_cpu();
00177     }
00178     return(ercd);
00179 }
00180 
00181 #endif /* __vrea_log */
00182 
00186 #ifdef __vmsk_log
00187 
00188 SYSCALL ER
00189 vmsk_log(UINT logmask, UINT lowmask)
00190 {
00191     syslog_logmask = logmask;
00192     syslog_lowmask = lowmask;
00193     return(E_OK);
00194 }
00195 
00196 #endif /* __vmsk_log */
00197 
00204 #ifdef __logter
00205 
00206 void
00207 syslog_terminate()
00208 {
00209     syslog_printf("-- buffered messages --", NULL, sys_putc);
00210     syslog_output(sys_putc);
00211 }
00212 
00213 #endif /* __logter */

Copyright © 2006 by TAKAGI Nobuhisa.
このページは Mon Apr 3 23:49:13 2006 に Doxygen によって生成されました。