[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 メーリングリストの案内