source: ssp_qb_r5f100le_cs/trunk/syssvc/syslog.c@ 95

Last change on this file since 95 was 95, checked in by nmir-saito, 9 years ago

ファイルの mime-type 変更

  • Property svn:mime-type set to text/plain; charset=shift_jis
File size: 5.9 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
6 * Toyohashi Univ. of Technology, JAPAN
7 * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
8 * Graduate School of Information Science, Nagoya Univ., JAPAN
9 *
10 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15 * スコード中に含まれていること.
16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
18 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
19 * の無保証規定を掲載すること.
20 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
21 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
22 * と.
23 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
24 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
25 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
26 * 報告すること.
27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
29 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
30 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
31 * 免責すること.
32 *
33 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
34 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
35 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
36 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
37 * の責任を負わない.
38 *
39 * $Id: syslog.c 1846 2010-07-14 07:37:41Z ertl-hiro $
40 */
41
42/*
43 * システムログ機能
44 */
45
46#include <sil.h>
47#undef TOPPERS_OMIT_SYSLOG
48#include <t_syslog.h>
49#include <log_output.h>
50#include "target_syssvc.h"
51#include "syslog.h"
52
53/*
54 * トレースログマクロのデフォルト定義
55 */
56#ifndef LOG_SYSLOG_WRI_LOG_ENTER
57#define LOG_SYSLOG_WRI_LOG_ENTER(prio, p_syslog)
58#endif /* LOG_SYSLOG_WRI_LOG_ENTER */
59
60#ifndef LOG_SYSLOG_WRI_LOG_LEAVE
61#define LOG_SYSLOG_WRI_LOG_LEAVE(ercd)
62#endif /* LOG_SYSLOG_WRI_LOG_LEAVE */
63
64#ifndef LOG_SYSLOG_REA_LOG_ENTER
65#define LOG_SYSLOG_REA_LOG_ENTER(p_syslog)
66#endif /* LOG_SYSLOG_REA_LOG_ENTER */
67
68#ifndef LOG_SYSLOG_REA_LOG_LEAVE
69#define LOG_SYSLOG_REA_LOG_LEAVE(ercd, p_syslog)
70#endif /* LOG_SYSLOG_REA_LOG_LEAVE */
71
72#ifndef LOG_SYSLOG_MSK_LOG_ENTER
73#define LOG_SYSLOG_MSK_LOG_ENTER(logmask, lowmask)
74#endif /* LOG_SYSLOG_MSK_LOG_ENTER */
75
76#ifndef LOG_SYSLOG_MSK_LOG_LEAVE
77#define LOG_SYSLOG_MSK_LOG_LEAVE(ercd)
78#endif /* LOG_SYSLOG_MSK_LOG_LEAVE */
79
80#ifndef LOG_SYSLOG_REF_LOG_ENTER
81#define LOG_SYSLOG_REF_LOG_ENTER(pk_rlog)
82#endif /* LOG_SYSLOG_REF_LOG_ENTER */
83
84#ifndef LOG_SYSLOG_REF_LOG_LEAVE
85#define LOG_SYSLOG_REF_LOG_LEAVE(pk_rlog)
86#endif /* LOG_SYSLOG_REF_LOG_LEAVE */
87
88/*
89 * 現在のシステム時刻
90 *
91 * ログ時刻を取り出すために,やむなく,カーネルの内部変数を参照してい
92 * る.
93 */
94extern ulong_t _kernel_current_time;
95
96/*
97 * ログバッファとそれにアクセスするためのポインタ
98 */
99static SYSLOG syslog_buffer[TCNT_SYSLOG_BUFFER]; /* ログバッファ */
100static uint_t syslog_count; /* ログバッファ中のログの数 */
101static uint_t syslog_head; /* 先頭のログの格納位置 */
102static uint_t syslog_tail; /* 次のログの格納位置 */
103static uint_t syslog_lost; /* 失われたログの数 */
104
105/*
106 * 出力すべきログ情報の重要度(ビットマップ)
107 */
108static uint_t syslog_logmask; /* ログバッファに記録すべき重要度 */
109static uint_t syslog_lowmask_not; /* 低レベル出力すべき重要度(反転)*/
110
111/*
112 * システムログ機能の初期化
113 */
114void
115syslog_initialize(intptr_t exinf)
116{
117 syslog_count = 0U;
118 syslog_head = syslog_tail = 0U;
119 syslog_lost = 0U;
120 syslog_logmask = 0U;
121 syslog_lowmask_not = 0U;
122}
123
124/*
125 * ログ情報の出力
126 *
127 * CPUロック状態や実行コンテキストによらず動作できるように実装してある.
128 */
129ER
130syslog_wri_log(uint_t prio, const SYSLOG *p_syslog)
131{
132 SIL_PRE_LOC;
133
134 LOG_SYSLOG_WRI_LOG_ENTER(prio, p_syslog);
135 SIL_LOC_INT();
136
137 /*
138 * ログ時刻の設定
139 */
140 ((SYSLOG *) p_syslog)->logtim = _kernel_current_time;
141
142 /*
143 * ログバッファに記録
144 */
145 if ((syslog_logmask & LOG_MASK(prio)) != 0U) {
146 syslog_buffer[syslog_tail] = *p_syslog;
147 syslog_tail++;
148 if (syslog_tail >= TCNT_SYSLOG_BUFFER) {
149 syslog_tail = 0U;
150 }
151 if (syslog_count < TCNT_SYSLOG_BUFFER) {
152 syslog_count++;
153 }
154 else {
155 syslog_head = syslog_tail;
156 syslog_lost++;
157 }
158 }
159
160 /*
161 * 低レベル出力
162 */
163 if (((~syslog_lowmask_not) & LOG_MASK(prio)) != 0U) {
164 syslog_print(p_syslog, target_fput_log);
165 (*target_fput_log)('\n');
166 }
167
168 SIL_UNL_INT();
169 LOG_SYSLOG_WRI_LOG_LEAVE(E_OK);
170 return(E_OK);
171}
172
173/*
174 * ログバッファからの読出し
175 *
176 * CPUロック状態や実行コンテキストによらず動作できるように実装してある.
177 */
178ER_UINT
179syslog_rea_log(SYSLOG *p_syslog)
180{
181 ER_UINT ercd;
182 SIL_PRE_LOC;
183
184 LOG_SYSLOG_REA_LOG_ENTER(p_syslog);
185 SIL_LOC_INT();
186
187 /*
188 * ログバッファからの取出し
189 */
190 if (syslog_count > 0U) {
191 *p_syslog = syslog_buffer[syslog_head];
192 syslog_count--;
193 syslog_head++;
194 if (syslog_head >= TCNT_SYSLOG_BUFFER) {
195 syslog_head = 0U;
196 }
197 ercd = (ER_UINT) syslog_lost;
198 syslog_lost = 0U;
199 }
200 else {
201 ercd = E_OBJ;
202 }
203
204 SIL_UNL_INT();
205 LOG_SYSLOG_REA_LOG_LEAVE(ercd, p_syslog);
206 return(ercd);
207}
208
209/*
210 * 出力すべきログ情報の重要度の設定
211 */
212ER
213syslog_msk_log(uint_t logmask, uint_t lowmask)
214{
215 LOG_SYSLOG_MSK_LOG_ENTER(logmask, lowmask);
216 syslog_logmask = logmask;
217 syslog_lowmask_not = ~lowmask;
218 LOG_SYSLOG_MSK_LOG_LEAVE(E_OK);
219 return(E_OK);
220}
Note: See TracBrowser for help on using the repository browser.