プロジェクト

全般

プロフィール

バグ #624

OpenRTM-aist(C++)-v1.0.0RC版のポート関連関数使用時の不具合

匿名ユーザー がほぼ15年前に追加. ほぼ15年前に更新.

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

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接続のケース
上記同様の不具合が発生あり。

以上

履歴

#1 匿名ユーザー がほぼ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が発生しない事を確認した。

以上

#2 匿名ユーザー がほぼ15年前に更新

  • 進捗率10 から 70 に変更

#3 匿名ユーザー がほぼ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;
   }

以上

#4 匿名ユーザー がほぼ15年前に更新

  • ステータス担当 から 終了 に変更
  • 進捗率80 から 100 に変更

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