OSDN Git Service

(none)
[hos/hos-v4a.git] / kernel / source / object / flg / wai_flg.c
1 /** 
2  *  Hyper Operating System V4 Advance
3  *
4  * @file  wai_flg.c
5  * @brief %jp{イベントフラグ待ち}%en{Wait for Eventflag}
6  *
7  * Copyright (C) 1998-2006 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12
13 #include "core/core.h"
14 #include "object/flgobj.h"
15
16
17
18 #if _KERNEL_SPT_WAI_FLG
19
20
21 #if _KERNEL_SPT_TWAI_FLG && (_KERNEL_OPT_CODE_SIZE <= _KERNEL_OPT_SPEED)        /* %jp{twai_flgありで、サイズ優先なら} */
22
23 /** %jp{イベントフラグ待ち}%en{Wait for Eventflag}
24  * @param  flgid    %jp{待ち対象のイベントフラグのID番号}%en{ID number of the eventflag to be set}
25  * @param  flgptn   %jp{待ちビットパターン}%en{Wait bit pattern}
26  * @param  wfmode   %jp{待ちモード}%en{Wait mode}
27  * @param  p_flgptn %jp{待ち解除時のビットパターンの返却アドレス}%en{Bit pattern causing a task to be released from waiting}
28  * @retval E_OK     %jp{正常終了}%en{Normal completion}
29  * @retval E_ID     %jp{不正ID番号(flgidが不正あるいは使用できない)}%en{Invalid ID number(flgid is invalid or unusable)}
30  * @retval E_NOEXS  %jp{オブジェクト未生成(対象イベントフラグが未登録)}%en{Non-existant object(specified eventflag is not registerd)}
31  * @retval E_PAR    %jp{パラメータエラー(waiptn, wfmode, p_flgptnが不正)}%en{Parameter error(waiptn, wfmode, or p_flgptn is invalid)}
32  * @retval E_ILUSE  %jp{サービスコール不正使用(TA_WSGL属性が指定されたイベントフラグで待ちタスクあり}%en{Illegal service call use(there is already a task waiting for an eventflag with tahe TA_WSGL attribute)}
33  * @retval E_RLWAI  %jp{待ち状態の強制解除(待ち状態の間にrel_waiを受付)}%en{Forced release from waiting(accept rel_wai while waiting)}
34  * @retval E_DLT    %jp{待ちオブジェクトの削除(待ち状態の間に対象イベントフラグが削除)}%en{Waiting object deleted(eventflag is deleted waiting)}
35  */
36 ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
37 {
38         return twai_flg(flgid, waiptn, wfmode, p_flgptn, TMO_FEVR);
39 }
40
41 #else
42
43 /** %jp{イベントフラグ待ち}%en{Wait for Eventflag}
44  * @param  flgid    %jp{待ち対象のイベントフラグのID番号}%en{ID number of the eventflag to be set}
45  * @param  flgptn   %jp{待ちビットパターン}%en{Wait bit pattern}
46  * @param  wfmode   %jp{待ちモード}%en{Wait mode}
47  * @param  p_flgptn %jp{待ち解除時のビットパターンの返却アドレス}%en{Bit pattern causing a task to be released from waiting}
48  * @retval E_OK     %jp{正常終了}%en{Normal completion}
49  * @retval E_ID     %jp{不正ID番号(flgidが不正あるいは使用できない)}%en{Invalid ID number(flgid is invalid or unusable)}
50  * @retval E_CTX    %jp{コンテキストエラー}%en{Context error}
51  * @retval E_NOEXS  %jp{オブジェクト未生成(対象イベントフラグが未登録)}%en{Non-existant object(specified eventflag is not registerd)}
52  * @retval E_PAR    %jp{パラメータエラー(waiptn, wfmode, p_flgptnが不正)}%en{Parameter error(waiptn, wfmode, or p_flgptn is invalid)}
53  * @retval E_ILUSE  %jp{サービスコール不正使用(TA_WSGL属性が指定されたイベントフラグで待ちタスクあり}%en{Illegal service call use(there is already a task waiting for an eventflag with tahe TA_WSGL attribute)}
54  * @retval E_RLWAI  %jp{待ち状態の強制解除(待ち状態の間にrel_waiを受付)}%en{Forced release from waiting(accept rel_wai while waiting)}
55  * @retval E_DLT    %jp{待ちオブジェクトの削除(待ち状態の間に対象イベントフラグが削除)}%en{Waiting object deleted(eventflag is deleted waiting)}
56  */
57 ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
58 {
59         _KERNEL_T_FLGCB  *flgcb;
60         _KERNEL_T_FLGINF flginf;
61         _KERNEL_T_TSKHDL tskhdl;
62         _KERNEL_T_TCB    *tcb;
63         ER               ercd;
64
65         /* %jp{コンテキストチェック} */
66 #if _KERNEL_SPT_WAI_FLG_E_CTX
67         if ( _KERNEL_SYS_SNS_DPN() )
68         {
69                 return E_CTX;                   /* %jp{コンテキストエラー}%en{Context error} */
70         }
71 #endif
72
73         /* %jp{ID のチェック} */
74 #ifdef _KERNEL_SPT_WAI_FLG_E_ID
75         if ( !_KERNEL_FLG_CHECK_FLGID(flgid) )
76         {
77                 return E_ID;    /* %jp{ID不正} */
78         }
79 #endif
80
81         /* %jp{パラメータのチェック} */
82 #ifdef _KERNEL_SPT_WAI_FLG_E_PAR
83         if ( waiptn == 0 )
84         {
85                 return E_PAR;   /* %jp{パラメータ不正} */
86         }
87 #endif
88         
89         _KERNEL_ENTER_SVC();            /* %jp{サービスコール開始} */
90         
91         /* %jp{オブジェクト存在チェック} */
92 #ifdef _KERNEL_SPT_WAI_FLG_E_NOEXS
93         if ( !_KERNEL_FLG_CHECK_EXS(flgid) )
94         {
95                 _KERNEL_LEAVE_SVC();    /* %jp{サービスコール終了} */
96                 return E_NOEXS;                 /* %jp{オブジェクト未生成} */
97         }
98 #endif
99         
100         /* %jp{コントロールブロック取得} */
101         flgcb = _KERNEL_FLG_ID2FLGCB(flgid);
102
103 #if _KERNEL_SPT_WAI_FLG_E_ILUSE
104         if ( !(_KERNEL_FLG_GET_FLGATR(_KERNEL_FLG_GET_FLGCB_RO(flgid, flgcb)) & TA_WMUL)
105                         && _KERNEL_REF_QUE(_KERNEL_FLG_GET_QUE(flgcb)) != _KERNEL_TSKHDL_NULL )
106         {
107                 _KERNEL_LEAVE_SVC();    /* %jp{サービスコール終了} */
108                 return E_ILUSE;
109         }
110 #endif
111
112         /* %jp{待ち条件設定} */
113         flginf.waiptn = waiptn;
114         flginf.wfmode = wfmode;
115         
116         /* %jp{フラグチェック} */
117         if ( _kernel_chk_flg(flgcb, &flginf) )
118         {
119                 /* %jp{既に条件を満たしているなら} */
120                 if ( p_flgptn != NULL )
121                 {
122                         *p_flgptn = _KERNEL_FLG_GET_FLGPTN(flgcb);              /* %jp{解除時のフラグパターンを格納} */
123                 }
124                 
125 #if _KERNEL_SPT_FLG_TA_CLR
126                 if ( _KERNEL_FLG_GET_FLGATR(_KERNEL_FLG_GET_FLGCB_RO(flgid, flgcb)) & TA_CLR )
127                 {
128                         _KERNEL_FLG_SET_FLGPTN(flgcb, 0);               /* %jp{クリア属性があればクリア} */
129                 }
130 #endif
131                 
132                 ercd = E_OK;
133         }
134         else
135         {
136                 /* %jp{タスクを待ち状態にする} */
137                 tskhdl = _KERNEL_SYS_GET_RUNTSK();
138                 tcb    = _KERNEL_TSK_TSKHDL2TCB(tskhdl);                        /* %jp{TCB取得} */
139                 _KERNEL_TSK_SET_TSKSTAT(tcb, _KERNEL_TTS_WAI);
140                 _KERNEL_TSK_SET_TSKWAIT(tcb, _KERNEL_TTW_SEM);
141                 _KERNEL_TSK_SET_WOBJID(tcb, flgid);
142                 _KERNEL_TSK_SET_DATA(tcb, (VP_INT)&flginf);
143                 
144                 _KERNEL_DSP_WAI_TSK(tskhdl);
145                 _KERNEL_FLG_ADD_QUE(flgcb, _KERNEL_FLG_GET_FLGCB_RO(flgid, flgcb), tskhdl);             /* %jp{待ち行列に追加} */
146                 
147                 /* %jp{タスクディスパッチの実行} */
148                 _KERNEL_DSP_TSK();
149
150                 /* %jp{エラーコードの取得} */
151                 ercd = _KERNEL_TSK_GET_ERCD(tcb);
152
153                 /* %jp{条件を満たして解除されたのなら} */
154                 if ( ercd == E_OK )
155                 {
156                         if ( p_flgptn != NULL )
157                         {
158                                 *p_flgptn = flginf.waiptn;              /* %jp{解除時のフラグパターンを格納} */
159                         }
160                 }
161         }
162                 
163         _KERNEL_LEAVE_SVC();    /* %jp{サービスコール終了} */
164         
165         return ercd;    /* 成功 */
166 }
167
168 #endif
169
170
171 #else   /* _KERNEL_SPT_WAI_FLG */
172
173
174 #if _KERNEL_SPT_WAI_FLG_E_NOSPT
175
176 /** %jp{イベントフラグ待ち}%en{Wait for Eventflag}
177  * @param  flgid    %jp{待ち対象のイベントフラグのID番号}%en{ID number of the eventflag to be set}
178  * @param  flgptn   %jp{待ちビットパターン}%en{Wait bit pattern}
179  * @param  wfmode   %jp{待ちモード}%en{Wait mode}
180  * @param  p_flgptn %jp{待ち解除時のビットパターンの返却アドレス}%en{Bit pattern causing a task to be released from waiting}
181  * @retval E_NOSPT  %jp{未サポート機能}%en{Unsupported function}
182  */
183 ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
184 {
185         return E_NOSPT;
186 }
187
188 #endif
189
190 #endif  /* _KERNEL_SPT_WAI_FLG */
191
192
193 /* end of file */