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
9 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
10 * によって公表されている GNU General Public License の Version 2 に記
11 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
36 * @(#) $Id: wait.c,v 1.1 2009/01/31 05:27:37 suikan Exp $
43 #include "jsp_kernel.h"
53 make_wait_tmout(WINFO *winfo, TMEVTB *tmevtb, TMO tmout)
55 make_non_runnable(runtsk);
56 runtsk->winfo = winfo;
58 winfo->tmevtb = tmevtb;
59 tmevtb_enqueue(tmevtb, (RELTIM) tmout,
60 (CBACK) wait_tmout, (VP) runtsk);
63 assert(tmout == TMO_FEVR);
68 #endif /* __waimake */
73 * tcb で指定されるタスクを,待ち解除するようタスク状態を更新する.待
74 * ち解除するタスクが実行できる状態になる場合は,レディキューにつなぐ.
75 * また,ディスパッチが必要な場合には TRUE を返す.
78 make_non_wait(TCB *tcb)
80 assert(TSTAT_WAITING(tcb->tstat));
82 if (!(TSTAT_SUSPENDED(tcb->tstat))) {
86 return(make_runnable(tcb));
92 tcb->tstat = TS_SUSPENDED;
104 wait_complete(TCB *tcb)
106 if (tcb->winfo->tmevtb != NULL) {
107 tmevtb_dequeue(tcb->winfo->tmevtb);
109 tcb->winfo->wercd = E_OK;
110 return(make_non_wait(tcb));
113 #endif /* __waicmp */
123 if ((tcb->tstat & TS_WAIT_WOBJ) != 0) {
124 queue_delete(&(tcb->task_queue));
126 tcb->winfo->wercd = E_TMOUT;
127 if (make_non_wait(tcb)) {
132 #endif /* __waitmo */
136 wait_tmout_ok(TCB *tcb)
138 tcb->winfo->wercd = E_OK;
139 if (make_non_wait(tcb)) {
144 #endif /* __waitmook */
152 wait_cancel(TCB *tcb)
154 if (tcb->winfo->tmevtb != NULL) {
155 tmevtb_dequeue(tcb->winfo->tmevtb);
157 if ((tcb->tstat & TS_WAIT_WOBJ) != 0) {
158 queue_delete(&(tcb->task_queue));
162 #endif /* __waican */
166 wait_release(TCB *tcb)
169 tcb->winfo->wercd = E_RLWAI;
170 return(make_non_wait(tcb));
173 #endif /* __wairel */
179 queue_insert_tpri(TCB *tcb, QUEUE *queue)
182 UINT priority = tcb->priority;
184 for (entry = queue->next; entry != queue; entry = entry->next) {
185 if (priority < ((TCB *) entry)->priority) {
189 queue_insert_prev(entry, &(tcb->task_queue));
193 * 実行中のタスクの同期・通信オブジェクトの待ちキューへの挿入
196 wobj_queue_insert(WOBJCB *wobjcb)
198 if ((wobjcb->wobjinib->wobjatr & TA_TPRI) != 0) {
199 queue_insert_tpri(runtsk, &(wobjcb->wait_queue));
202 queue_insert_prev(&(wobjcb->wait_queue),
203 &(runtsk->task_queue));
208 * 同期・通信オブジェクトに対する待ち状態への移行
213 wobj_make_wait(WOBJCB *wobjcb, WINFO_WOBJ *winfo)
215 runtsk->tstat = (TS_WAITING | TS_WAIT_WOBJ | TS_WAIT_WOBJCB);
216 make_wait(&(winfo->winfo));
217 wobj_queue_insert(wobjcb);
218 winfo->wobjcb = wobjcb;
222 #endif /* __wobjwai */
226 wobj_make_wait_tmout(WOBJCB *wobjcb, WINFO_WOBJ *winfo,
227 TMEVTB *tmevtb, TMO tmout)
229 runtsk->tstat = (TS_WAITING | TS_WAIT_WOBJ | TS_WAIT_WOBJCB);
230 make_wait_tmout(&(winfo->winfo), tmevtb, tmout);
231 wobj_queue_insert(wobjcb);
232 winfo->wobjcb = wobjcb;
236 #endif /* __wobjwaitmo */
243 wobj_change_priority(WOBJCB *wobjcb, TCB *tcb)
245 if ((wobjcb->wobjinib->wobjatr & TA_TPRI) != 0) {
246 queue_delete(&(tcb->task_queue));
247 queue_insert_tpri(tcb, &(wobjcb->wait_queue));
251 #endif /* __wobjpri */