プロジェクト

全般

プロフィール

バグ #848

InPort->OutPortの順で接続し、InPort側が落ちている場合OutPortのConnectorがクリアされない

kurihara14年以上前に追加. 14年以上前に更新.

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

100%

予定工数:

説明

ConnectorProfile::portsに格納されるポートの参照が、InPort->OutPortの順の場合、接続後InPort側が落ちると、
本来ならばOutPort::write()呼び出してdisconnect()されるところ、disconnect()が正常に終了しない。

履歴

#1 kurihara14年以上前に更新

  • 担当者kurihara にセット

C++版を参考に変更する必要あり。

C++版での変更内容

PortBase::diconnect()およびdisconnectNext()において、Portのnotify_disconnect()を呼ぶ部分では、ポートのリファレンスが無効でないことを前提として処理が記述されている。
ポートの呼び出しに失敗し例外が発生した場合には、当該ポートを飛ばして次のポートに対してnotify_disconnect()するように変更した。

@@ -234,13 +260,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 +466,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 +474,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;

#2 kurihara14年以上前に更新

  • ステータス新規 から 解決 に変更
  • 進捗率0 から 100 に変更

#3 n-ando14年以上前に更新

  • ステータス解決 から 終了 に変更

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