OSDN Git Service

e889479557e916bc7b238d9a30ddad12da1d6bab
[trx-305dsp/dsp.git] / hirado / kernel / kernel / syslog.c
1 /*
2  *  TOPPERS/JSP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Just Standard Profile Kernel
5  * 
6  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  * 
9  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
10  *  によって公表されている GNU General Public License の Version 2 に記
11  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
13  *  利用と呼ぶ)することを無償で許諾する.
14  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16  *      スコード中に含まれていること.
17  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20  *      の無保証規定を掲載すること.
21  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23  *      と.
24  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
26  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27  *        報告すること.
28  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30  * 
31  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
35  * 
36  *  @(#) $Id: syslog.c,v 1.1 2009/01/31 05:27:37 suikan Exp $
37  */
38
39 /*
40  *  システムログ機能
41  */
42
43 #undef OMIT_SYSLOG
44 #include "jsp_kernel.h"
45 #include "time_event.h"
46 #include "syslog.h"
47
48 /*
49  *  コンテキストに依らないCPUロック/ロック解除
50  */
51 #define lock_cpu()  (sense_context() ? i_lock_cpu() : t_lock_cpu())
52 #define unlock_cpu()    (sense_context() ? i_unlock_cpu() : t_unlock_cpu())
53
54 #ifdef __logini
55
56 /*
57  *  ログバッファとそれにアクセスするためのポインタ
58  */
59 SYSLOG  syslog_buffer[TCNT_SYSLOG_BUFFER];  /* ログバッファ */
60 UINT    syslog_count;           /* ログバッファ中のログの数 */
61 UINT    syslog_head;            /* 先頭のログの格納位置 */
62 UINT    syslog_tail;            /* 次のログの格納位置 */
63 UINT    syslog_lost;            /* 失われたログの数 */
64
65 /*
66  *  出力すべきログ情報の重要度(ビットマップ)
67  */
68 UINT    syslog_logmask;         /* ログバッファに記録すべき重要度 */
69 UINT    syslog_lowmask;         /* 低レベル出力すべき重要度 */
70
71 /*
72  *  システムログ機能の初期化
73  */
74 void
75 syslog_initialize()
76 {
77     syslog_count = 0;
78     syslog_head = syslog_tail = 0;
79     syslog_lost = 0;
80
81     syslog_logmask = 0;
82     syslog_lowmask = LOG_UPTO(LOG_NOTICE);
83 }     
84
85 #endif /* __logini */
86
87 /* 
88  *  ログ情報の出力
89  *
90  *  CPUロック状態や実行コンテキストによらず動作できるように実装してある.
91  */
92 #ifdef __vwri_log
93
94 SYSCALL ER
95 vwri_log(UINT prio, SYSLOG *p_log)
96 {
97     BOOL    locked;
98
99     locked = sense_lock();
100     if (!locked) {
101         lock_cpu();
102     }
103
104     /*
105      *  ログ時刻の設定
106      */
107     p_log->logtim = systim_offset + current_time;
108
109     /*
110      *  ログバッファに記録
111      */
112     if ((syslog_logmask & LOG_MASK(prio)) != 0) {
113         syslog_buffer[syslog_tail] = *p_log;
114         syslog_tail++;
115         if (syslog_tail >= TCNT_SYSLOG_BUFFER) {
116             syslog_tail = 0;
117         }
118         if (syslog_count < TCNT_SYSLOG_BUFFER) {
119             syslog_count++;
120         }
121         else {
122             syslog_head = syslog_tail;
123             syslog_lost++;
124         }
125     }
126
127     /*
128      *  低レベル出力
129      */
130     if ((syslog_lowmask & LOG_MASK(prio)) != 0) {
131         syslog_print(p_log, sys_putc);
132     }
133
134     if (!locked) {
135         unlock_cpu();
136     }
137     return(E_OK);
138 }
139
140 #endif /* __vwri_log */
141
142 /*
143  *  ログバッファからの読出し
144  *
145  *  CPUロック状態や実行コンテキストによらず動作できるように実装してある.
146  */
147 #ifdef __vrea_log
148
149 SYSCALL ER_UINT
150 vrea_log(SYSLOG *p_log)
151 {
152     BOOL    locked;
153     ER_UINT ercd;
154
155     locked = sense_lock();
156     if (!locked) {
157         lock_cpu();
158     }
159     if (syslog_count > 0) {
160         *p_log = syslog_buffer[syslog_head];
161         syslog_count--;
162         syslog_head++;
163         if (syslog_head >= TCNT_SYSLOG_BUFFER) {
164             syslog_head = 0;
165         }
166         ercd = (ER_UINT) syslog_lost;
167         syslog_lost = 0;
168     }
169     else {
170         ercd = E_OBJ;
171     }
172     if (!locked) {
173         unlock_cpu();
174     }
175     return(ercd);
176 }
177
178 #endif /* __vrea_log */
179
180 /* 
181  *  出力すべきログ情報の重要度の設定
182  */
183 #ifdef __vmsk_log
184
185 SYSCALL ER
186 vmsk_log(UINT logmask, UINT lowmask)
187 {
188     syslog_logmask = logmask;
189     syslog_lowmask = lowmask;
190     return(E_OK);
191 }
192
193 #endif /* __vmsk_log */
194
195 /* 
196  *  システムログ機能の終了処理
197  *
198  *  ログバッファに記録されたログ情報を,低レベル出力機能を用いて出力す
199  *  る.
200  */
201 #ifdef __logter
202
203 void
204 syslog_terminate()
205 {
206     syslog_printf("-- buffered messages --", NULL, sys_putc);
207     syslog_output(sys_putc);
208 }
209
210 #endif /* __logter */