プロジェクト

全般

プロフィール

バグ #3574

完了

Manager::getORB() 等のリファレンスカウントとownershipを整理する

n-ando さんが約8年前に追加. ほぼ8年前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
-
開始日:
2016/07/19
期日:
進捗率:

100%

予定工数:

説明

getORB(),getPOA(),getPOAManager() などはリファレンスカウントを増やさずに参照を返すため_varで受けるとオブジェクトが削除される問題。
CORBAのマナー的には、関数内でduplicateなどでリファレンスカウントを増やしownershipを保持したまま、参照を返すべき。

安藤様

宮本です。

direct接続したときに発生する不具合ですが、原因を特定できたのでご報告します。

まず原因箇所はOutPortBaseクラスのgetLocalInPort関数の以下の部分でした。

CORBA::ORB_var orb = RTC::Manager::instance().getORB();

PortableServer::POA_var poa = RTC::Manager::instance().getPOA();

この部分を以下のように修正したら不具合は発生しなくなりました。

CORBA::ORB_var orb = CORBA::ORB::_duplicate(RTC::Manager::instance().getORB());

PortableServer::POA_var poa = PortableServer::POA::_duplicate(RTC::Manager::instance().getPOA());

修正前のようにgetORB関数で取得したポインタをそのまま渡してしまうと、ORB_varのデストラクタでCORBA::release関数を呼び出してリファレンスカウントが1つ減ります。
つまりgetLocalInPort関数を呼び出すたびにリファレンスカウントが減ってしまうのが原因なので、_duplicate関数でリファレンスカウントを増やしてやれば不具合はなくなるはずです。

ソースコードを読んだ結果、以下の部分にも同様の記述があったので修正する必要があると思います。

・CORBA_SeqUtil.cppのrefToVstring関数
・CorbaNamingクラスのコンストラクタ

以上です。

他の形式にエクスポート: Atom PDF