[openrtm-users 00897] Re: OpenRTM 1.0.0-RC1の不具合について
Tomoya Sakaguchi
sakaguchi @ sec.co.jp
2009年 8月 3日 (月) 10:26:01 JST
産総研 安藤様
セックの坂口です。
お世話になっております。
返事が大変遅くなり申し訳ありません。
今回の不具合について、早急な対応ありがとうございます。
お送りいただいたパッチですが、試してみます。
以上です。
Ando Noriaki さんは書きました:
> 坂口様
>
> 産総研 安藤です
>
> ご報告ありがとうございました。
>
> とりあえず、以下のパッチで1.と2.(2)については
> 対処可能かと思います。お試しいただけないでしょうか?
>
> 2.(1)については、現在のところInPortおよびサービスポートは
> 相手のポートの生死を判断して、自動的にdisconnectする
> 仕組みが備わっておらず、そういう仕様になっております。
>
> InPortに関しては、何らかの方法でそうした仕組みを
> 導入したいと考えています。RELEASE版には入ると思います。
>
> サービスポートに関しては、、、、難しそうですね。
> 何かいいアイディアがございましたら教えていただけませんか?
>
>
> 以上、よろしくお願いいたします。
>
>
>
>
>
> 2009/07/30 23:04 に Tomoya Sakaguchi<sakaguchi @ sec.co.jp> さんは書きました:
>> OpenRTM-aist開発者各位
>>
>> セックの坂口です。
>> お世話になっております。
>>
>> OpenRTM 1.0.0-RC1において、以下の不具合が見受けられましたので、
>> ご報告いたします。
>>
>> 1.PortBase継承クラスの利用時にメモリリーク
>> 2.ポートの切断時の不具合
>>
>> 以下、詳細です。
>> ----
>>
>> 1.PortBase継承クラスの利用時にメモリリーク
>> メモリリークは、PortBaseを継承したクラス(CorbaPortなど)利用時に
>> 発生します。具体的には、PortBaseを継承したクラスのオブジェクトを
>> 宣言し、オブジェクトのスコープを抜けても、そのオブジェクトのメモリが
>> 解放されていないようです。
>>
>> 2.ポートの切断時の不具合
>> 本不具合は、2点あります。
>>
>> (1)InPortのConnectorProfileが残る
>> InPortを持つRTCと、OutPortを持つRTCを起動し、RtSystemEditorにより
>> ポートの接続を行い、OutPortを持つRTCを不正終了させた後、再起動して
>> 再度ポート接続を行います。不正終了とは、右上の×ボタンの押下です。
>> このとき、InPortのConnectorProfileは最初に接続したときの情報が
>> 残ってしまいます。
>>
>> (2)write()呼び出しにより例外が発生
>> 上記2RTCのポート接続をRtSystemEditorではなく、他アプリで
>> 行います。このとき、ConnectorProfileのportsにはInPort、OutPortの
>> 順に情報を代入し、connect()を実行します。
>> そして、InPortを持つRTCを不正終了させ、OutPortのwrite()メソッドを
>> 呼び出すとCORBA::Exceptionが返されます。
>>
>> ポート切断処理は、ポートの情報がConnectorProfileのportsに登録された
>> 順番で行われます。InPortを持つRTCが不正終了し、write()の呼び出しに
>> 失敗したとき、disconnect()が呼ばれます。このとき、OutPortにおいて、
>> ConnectorProfileのportsにInPortの情報があった場合、CORBA通信が発生
>> し、参照できないために例外が発生するものと思われます。
>>
>> 以上です。ご確認お願いいたします。
>>
>> --
>> //////////////////////////////////////////////////////////////////////
>> 株式会社セック 開発本部 第四開発部(宇宙先端システム)
>> 〒150-0031 東京都渋谷区桜丘町 22-14 NESビル
>> TEL: 03-5458-7743 FAX: 03-5458-7726
>> URL: http://www.sec.co.jp
>>
>> 坂口 智哉 (Tomoya SAKAGUCHI)
>> E-mail: sakaguchi @ sec.co.jp
>> //////////////////////////////////////////////////////////////////////
>>
>> ======================================================================
>> この電子メールの内容および添付されている情報は、機密情報であると同時に、
>> 宛先として意図した特定の受信者のみに送信いたしております。当方の誤送信
>> 等により、心当たりのない方が受信された場合は、大変お手数ですが、受信さ
>> れましたメール内容は削除していただきますようお願いいたします。
>> ======================================================================
>>
>>
>>
>
>
> ===================================================================
> --- PortBase.cpp (revision 1480)
> +++ PortBase.cpp (working copy)
> @@ -38,7 +38,7 @@
> : rtclog(name)
> {
> m_profile.name = CORBA::string_dup(name);
> - m_objref = RTC::PortService::_duplicate(this->_this());
> + m_objref = this->_this();
> m_profile.port_ref = m_objref;
> m_profile.owner = RTC::RTObject::_nil();
> }
> @@ -52,6 +52,16 @@
> */
> PortBase::~PortBase()
> {
> + RTC_TRACE(("~PortBase()"));
> + try
> + {
> + PortableServer::ObjectId_var oid = _default_POA()->servant_to_id(this);
> + _default_POA()->deactivate_object(oid);
> + }
> + catch (...)
> + {
> + RTC_WARN(("Unknown exception caught."));
> + }
> }
>
> /*!
> @@ -234,13 +244,33 @@
> {
> return RTC::BAD_PARAMETER;
> }
> +
> CORBA::Long index;
> index = findConnProfileIndex(connector_id);
> ConnectorProfile prof(m_profile.connector_profiles[index]);
> - RTC::PortService_ptr p;
> if (prof.ports.length() < 1) return RTC::PRECONDITION_NOT_MET;
> - p = prof.ports[(CORBA::ULong)0];
> - return p->notify_disconnect(connector_id);
> +
> + RTC::PortService_var p;
> +
> + for (CORBA::ULong i(0); i < prof.ports.length(); ++i)
> + {
> + p = prof.ports[i];
> + try
> + {
> + return p->notify_disconnect(connector_id);
> + }
> + catch (CORBA::SystemException &e)
> + {
> + RTC_WARN(("Exception caught: minor code(%d).", e.minor()));;
> + continue;
> + }
> + catch (...)
> + {
> + RTC_WARN(("Unknown exception caught."));;
> + continue;
> + }
> + }
> + return RTC::RTC_ERROR;
> }
>
> /*!
> @@ -420,7 +450,7 @@
> */
> ReturnCode_t PortBase::disconnectNext(ConnectorProfile& cprof)
> {
> - CORBA::Long index;
> + CORBA::ULong index;
> index = CORBA_SeqUtil::find(cprof.ports,
> find_port_ref(m_profile.port_ref));
> if (index < 0)
> @@ -428,21 +458,27 @@
> return RTC::BAD_PARAMETER;
> }
>
> - CORBA::Long len = static_cast<CORBA::Long>(cprof.ports.length());
> + CORBA::ULong len = cprof.ports.length();
>
> ++index;
> - try
> + for (CORBA::ULong i(index); i < len; ++i)
> {
> - if (index < len)
> + RTC::PortService_var p;
> + p = cprof.ports[i];
> + try
> {
> - RTC::PortService_var p;
> - p = cprof.ports[index];
> return p->notify_disconnect(cprof.connector_id);
> }
> - }
> - catch (...)
> - {
> - return RTC::RTC_ERROR;
> + catch (CORBA::SystemException& e)
> + {
> + RTC_WARN(("Exception caught: minor code.", e.minor()));
> + continue;
> + }
> + catch (...)
> + {
> + RTC_WARN(("Unknown exception caught."));
> + continue;
> + }
> }
>
> return RTC::RTC_OK;
>
>
>
>
--
//////////////////////////////////////////////////////////////////////
株式会社セック 開発本部 第四開発部(宇宙先端システム)
〒150-0031 東京都渋谷区桜丘町 22-14 NESビル
TEL: 03-5458-7743 FAX: 03-5458-7726
URL: http://www.sec.co.jp
坂口 智哉 (Tomoya SAKAGUCHI)
E-mail: sakaguchi @ sec.co.jp
//////////////////////////////////////////////////////////////////////
======================================================================
この電子メールの内容および添付されている情報は、機密情報であると同時に、
宛先として意図した特定の受信者のみに送信いたしております。当方の誤送信
等により、心当たりのない方が受信された場合は、大変お手数ですが、受信さ
れましたメール内容は削除していただきますようお願いいたします。
======================================================================
openrtm-users メーリングリストの案内