source: anotherchoice/tags/jsp-1.4.4-full-UTF8/sample/cxx_sample2.cpp@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 years ago

initial

File size: 7.2 KB
Line 
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 * Copyright (C) 2003-2004 Takagi Nobuhisa
9 *
10 * 上記著作権者
11は,以下の (1)〜(4) の条件か,Free Software Foundation
12 * によってå…
13¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
14 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
15 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
16å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
17 * 利用と呼ぶ)することを無償で許諾する.
18 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
19 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
20 * スコード中に含まれていること.
21 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
22 * 用できる形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
24å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
25 * 者
26マニュアルなど)に,上記の著作権表示,この利用条件および下記
27 * の無保証規定を掲載すること.
28 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
29 * 用できない形で再é…
30å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
31 * と.
32 * (a) 再é…
33å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
34マニュアルなど)に,上記の著
35 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
36 * (b) 再é…
37å¸ƒã®å½¢æ…
38‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
39 * 報告すること.
40 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
41 * 害からも,上記著作権者
42およびTOPPERSプロジェクトをå…
43è²¬ã™ã‚‹ã“と.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
48 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
49 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
50 *
51 * @(#) $Id: cxx_sample2.cpp,v 1.4 2004/09/17 09:11:34 honda Exp $
52 */
53
54/*
55 * C++サンプルプログラム(2)の本体
56 *
57 * このサンプルプログラムは「哲学者
58の食事」をベースとして、C++の各機能
59 * のデモを行っている。
60 * 5人の哲学者
61が左右のフォークを取る際、故
62意にデッドロックを発生させ、
63 * タイムアウトを検出した時点でC++の例外を送出している。
64 *
65 * 動作中に'q'をå…
66¥åŠ›ã™ã‚‹ã¨å‹•ä½œã‚’停止することができ、restart? [y|n]に対
67 * して'y'をå…
68¥åŠ›ã™ã‚Œã°å†èµ·å‹•ã€'n'をå…
69¥åŠ›ã™ã‚Œã°çµ‚了する。
70 * また、動作中に'a'をå…
71¥åŠ›ã™ã‚Œã°ã‚¢ãƒœãƒ¼ãƒˆã™ã‚‹ã€‚
72 */
73
74#include <t_services.h>
75#include <cstdlib>
76#include <new>
77#include "kernel_id.h"
78#include "cxx_sample2.h"
79
80// 非マルチタスクテストクラス
81// 静的オブジェクトのコンストラクタとデストラクタの動作サンプル
82class non_multitask_test
83{
84 int* x_;
85public:
86 non_multitask_test()
87 : x_(new int(12345)) // カーネル非動作状æ…
88‹ã§ã®new演算子
89 {
90 }
91 ~non_multitask_test()
92 {
93 if (*x_== 12345)
94 syslog(LOG_NOTICE,"non-multitask test succeeded");
95 else
96 syslog(LOG_NOTICE,"non-multitask test failed");
97 delete x_; // カーネル非動作状æ…
98‹ã§ã®delete演算子
99 x_ = 0;
100 }
101} test;
102
103class timeout_error
104{
105};
106
107// 擬似乱数
108int rnd()
109{
110 static unsigned int seed = 1;
111 loc_cpu();
112 seed = seed * 1566083941UL + 1;
113 unl_cpu();
114 return (seed >> 16) % 0x7fff;
115}
116
117// フォーククラス
118class fork
119{
120 ID semid_;
121 bool used_;
122public:
123 explicit fork(int semid)
124 : semid_(semid), used_(false)
125 {
126 }
127 ~fork()
128 {
129 if (used_)
130 give();
131 }
132 ID id() const { return semid_; }
133 bool is_used() const { return used_; }
134 void take()
135 {
136 if (twai_sem(semid_, 500*5) == E_TMOUT)
137 throw timeout_error();
138 used_ = true;
139 }
140 void give()
141 {
142 used_ = false;
143 sig_sem(semid_);
144 }
145};
146
147fork* p_fork[5];
148
149// 哲学者
150クラス
151class philosopher
152{
153 ID tskid_;
154 fork* left_;
155 fork* right_;
156public:
157 explicit philosopher(int tskid, fork* left, fork* right)
158 : tskid_(tskid),
159 left_(left), right_(right)
160 {
161 syslog(LOG_NOTICE,"philosofer #%d", tskid);
162 }
163 void think()
164 {
165 syslog(LOG_NOTICE, "#%d thinking...", tskid_);
166 dly_tsk(100 * (rnd() % 5 + 1));
167 }
168 void eat()
169 {
170 syslog(LOG_NOTICE, "#%d eat up", tskid_);
171 dly_tsk(100 * (rnd() % 5 + 1));
172 }
173 void run()
174 {
175 for (;;)
176 {
177 try
178 {
179 // 意図的にデッドロックを発生させる。
180 left_->take();
181 syslog(LOG_NOTICE, "#%d take left fork(%d)", tskid_, left_->id());
182
183 dly_tsk(100 * (rnd() % 5 + 1));
184
185 right_->take();
186 syslog(LOG_NOTICE, "#%d take right fork(%d)", tskid_, right_->id());
187
188 eat();
189
190 left_->give();
191 syslog(LOG_NOTICE, "#%d give left fork(%d)", tskid_, left_->id());
192 right_->give();
193 syslog(LOG_NOTICE, "#%d give right fork(%d)", tskid_, right_->id());
194 think();
195 }
196 catch (timeout_error&)
197 {
198 // タイムアウトによりデッドロックを検出すると、フォークを放す。
199 syslog(LOG_NOTICE, "#%d !!!! timeout error !!!!", tskid_);
200 if (left_->is_used())
201 {
202 left_->give();
203 syslog(LOG_NOTICE, "#%d give left fork(%d)", tskid_, left_->id());
204 }
205 if (right_->is_used())
206 {
207 right_->give();
208 syslog(LOG_NOTICE, "#%d give right fork(%d)", tskid_, right_->id());
209 }
210 rot_rdq(TPRI_SELF);
211 }
212 }
213 }
214};
215
216void task(VP_INT exinf)
217{
218 _toppers_cxxrt_reset_specific(); // タスクの再起動を可能にするための初期化処理
219 ID tskid = ID(exinf);
220 fork* left = p_fork[(tskid - 1) % 5];
221 fork* right = p_fork[(tskid - 1 + 4) % 5];
222 philosopher phil(tskid, left, right);
223 phil.run();
224}
225
226// std::atexitで登録する終了時関数
227void finish()
228{
229 syslog(LOG_NOTICE, "finish");
230}
231
232
233// メインタスク
234void main_task(VP_INT exinf)
235{
236 serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV));
237 syslog(LOG_NOTICE,"Sample program starts (exinf = %d)", exinf);
238
239 std::atexit(finish);
240
241 try
242 {
243 for (;;)
244 {
245 for (ID semid = 1; semid <= 5; semid++)
246 p_fork[semid - 1] = new fork(semid);
247
248 for (ID tskid = 1; tskid <= 5; tskid++)
249 act_tsk(tskid);
250
251 char c;
252 do
253 {
254 serial_rea_dat(TASK_PORTID, &c, 1);
255 if (c == 'a')
256 std::abort();
257 } while (c != 'q' && c != 'Q');
258
259 for (ID tskid = 1; tskid <= 5; tskid++)
260 {
261 ter_tsk(tskid);
262 }
263
264 for (ID semid = 1; semid <= 5; semid++)
265 {
266 delete p_fork[semid - 1];
267 p_fork[semid - 1] = 0;
268 }
269
270 do
271 {
272 syslog(LOG_NOTICE, "restart? [y|n] ");
273 serial_rea_dat(TASK_PORTID, &c, 1);
274 } while (c != 'y' && c != 'n');
275
276 if (c == 'n')
277 break;
278 }
279
280 syslog(LOG_NOTICE, "multitask test succeeded");
281 }
282 catch (std::bad_alloc&)
283 {
284 syslog(LOG_NOTICE, "multitask test failed");
285 }
286
287 std::exit(0);
288}
289
Note: See TracBrowser for help on using the repository browser.