[openrtm-users 01318] Re: InPort::read()でブロックされる問題
Ando Noriaki
n-ando @ aist.go.jp
2010年 6月 18日 (金) 14:09:41 JST
金広さま
安藤です
ご報告ありがとうございました。
こちらでも調査してみたいと思います。
ちなみに、RingBuffer::read() 内には m_empty.mutex と m_full.mutex
がありますが、どちらで止まっているかお分かりになりますでしょうか?
2010年6月17日17:37 Fumio Kanehiro <f-kanehiro @ aist.go.jp>:
> 金広@産総研です。
>
> 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も試してみましたが同じ現象が起きました)
>
>
--
安藤慶昭@独立行政法人産業技術総合研究所 知能システム研究部門
統合知能研究グループ 主任研究員, 博士(工学)
〒305-8568 つくば市梅園1-1-1 中央第2
e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
OpenRTM-aist: http://www.openrtm.org
Noriaki Ando, Ph.D.
Senior Research Scientist, RT-Synthesis R.G., ISRI, AIST
AIST Tsukuba Central 2, Tsukuba, Ibaraki 305-8568 JAPAN
e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
OpenRTM-aist: http://www.openrtm.org
openrtm-users メーリングリストの案内