操作
バグ #2808
未完了ExtTrigExecutionContext, SynchExtTriggerEC の deactivate_component() を修正する
開始日:
2013/08/27
期日:
進捗率:
0%
予定工数:
説明
中岡さんから以下の様な報告があったので調査して反映させる。
産総研の中岡です。
以前静岡大の清水さんが本MLにポストされた02356の投稿を見つけたのですが、
そこでSynchExtTriggerECのdeactivate_component()の挙動に関する指摘があり
ました。
具体的にはExtTrig系のECでは deactivate_component()内にてtick()を行わない
と、状態遷移が行われずにタイムアウトするまで処理がブロックしてしまうとい
うものです。
これについてはバージョン1.1.0-RC3に関する指摘だったようなのですが、
1.1.0-RELEASEについても修正がされていないようです。
実は開発中のChoreonoidでRTCを用いたシミュレーションを行なっていると、
コンポーネントのdeactivate時に一定の時間固まる症状が出まして、
これをなんとかしたく思って上記の投稿を見つけた次第です。
(Windowsだと場合によってはRTCひとつをdeactivateするのに何秒も固まってし
まいます…。)
とりあえずChoreonoidにおいて以下のようなdeactivate_componentをもつECを
作って動かしたところ、固まる症状がなくなりました。
RTC::ReturnCode_t
ChoreonoidExecutionContext::deactivate_component(RTC::LightweightRTObject_ptr
comp) throw (CORBA::SystemException)
{
RTC_TRACE(("deactivate_component()"));
CompItr it = std::find_if(m_comps.begin(), m_comps.end(),
find_comp(comp));
if(it == m_comps.end()) {
return RTC::BAD_PARAMETER;
}
if(!(it->_sm.m_sm.isIn(RTC::ACTIVE_STATE))){
return RTC::PRECONDITION_NOT_MET;
}
it->_sm.m_sm.goTo(RTC::INACTIVE_STATE);
tick();
if(it->_sm.m_sm.isIn(RTC::INACTIVE_STATE)){
RTC_TRACE(("The component has been properly deactivated."));
return RTC::RTC_OK;
}
RTC_ERROR(("The component could not be deactivated."));
return RTC::RTC_ERROR;
}
ただ、やはりOpenRTM-aist本体でこの修正がなされていることが望ましいので、
今後のリリースで修正をお願いできますでしょうか(ExtTrigExecutionContext,
SynchExtTriggerECの両方にしておくべきかと思います。)
以上よろしくお願い致します。
操作