[openrtm-users 01308] InPort::read()でブロックされる問題

Fumio Kanehiro f-kanehiro @ aist.go.jp
2010年 6月 17日 (木) 17:37:13 JST


金広@産総研です。

OpenRTM-1.0.0-RELEASE-C++をソースからコンパイルしてUbuntu10.04で使用しています。

TimedDoubleSeq型のデータを入力するInPortに対してisNew()で読み出せるデータが
あることを確認した上でread()を呼び出しているにも関わらず、read()でブロックされ、返ってこなく
なる場合があるようです。
その状態でgdbからinterruptをかけ、backtraceすると以下のようにmutexが取得できずに止まっている
ようです。

(gdb) bt
#0  0x00ce4422 in __kernel_vsyscall ()
#1  0x00986af9 in __lll_lock_wait () from /lib/tls/i686/cmov/libpthread.so.0
#2  0x0098213b in _L_lock_748 () from /lib/tls/i686/cmov/libpthread.so.0
#3  0x00981f61 in pthread_mutex_lock () from /lib/tls/i686/cmov/libpthread.so.0
#4  0x0027f22f in
RTC::RingBuffer<cdrMemoryStream>::read(cdrMemoryStream&, long, long)
() from /usr/local/lib/libRTC-1.0.0.so.0
#5  0x00246bc7 in RTC::InPortPushConnector::read(cdrMemoryStream&) ()
   from /usr/local/lib/libRTC-1.0.0.so.0
#6  0x07811aaa in RTC::InPort<RTC::TimedDoubleSeq>::read() ()

この現象が発生する時の状況ですが、rtcdに10種類ほどのモジュールをロードし、10個ほどのRTCを
生成し、それらを異なる周期で動作する3つのExecutionContextで実行させた場合にランダムな
タイミングで生じています。ログレベルを変えたりすると現象が起きなくなったりするので、微妙な
タイミングによって生じる問題なのではないかと考えています。

現象を再現させられるミニマムセットを作るのが難しいのですが、類似した現象に対する修正が
1.0.0-RELEASE以降にありましたでしょうか?
(ちなみにdebパッケージの1.0.0-2も試してみましたが同じ現象が起きました)



openrtm-users メーリングリストの案内