source: anotherchoice/tags/jsp-1.4.4-full-UTF8/kernel/mempfix.c@ 26

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

initial

File size: 7.3 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) 2005 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者
12は,以下の (1)〜(4) の条件か,Free Software Foundation
13 * によってå…
14¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
15 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
16 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
17å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
18 * 利用と呼ぶ)することを無償で許諾する.
19 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21 * スコード中に含まれていること.
22 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23 * 用できる形で再é…
24å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
25å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
26 * 者
27マニュアルなど)に,上記の著作権表示,この利用条件および下記
28 * の無保証規定を掲載すること.
29 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
30 * 用できない形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
32 * と.
33 * (a) 再é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
35マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再é…
38å¸ƒã®å½¢æ…
39‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
40 * 報告すること.
41 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
42 * 害からも,上記著作権者
43およびTOPPERSプロジェクトをå…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
49 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
50 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
51 *
52 * @(#) $Id: mempfix.c,v 1.12 2005/11/12 14:55:23 hiro Exp $
53 */
54
55/*
56 * 固定長メモリプール機能
57 */
58
59#include "jsp_kernel.h"
60#include "check.h"
61#include "task.h"
62#include "wait.h"
63#include "mempfix.h"
64
65/*
66 * 固定長メモリプールIDの最大値(kernel_cfg.c)
67 */
68extern const ID tmax_mpfid;
69
70/*
71 * 固定長メモリプール初期化ブロックのエリア(kernel_cfg.c)
72 */
73extern const MPFINIB mpfinib_table[];
74
75/*
76 * 固定長メモリプール管理ブロックのエリア(kernel_cfg.c)
77 */
78extern MPFCB mpfcb_table[];
79
80/*
81 * 固定長メモリプールの数
82 */
83#define TNUM_MPF ((UINT)(tmax_mpfid - TMIN_MPFID + 1))
84
85/*
86 * 固定長メモリプールIDから固定長メモリプール管理ブロックを取り出すた
87 * めのマクロ
88 */
89#define INDEX_MPF(mpfid) ((UINT)((mpfid) - TMIN_MPFID))
90#define get_mpfcb(mpfid) (&(mpfcb_table[INDEX_MPF(mpfid)]))
91
92/*
93 * 固定長メモリプール待
94ち情
95報ブロックの定義
96 */
97typedef struct fixed_memorypool_waiting_information {
98 WINFO winfo; /* 標準の待
99ち情
100報ブロック */
101 WOBJCB *wobjcb; /* 待
102ちオブジェクトの管理ブロック */
103 VP blk; /* 獲得したメモリブロック */
104} WINFO_MPF;
105
106/*
107 * 固定長メモリプール機能の初期化
108 */
109#ifdef __mpfini
110
111void
112mempfix_initialize()
113{
114 UINT i;
115 MPFCB *mpfcb;
116
117 for (mpfcb = mpfcb_table, i = 0; i < TNUM_MPF; mpfcb++, i++) {
118 queue_initialize(&(mpfcb->wait_queue));
119 mpfcb->mpfinib = &(mpfinib_table[i]);
120 mpfcb->unused = mpfcb->mpfinib->mpf;
121 mpfcb->freelist = NULL;
122 }
123}
124
125#endif /* __mpfini */
126
127/*
128 * 固定長メモリプールからブロックを獲得
129 */
130#ifdef __mpfget
131
132BOOL
133mempfix_get_block(MPFCB *mpfcb, VP *p_blk)
134{
135 FREEL *free;
136
137 if (mpfcb->freelist != NULL) {
138 free = mpfcb->freelist;
139 mpfcb->freelist = free->next;
140 *p_blk = (VP) free;
141 return(TRUE);
142 }
143 else if (mpfcb->unused < mpfcb->mpfinib->limit) {
144 *p_blk = mpfcb->unused;
145 mpfcb->unused = (VP)((char *)(mpfcb->unused)
146 + mpfcb->mpfinib->blksz);
147 return(TRUE);
148 }
149 return(FALSE);
150}
151
152#endif /* __mpfget */
153
154/*
155 * 固定長メモリブロックの獲得
156 */
157#ifdef __get_mpf
158
159SYSCALL ER
160get_mpf(ID mpfid, VP *p_blk)
161{
162 MPFCB *mpfcb;
163 WINFO_MPF winfo;
164 ER ercd;
165
166 LOG_GET_MPF_ENTER(mpfid, p_blk);
167 CHECK_DISPATCH();
168 CHECK_MPFID(mpfid);
169 mpfcb = get_mpfcb(mpfid);
170
171 t_lock_cpu();
172 if (mempfix_get_block(mpfcb, p_blk)) {
173 ercd = E_OK;
174 }
175 else {
176 wobj_make_wait((WOBJCB *) mpfcb, (WINFO_WOBJ *) &winfo);
177 dispatch();
178 ercd = winfo.winfo.wercd;
179 if (ercd == E_OK) {
180 *p_blk = winfo.blk;
181 }
182 }
183 t_unlock_cpu();
184
185 exit:
186 LOG_GET_MPF_LEAVE(ercd, *p_blk);
187 return(ercd);
188}
189
190#endif /* __get_mpf */
191
192/*
193 * 固定長メモリブロックの獲得(ポーリング)
194 */
195#ifdef __pget_mpf
196
197SYSCALL ER
198pget_mpf(ID mpfid, VP *p_blk)
199{
200 MPFCB *mpfcb;
201 ER ercd;
202
203 LOG_PGET_MPF_ENTER(mpfid, p_blk);
204 CHECK_TSKCTX_UNL();
205 CHECK_MPFID(mpfid);
206 mpfcb = get_mpfcb(mpfid);
207
208 t_lock_cpu();
209 if (mempfix_get_block(mpfcb, p_blk)) {
210 ercd = E_OK;
211 }
212 else {
213 ercd = E_TMOUT;
214 }
215 t_unlock_cpu();
216
217 exit:
218 LOG_PGET_MPF_LEAVE(ercd, *p_blk);
219 return(ercd);
220}
221
222#endif /* __pget_mpf */
223
224/*
225 * 固定長メモリブロックの獲得(タイムアウトあり)
226 */
227#ifdef __tget_mpf
228
229SYSCALL ER
230tget_mpf(ID mpfid, VP *p_blk, TMO tmout)
231{
232 MPFCB *mpfcb;
233 WINFO_MPF winfo;
234 TMEVTB tmevtb;
235 ER ercd;
236
237 LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout);
238 CHECK_DISPATCH();
239 CHECK_MPFID(mpfid);
240 CHECK_TMOUT(tmout);
241 mpfcb = get_mpfcb(mpfid);
242
243 t_lock_cpu();
244 if (mempfix_get_block(mpfcb, p_blk)) {
245 ercd = E_OK;
246 }
247 else if (tmout == TMO_POL) {
248 ercd = E_TMOUT;
249 }
250 else {
251 wobj_make_wait_tmout((WOBJCB *) mpfcb, (WINFO_WOBJ *) &winfo,
252 &tmevtb, tmout);
253 dispatch();
254 ercd = winfo.winfo.wercd;
255 if (ercd == E_OK) {
256 *p_blk = winfo.blk;
257 }
258 }
259 t_unlock_cpu();
260
261 exit:
262 LOG_TGET_MPF_LEAVE(ercd, *p_blk);
263 return(ercd);
264}
265
266#endif /* __tget_mpf */
267
268/*
269 * 固定長メモリブロックの返却
270 */
271#ifdef __rel_mpf
272
273SYSCALL ER
274rel_mpf(ID mpfid, VP blk)
275{
276 MPFCB *mpfcb;
277 TCB *tcb;
278 FREEL *free;
279 ER ercd;
280
281 LOG_REL_MPF_ENTER(mpfid, blk);
282 CHECK_TSKCTX_UNL();
283 CHECK_MPFID(mpfid);
284 mpfcb = get_mpfcb(mpfid);
285 CHECK_PAR(mpfcb->mpfinib->mpf <= blk
286 && blk < mpfcb->mpfinib->limit
287 && ((char *)(blk) - (char *)(mpfcb->mpfinib->mpf))
288 % mpfcb->mpfinib->blksz == 0);
289
290 t_lock_cpu();
291 if (!(queue_empty(&(mpfcb->wait_queue)))) {
292 tcb = (TCB *) queue_delete_next(&(mpfcb->wait_queue));
293 ((WINFO_MPF *)(tcb->winfo))->blk = blk;
294 if (wait_complete(tcb)) {
295 dispatch();
296 }
297 ercd = E_OK;
298 }
299 else {
300 free = (FREEL *) blk;
301 free->next = mpfcb->freelist;
302 mpfcb->freelist = free;
303 ercd = E_OK;
304 }
305 t_unlock_cpu();
306
307 exit:
308 LOG_REL_MPF_LEAVE(ercd);
309 return(ercd);
310}
311
312#endif /* __rel_mpf */
Note: See TracBrowser for help on using the repository browser.