source: asp_wo_cfg/trunk/syssvc/syslog.c@ 49

Last change on this file since 49 was 49, checked in by ertl-hiro, 12 years ago

asp_wo_kernelをコミット。

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