(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