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;
}
以上