バグ #848
完了
InPort->OutPortの順で接続し、InPort側が落ちている場合OutPortのConnectorがクリアされない
kurihara さんが15年以上前に追加.
ほぼ15年前に更新.
説明
ConnectorProfile::portsに格納されるポートの参照が、InPort->OutPortの順の場合、接続後InPort側が落ちると、
本来ならばOutPort::write()呼び出してdisconnect()されるところ、disconnect()が正常に終了しない。
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;
- ステータス を 新規 から 解決 に変更
- 進捗率 を 0 から 100 に変更
他の形式にエクスポート: Atom
PDF