3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
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
11 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
12 * によって公表されている GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
21 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
26 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
27 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
28 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
30 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
31 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
33 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
34 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
35 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
36 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
38 * @(#) $Id: mempfix.c,v 1.1 2009/01/31 05:27:37 suikan Exp $
45 #include "jsp_kernel.h"
52 * 固定長メモリプールIDの最大値(kernel_cfg.c)
54 extern const ID tmax_mpfid;
57 * 固定長メモリプール初期化ブロックのエリア(kernel_cfg.c)
59 extern const MPFINIB mpfinib_table[];
62 * 固定長メモリプール管理ブロックのエリア(kernel_cfg.c)
64 extern MPFCB mpfcb_table[];
69 #define TNUM_MPF ((UINT)(tmax_mpfid - TMIN_MPFID + 1))
72 * 固定長メモリプールIDから固定長メモリプール管理ブロックを取り出すた
75 #define INDEX_MPF(mpfid) ((UINT)((mpfid) - TMIN_MPFID))
76 #define get_mpfcb(mpfid) (&(mpfcb_table[INDEX_MPF(mpfid)]))
79 * 固定長メモリプール待ち情報ブロックの定義
81 typedef struct fixed_memorypool_waiting_information {
82 WINFO winfo; /* 標準の待ち情報ブロック */
83 WOBJCB *wobjcb; /* 待ちオブジェクトの管理ブロック */
84 VP blk; /* 獲得したメモリブロック */
98 for (mpfcb = mpfcb_table, i = 0; i < TNUM_MPF; mpfcb++, i++) {
99 queue_initialize(&(mpfcb->wait_queue));
100 mpfcb->mpfinib = &(mpfinib_table[i]);
101 mpfcb->unused = mpfcb->mpfinib->mpf;
102 mpfcb->freelist = NULL;
106 #endif /* __mpfini */
114 mempfix_get_block(MPFCB *mpfcb, VP *p_blk)
118 if (mpfcb->freelist != NULL) {
119 free = mpfcb->freelist;
120 mpfcb->freelist = free->next;
124 else if (mpfcb->unused < mpfcb->mpfinib->limit) {
125 *p_blk = mpfcb->unused;
126 mpfcb->unused = (VP)((char *)(mpfcb->unused)
127 + mpfcb->mpfinib->blksz);
133 #endif /* __mpfget */
141 get_mpf(ID mpfid, VP *p_blk)
147 LOG_GET_MPF_ENTER(mpfid, p_blk);
150 mpfcb = get_mpfcb(mpfid);
153 if (mempfix_get_block(mpfcb, p_blk)) {
157 wobj_make_wait((WOBJCB *) mpfcb, (WINFO_WOBJ *) &winfo);
159 ercd = winfo.winfo.wercd;
167 LOG_GET_MPF_LEAVE(ercd, *p_blk);
171 #endif /* __get_mpf */
174 * 固定長メモリブロックの獲得(ポーリング)
179 pget_mpf(ID mpfid, VP *p_blk)
184 LOG_PGET_MPF_ENTER(mpfid, p_blk);
187 mpfcb = get_mpfcb(mpfid);
190 if (mempfix_get_block(mpfcb, p_blk)) {
199 LOG_PGET_MPF_LEAVE(ercd, *p_blk);
203 #endif /* __pget_mpf */
206 * 固定長メモリブロックの獲得(タイムアウトあり)
211 tget_mpf(ID mpfid, VP *p_blk, TMO tmout)
218 LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout);
222 mpfcb = get_mpfcb(mpfid);
225 if (mempfix_get_block(mpfcb, p_blk)) {
228 else if (tmout == TMO_POL) {
232 wobj_make_wait_tmout((WOBJCB *) mpfcb, (WINFO_WOBJ *) &winfo,
235 ercd = winfo.winfo.wercd;
243 LOG_TGET_MPF_LEAVE(ercd, *p_blk);
247 #endif /* __tget_mpf */
255 rel_mpf(ID mpfid, VP blk)
262 LOG_REL_MPF_ENTER(mpfid, blk);
265 mpfcb = get_mpfcb(mpfid);
266 CHECK_PAR(mpfcb->mpfinib->mpf <= blk
267 && blk < mpfcb->mpfinib->limit
268 && ((char *)(blk) - (char *)(mpfcb->mpfinib->mpf))
269 % mpfcb->mpfinib->blksz == 0);
272 if (!(queue_empty(&(mpfcb->wait_queue)))) {
273 tcb = (TCB *) queue_delete_next(&(mpfcb->wait_queue));
274 ((WINFO_MPF *)(tcb->winfo))->blk = blk;
275 if (wait_complete(tcb)) {
281 free = (FREEL *) blk;
282 free->next = mpfcb->freelist;
283 mpfcb->freelist = free;
289 LOG_REL_MPF_LEAVE(ercd);
293 #endif /* __rel_mpf */