操作
バグ #841
完了InPort->OutPortの順で接続し、InPort側が落ちている場合OutPortのConnectorがクリアされない
開始日:
2009/07/31
期日:
進捗率:
100%
予定工数:
説明
ConnectorProfile::portsに格納されるポートの参照が、InPort->OutPortの順の場合、接続後InPort側が落ちると、
本来ならばOutPort::write()呼び出してdisconnect()されるところ、disconnect()が正常に終了しない。
n-ando さんが15年以上前に更新
- ステータス を 新規 から 終了 に変更
- 進捗率 を 0 から 100 に変更
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;
操作