[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 メーリングリストの案内