OSDN Git Service

4c900b77da3442db977ffe51d0fe8d57c5369253
[hos/hos-v4a.git] / kernel / source / object / flg / twai_flg.c
1 /** 
2  *  Hyper Operating System V4 Advance
3  *
4  * @file  twai_flg.c
5  * @brief %jp{イベントフラグ待ち(タイムアウトあり)}%en{Wait for Eventflag(with Timeout)}
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_TWAI_FLG
19
20
21 /** %jp{イベントフラグ待ち(タイムアウトあり)}%en{Wait for Eventflag(with Timeout)}
22  * @param  flgid    %jp{待ち対象のイベントフラグのID番号}%en{ID number of the eventflag to be set}
23  * @param  flgptn   %jp{待ちビットパターン}%en{Wait bit pattern}
24  * @param  wfmode   %jp{待ちモード}%en{Wait mode}
25  * @param  p_flgptn %jp{待ち解除時のビットパターンの返却アドレス}%en{Bit pattern causing a task to be released from waiting}
26  * @retval E_OK     %jp{正常終了}%en{Normal completion}
27  * @retval E_ID     %jp{不正ID番号(flgidが不正あるいは使用できない)}%en{Invalid ID number(flgid is invalid or unusable)}
28  * @retval E_CTX    %jp{コンテキストエラー}%en{Context error}
29  * @retval E_NOEXS  %jp{オブジェクト未生成(対象イベントフラグが未登録)}%en{Non-existant object(specified eventflag is not registerd)}
30  * @retval E_PAR    %jp{パラメータエラー(waiptn, wfmode, p_flgptnが不正)}%en{Parameter error(waiptn, wfmode, or p_flgptn is invalid)}
31  * @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)}
32  * @retval E_RLWAI  %jp{待ち状態の強制解除(待ち状態の間にrel_waiを受付)}%en{Forced release from waiting(accept rel_wai while waiting)}
33  * @retval E_DLT    %jp{待ちオブジェクトの削除(待ち状態の間に対象イベントフラグが削除)}%en{Waiting object deleted(eventflag is deleted waiting)}
34  */
35 ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
36 {
37         _KERNEL_T_FLGINF flginf;
38         _KERNEL_T_FLGHDL flghdl;
39         _KERNEL_T_TSKHDL tskhdl;
40         ER               ercd;
41
42         /* %jp{コンテキストチェック} */
43 #if _KERNEL_SPT_WAI_FLG_E_CTX
44         if ( _KERNEL_SYS_SNS_DPN() && tmout != TMO_POL )
45         {
46                 return E_CTX;                   /* %jp{コンテキストエラー}%en{Context error} */
47         }
48 #endif
49
50         /* %jp{ID のチェック} */
51 #ifdef _KERNEL_SPT_TWAI_FLG_E_ID
52         if ( !_KERNEL_FLG_CHECK_FLGID(flgid) )
53         {
54                 return E_ID;    /* %jp{ID不正} */
55         }
56 #endif
57         
58         _KERNEL_ENTER_SVC();            /* %jp{サービスコール開始} */
59         
60         /* %jp{オブジェクト存在チェック} */
61 #ifdef _KERNEL_SPT_TWAI_FLG_E_NOEXS
62         if ( !_KERNEL_FLG_CHECK_EXS(flgid) )
63         {
64                 _KERNEL_LEAVE_SVC();    /* %jp{サービスコール終了} */
65                 return E_NOEXS;                 /* %jp{オブジェクト未生成} */
66         }
67 #endif
68         
69         /* %jp{イベントフラグハンドル取得} */
70         flghdl = _KERNEL_FLG_ID2FLGHDL(flgid);
71
72 #if _KERNEL_SPT_TWAI_FLG_E_ILUSE
73         if ( !(_KERNEL_FLG_GET_FLGATR(flghdl) & TA_WMUL) && _kernel_ref_que(pk_que) != _KERNEL_TSKHDL_NULL && tmout != TMO_POL )
74         {
75                 _KERNEL_LEAVE_SVC();    /* %jp{サービスコール終了} */
76                 return E_ILUSE;
77         }
78 #endif
79
80         /* %jp{待ち条件設定} */
81         flginf.waiptn = waiptn;
82         flginf.wfmode = wfmode;
83         
84         /* %jp{フラグチェック} */
85         if ( _kernel_chk_flg(flghdl, &flginf) )
86         {
87                 /* %jp{既に条件を満たしているなら} */
88                 *p_flgptn = _KERNEL_FLG_GET_FLGPTN(flghdl);             /* %jp{解除時のフラグパターンを格納} */
89
90 #if _KERNEL_SPT_FLG_TA_CLR
91                 if ( _KERNEL_FLG_GET_FLGATR(flghdl) & TA_CLR )
92                 {
93                         _KERNEL_FLG_SET_FLGPTN(flghdl, 0);                      /* %jp{クリア属性があればクリア} */
94                 }
95 #endif
96                 
97                 ercd = E_OK;
98         }
99         else
100         {
101                 if ( tmout != TMO_POL )
102                 {
103                         /* %jp{タスクを待ち状態にする} */
104                         tskhdl = _KERNEL_SYS_GET_RUNTSK();
105                         _KERNEL_DSP_WAI_TSK(tskhdl);
106                         _KERNEL_TSK_SET_TSKSTAT(tskhdl, _KERNEL_TTS_WAI);
107                         _KERNEL_TSK_SET_TSKWAIT(tskhdl, _KERNEL_TTW_SEM);
108                         _KERNEL_TSK_SET_WOBJID(tskhdl, flgid);
109                         _KERNEL_TSK_SET_DATA(tskhdl, (VP_INT)&flginf);
110                         _KERNEL_FLG_ADD_QUE(flghdl, tskhdl);                            /* %jp{待ち行列に追加} */
111
112                         if ( tmout != TMO_FEVR )
113                         {
114                                 _KERNEL_ADD_TOQ(tskhdl, tmout);                                 /* %jp{タイムアウトキューに追加} */
115                         }
116         
117                         /* %jp{タスクディスパッチの実行} */
118                         _KERNEL_DSP_TSK();
119
120                         /* %jp{エラーコードの取得} */
121                         ercd = _KERNEL_TSK_GET_ERCD(tskhdl);
122
123                         /* %jp{条件を満たして解除されたのなら} */
124                         if ( ercd == E_OK )
125                         {
126                                 *p_flgptn = flginf.waiptn;                      /* %jp{解除時のフラグパターンを格納} */
127                         }
128                 }
129                 else
130                 {
131                         ercd = E_TMOUT;  /* %jp{タイムアウト}%en{Timeout} */
132                 }
133         }
134                 
135         _KERNEL_LEAVE_SVC();    /* %jp{サービスコール終了} */
136         
137         return ercd;    /* 成功 */
138 }
139
140
141 #else   /* _KERNEL_SPT_TWAI_FLG */
142
143
144 #if _KERNEL_SPT_TWAI_FLG_E_NOSPT
145
146 /** %jp{イベントフラグ待ち}%en{Wait for Eventflag}
147  * @param  flgid    %jp{待ち対象のイベントフラグのID番号}%en{ID number of the eventflag to be set}
148  * @param  flgptn   %jp{待ちビットパターン}%en{Wait bit pattern}
149  * @param  wfmode   %jp{待ちモード}%en{Wait mode}
150  * @param  p_flgptn %jp{待ち解除時のビットパターンの返却アドレス}%en{Bit pattern causing a task to be released from waiting}
151  * @retval E_NOSPT  %jp{未サポート機能}%en{Unsupported function}
152  */
153 ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
154 {
155         return E_NOSPT;
156 }
157
158 #endif
159
160 #endif  /* _KERNEL_SPT_TWAI_FLG */
161
162
163 /* end of file */