OSDN Git Service

b1c4a034b600db1fe2603a53978ad22927b019a1
[toppersasp4lpc/asp.git] / asp / kernel / wait.c
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: wait.c 1841 2010-07-10 17:37:34Z ertl-hiro $
41  */
42
43 /*
44  *              待ち状態管理モジュール
45  */
46
47 #include "kernel_impl.h"
48 #include "wait.h"
49
50 /*
51  *  待ち状態への遷移(タイムアウト指定)
52  */
53 #ifdef TOPPERS_waimake
54
55 void
56 make_wait_tmout(WINFO *p_winfo, TMEVTB *p_tmevtb, TMO tmout)
57 {
58         (void) make_non_runnable(p_runtsk);
59         p_runtsk->p_winfo = p_winfo;
60         if (tmout > 0) {
61                 p_winfo->p_tmevtb = p_tmevtb;
62                 tmevtb_enqueue(p_tmevtb, (RELTIM) tmout,
63                                                 (CBACK) wait_tmout, (void *) p_runtsk);
64         }
65         else {
66                 assert(tmout == TMO_FEVR);
67                 p_winfo->p_tmevtb = NULL;
68         }
69 }
70
71 #endif /* TOPPERS_waimake */
72
73 /*
74  *  待ち解除
75  */
76 #ifdef TOPPERS_waicmp
77
78 bool_t
79 wait_complete(TCB *p_tcb)
80 {
81         wait_dequeue_tmevtb(p_tcb);
82         p_tcb->p_winfo->wercd = E_OK;
83         return(make_non_wait(p_tcb));
84 }
85
86 #endif /* TOPPERS_waicmp */
87
88 /*
89  *  タイムアウトに伴う待ち解除
90  */
91 #ifdef TOPPERS_waitmo
92
93 void
94 wait_tmout(TCB *p_tcb)
95 {
96         wait_dequeue_wobj(p_tcb);
97         p_tcb->p_winfo->wercd = E_TMOUT;
98         if (make_non_wait(p_tcb)) {
99                 reqflg = true;
100         }
101
102         /*
103          *  ここで優先度の高い割込みを受け付ける.
104          */
105         i_unlock_cpu();
106         i_lock_cpu();
107 }
108
109 #endif /* TOPPERS_waitmo */
110 #ifdef TOPPERS_waitmook
111
112 void
113 wait_tmout_ok(TCB *p_tcb)
114 {
115         p_tcb->p_winfo->wercd = E_OK;
116         if (make_non_wait(p_tcb)) {
117                 reqflg = true;
118         }
119
120         /*
121          *  ここで優先度の高い割込みを受け付ける.
122          */
123         i_unlock_cpu();
124         i_lock_cpu();
125 }
126
127 #endif /* TOPPERS_waitmook */
128
129 /*
130  *  待ち状態の強制解除
131  */
132 #ifdef TOPPERS_wairel
133
134 bool_t
135 wait_release(TCB *p_tcb)
136 {
137         wait_dequeue_wobj(p_tcb);
138         wait_dequeue_tmevtb(p_tcb);
139         p_tcb->p_winfo->wercd = E_RLWAI;
140         return(make_non_wait(p_tcb));
141 }
142
143 #endif /* TOPPERS_wairel */
144
145 /*
146  *  実行中のタスクの同期・通信オブジェクトの待ちキューへの挿入
147  *
148  *  実行中のタスクを,同期・通信オブジェクトの待ちキューへ挿入する.オ
149  *  ブジェクトの属性に応じて,FIFO順またはタスク優先度順で挿入する.
150  */
151 Inline void
152 wobj_queue_insert(WOBJCB *p_wobjcb)
153 {
154         if ((p_wobjcb->p_wobjinib->wobjatr & TA_TPRI) != 0U) {
155                 queue_insert_tpri(&(p_wobjcb->wait_queue), p_runtsk);
156         }
157         else {
158                 queue_insert_prev(&(p_wobjcb->wait_queue), &(p_runtsk->task_queue));
159         }
160 }
161
162 /*
163  *  同期・通信オブジェクトに対する待ち状態への遷移
164  */
165 #ifdef TOPPERS_wobjwai
166
167 void
168 wobj_make_wait(WOBJCB *p_wobjcb, WINFO_WOBJ *p_winfo_wobj)
169 {
170         make_wait(&(p_winfo_wobj->winfo));
171         wobj_queue_insert(p_wobjcb);
172         p_winfo_wobj->p_wobjcb = p_wobjcb;
173         LOG_TSKSTAT(p_runtsk);
174 }
175
176 #endif /* TOPPERS_wobjwai */
177 #ifdef TOPPERS_wobjwaitmo
178
179 void
180 wobj_make_wait_tmout(WOBJCB *p_wobjcb, WINFO_WOBJ *p_winfo_wobj,
181                                                                 TMEVTB *p_tmevtb, TMO tmout)
182 {
183         make_wait_tmout(&(p_winfo_wobj->winfo), p_tmevtb, tmout);
184         wobj_queue_insert(p_wobjcb);
185         p_winfo_wobj->p_wobjcb = p_wobjcb;
186         LOG_TSKSTAT(p_runtsk);
187 }
188
189 #endif /* TOPPERS_wobjwaitmo */
190
191 /*
192  *  待ちキューの初期化
193  */
194 #ifdef TOPPERS_iniwque
195
196 bool_t
197 init_wait_queue(QUEUE *p_wait_queue)
198 {
199         TCB             *p_tcb;
200         bool_t  dspreq = false;
201
202         while (!queue_empty(p_wait_queue)) {
203                 p_tcb = (TCB *) queue_delete_next(p_wait_queue);
204                 wait_dequeue_tmevtb(p_tcb);
205                 p_tcb->p_winfo->wercd = E_DLT;
206                 if (make_non_wait(p_tcb)) {
207                         dspreq = true;
208                 };
209         }
210         return(dspreq);
211 }
212
213 #endif /* TOPPERS_iniwque */