[mayaa-user:680] カスタムタグのreleaseメソッド呼び出しのタイミングについて

佐竹雅央 [E-MAIL ADDRESS DELETED]
2008年 8月 20日 (水) 16:00:09 JST


佐竹と申します、お世話になっております。

Mayaa1.1.15〜16を使わせて頂いています。

早速ですが、JSPカスタムタグのプーリングとreleaseについて、
確認させていただきたいことがあります。


カスタムタグのrelease()メソッドですが、ガベージ直前にしか
呼ばないことになっていますが、Mayaaの JspProcessor は、
タグの使用後に、毎回これを呼んでしまっている気がします。

そのため、release()の中で普段はnullになることの無いフィールドも
含めてnullクリアしているタグが、プーリング・再利用されると、
NullPointerExceptionを発生させてしまいます。

(具体的にはStrutsのLinkTagで発生しました)

ただ、過去ログなどからMayaaではTagのプーリングをしていない
ような記述もありましたのでソースを呼んでみましたところ、

0.Tag(と属性)に紐付くPoolがないので空Poolを作成(※初回のみ)
1.PoolからTagを取り出そうとして空なので新しいTagを作成
2.Tagを使用
(略)
3.Tag#release()を呼ぶ
4.TagをPoolに戻す
5.TryCatchFinallyなTagかチェックするためにPoolからTag取り出し
6.チェックに使ったTagはPoolに戻さない

という具合になっているように見受けられました。
(TryCatchFinallyであるTagの場合は少しタイミングが変わるようですが)

4でPoolに入れるものの5でスグに取り出して、
そのまま戻さないので使い捨て同然なのですが、
別スレッドが4,5の間に滑り込んでrelease呼び出し後の
Tagを使ってしまうことはありませんか?

勘違いであれば申し訳ありません。

以上、宜しくお願い致します。


mayaa-user メーリングリストの案内