(toppers-users 2554) Re: chk_flg_cond にバグ
小南靖雄
ykominami @ nifty.com
2006年 10月 31日 (火) 11:47:07 JST
小南です。
On Mon, 30 Oct 2006 11:24:38 +0900
takaya_kakizaki @ gmx.yamaha.com wrote:
> 柿崎と申します。
>
> FI4のソースを見たのですが、
>
> QUEUE *chk_flg_cond(FLGCB *flgcb, QUEUE *queue, BOOL *disp)
> {
> TCB *tcb;
> WINFO_FLG *winfo;
> QUEUE *ret;
>
> tcb = (TCB *)queue;
> ret = queue;
> winfo = (WINFO_FLG *)(tcb->winfo);
> if (eventflag_cond(flgcb, winfo->waiptn,
> winfo->wfmode, &(winfo->flgptn))) {
> // queue_delete(&(tcb->task_queue));
> ret = queue->prev;
> queue_delete(queue);
> if (wait_complete(tcb,schedtsk)) {
> *disp = TRUE;
> } else {
> *disp = FALSE;
> }
> }
> return ret;
> }
>
> において、初めのifを通らない場合、dispが初期化されない気がします。
> chk_flg_condを呼び出した側ではdispを自動変数で取っているので
> 呼び出された後どの値が入るかが不定になりますが、どうでしょう。
> あらかじめdispをFALSEに初期化しておく必要はありませんか。
>
> よろしくお願いします。
>
待ち解除条件が成立したら、ディスパッチが必要か否かを呼出側に返し、
呼出側がそれをもとにdispatch()を呼び出すかを決める、あるいは
さらに自分自身の処理の結果も含めて、自分自身を呼出た側にディスパッチ
の必要の有無を返すのが、JSPと共通するパターンです。
今回の場合、関数chk_flg_cond()は、必ずdispに値を設定しないと
いけません。
しかし御指摘のとおり、dispへの設定を行わないケースが存在します。
これはバグと言っていいと思います。
------------------------
小南靖雄 ykominami @ nifty.com