バグ #624
完了OpenRTM-aist(C++)-v1.0.0RC版のポート関連関数使用時の不具合
100%
説明
OpenRTM-aist(C++)-v1.0.0 RC版の不具合調査
※コンポーネント1対1接続のケース
1. exsampleのConsoleIn/Out使用時、コネクトの接続・切断を繰り返すと、切断時にConsoleInでSegmentation faultが発生する。
(Connector ProfileのSubscription Type:Flushの場合)
2. exsampleのConsoleIn/Out使用時、ConsoleInの2回目入力後、ConsoleInでSegmentation faultが発生する。
また、ConsoleOutにConsoleInの入力値が出力されない。
(Connector ProfileのSubscription Type:new、periodicの場合)
※コンポーネント1対N接続のケース
上記同様の不具合が発生あり。
以上
匿名ユーザー さんが15年以上前に更新
- ステータス を 新規 から 担当 に変更
1. exsampleのConsoleIn/Out使用時、コネクトの接続・切断を繰り返すと、切断時にConsoleInでSegmentation faultが発生する。
(Connector ProfileのSubscription Type:Flushの場合)
この件について原因を特定したので報告する。
●現象
OutPortPushConnector.cppのコンストラクト時、m_bufferの値に0以外が設定されている場合、
createBuffer()を実行しないが、disconnect()時にdeleteObject()を実行しているため
存在しないものを削除しに行って落ちている。
●原因
OutPortPushConnector.cppのコンストラクタで、
メンバー変数 m_buffer(buffer)へ代入する記述が抜けていた。
この為に、m_bufferへゴミが設定された場合に落ちる現象となった。
●対処と確認
OutPortPushConnector.cppのコンストラクタにメンバー変数代入 m_buffer(buffer)を追記した。
EclipseからConsoleInとConsoleOutの接続・切断を10回繰り返し、
Segmentation faultが発生しない事を確認した。
以上
匿名ユーザー さんが15年以上前に更新
- 進捗率 を 70 から 80 に変更
2. exsampleのSeqIn/Out使用時、Subscription Type:new接続で受信側SeqInをDeactivate->Activateにすると、SeqIn出力が止まってしまう。
この件について原因を特定したので報告する。
●現象
BasicTypeとSequenceTypeに、接続タイプflush・new・periodicを割り振り、
SeqOut -> SeqIn接続してAll Activate後、
SeqIn(データ入力側)をDeActivate -> Activate にすると、
接続タイプnewのポートでは、SeqInの出力が1回変化して、その後変化しなくなる。
接続タイプflush・periodicは、間欠的出力変化となる。
All Deactivate -> All Activate を行っても、SeqInの出力は変化しない。
SeqOut -> SeqIn接続を切断しない限り、この現象は継続する。
※Subscription Type:new接続のみでも同様の現象あり。
※Subscription Type:flush接続のみで、この現象はない。
※Subscription Type:periodic接続のみで、この現象はない。
■SimpleIOのConsoleIn/Outでも同様の現象が見られた。
●原因
PublisherNew.cppのPublisherNew::write() が以下の記述となっており、、
一旦バッファフルになると、スレッドに対してシグナルを発行しない為、
送信できる状態に復帰しなかった。
{
RTC_PARANOID(("write()"));
if (m_retcode CONNECTION_LOST)
{
RTC_DEBUG(("write(): connection lost."));
return m_retcode;
}
if (m_retcode BUFFER_FULL)
{
RTC_DEBUG(("write(): InPort buffer is full."));
return BUFFER_FULL;
}
assert(m_buffer != 0);
CdrBufferBase::ReturnCode ret(m_buffer->write(data, sec, usec));
m_task->signal();
RTC_DEBUG(("%s = write()", CdrBufferBase::toString(ret)));
return convertReturn(ret);
}
●対処
PublisherNew.cppのPublisherNew::write() に以下を追加した。
if (m_retcode == BUFFER_FULL)
{
RTC_DEBUG(("write(): InPort buffer is full."));
CdrBufferBase::ReturnCode ret(m_buffer->write(data, sec, usec)); //●追加部
m_task->signal(); //●追加部
return BUFFER_FULL;
}
以上