[openrtm-users 00884] Re: OpenRTM 1.0.0-RC1の不具合について

Ando Noriaki n-ando @ aist.go.jp
2009年 7月 31日 (金) 01:18:35 JST


坂口様

産総研 安藤です

ご報告ありがとうございました。

とりあえず、以下のパッチで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;




-- 
安藤慶昭@独立行政法人産業技術総合研究所 研究員
                  知能システム研究部門 統合知能研究グループ
                  〒305-8568 茨城県つくば市梅園1-1-1 中央第2
                  TEL: 029-861-5981 FAX: 029-862-6631
                  n-ando @ aist.go.jp, n-ando @ ieee.org



openrtm-users メーリングリストの案内