(toppers-users 1540) Re: Fi4のバグ報告について

Kominami Yasuo NBC00224 @ nifty.com
2004年 7月 14日 (水) 23:32:07 JST


小南です。
すでにもなかさんに紹介されたバグトラッキングシステムに登録しました。
その後で、こちらに書いたものを見直したところ、誤りが有ることに気が
つきました。
間違った情報を修正するために、報告します。

On Tue, 13 Jul 2004 06:25:08 +0900
Kominami Yasuo <NBC00224 @ nifty.com> wrote:

> 3.すべてのcre_*サービスコールとacre_*サービスコールについて、複数のタスクによ
> るフリーリストの先頭にあるオブジェクト管理ブロックに対する競合が発生する場合が有る。
> cre_*サービスコールが、CHECK_OBJECT_CREATABLEを実行した後ディス
> パッチし、別のタスクがacre_*を実行すると、cre_*サービスコールはフリーリスト上に
> 存在しない管理ブロックをフリーリストから取りだそうとして、queue_delete_next
> 内でassert発生
これは発生しません。
ただしこの順序でも、また逆の順序(acre_*でt_get_free_idの前の
t_lock_cpu()の直前でディスパッチが発生し、別のタスクがcre_*で該当オブジェクト
を指定)では、acre_*とcre_*が同一IDのオブジェクトを割り当ててしまいます。
(非常にクリティカルなタイミングですが)

つまり、acre_*とcre_*の間では、どちらにとっても先取り勝ちで取得したはずのオブジェクト
を、相手が横取りしたようにみえる状態が起こり得るということです。

> 4.CRE_*サービスコールで生成したオブジェクトをdel_*で削除した後、同一IDを指定
> してcre_*すると、queue_delete_next内でassert発生
これも発生しません。
CRE_*で生成したオブジェクトは、del_*した後にcre_*で指定すれば再利用できます。
CRE_*で生成したオブジェクトはdel_*された後でも、acre_*では割り当てられません。

そもそもcre_*はqueue_delete_nextを呼び出しません。
acre_*中の処理と混同していました。

----------- 
小南 靖雄
ykominami @ nifty.com
(NBC00224 @ nifty.com)