[openrtm-users 01436] OpenRTM-aist-1.0.0でのonWriteコールバックについて

Tsuyoshi Suenaga tsuyo-s @ is.naist.jp
2010年 10月 22日 (金) 00:55:44 JST


OpenRTM-aistユーザの皆さん

奈良先端大の末永です.

以前,産総研の安藤様からのメール[openrtm-users 00512]で
onWriteコールバックを用いた通信方法(OpenRTM-aist-0.4.2用)がありましたが,
こちらをセック中本様からのメール[openrtm-users 01328]を参考に
OpenRTM-aist-1.0.0 用に書き換えてみました.

一応,動いてはいるのですが,RTSystemEditorからPipe RTCをexitした際に
異常終了で終わっていることに気が付きました.

あくまで終了時だけなので影響は少ないのですが,あまり気持ちの良いものではありません.
何か記述で間違っていたり,勘違いしている点などありますでしょうか?
何かお気づきの方がおりましたら,ご教授頂けましたら幸いです.

どうぞよろしくお願い致します.


・添付ファイルの説明
Pipe_042.tar.g_  OpenRTM-aist-0.4.2用(ほぼ安藤様のファイル)
Pipe_100.tar.g_  OpenRTM-aist-1.0.0用
GetAndSendTimedLong.tar.g_  動作テスト用
diff_Pipe_cpp.pdf  Pipe.cppの差分
diff_Pipe_h.pdf  Pipe.hの差分
OnWriteCallBack.png  実行結果
error_when_exiting.txt  終了時に出力されるエラー(gdb表示)
※ 添付ファイル *.tar.g_ は *.tar.gz にリネームして解凍してください。

・参考にしたメール
[openrtm-users 01328] OpenRTM-aist-1.0.0-RELEASEにおけるRC1からの変更点
[openrtm-users 00512] Re: onWriteConvert

以上.


2008年7月8日20:19 Ando Noriaki <n-ando @ aist.go.jp>:
> From	Ando Noriaki <n-ando @ aist.go.jp>
> 日付	2008年7月8日20:19
> 件名	[openrtm-users 00512] Re: onWriteConvert
>
>
> 産総研 安藤です
>
> 先ほどのメールの回答です。
>
> 添付のサンプルをご覧ください。
> 添付ファイル Pipe.tar.g_ は Pipe.tar.gz にリネームして解凍してください。
>
> このコンポーネントはTimedLong型のInPort/OutPortをひとつづつもち、
> InPortに入ってきたデータをOutPortへコールバックを使って即座に
> 伝送するものです。
>
> コンパイル後、ConsoleInとConsoleOutの間にはさんで接続してください。
> Pipeコンポーネントはコールバックを使用しているので、
> onExecuteでデータの読み込み+書き出しをしなくても、
> InPortから入ったデータが即座にOutPortから出て行きます。
> したがって、Active化しなくても動作します。
>
>
>
> 2008/07/08 19:48 Ando Noriaki <n-ando @ aist.go.jp>:
>> 産総研 安藤です
>>
>> 高エネ研の安様より以下のようなメールをいただきましたので、
>> 参考までにOpenRTM MLに転送させていただきます。
>>
>>
>> ---------- 転送されたメッセージ ----------
>> 差出人: Yoshiji Yasu <Yoshiji.Yasu @ kek.jp>
>> 日付: 2008/07/08 10:02
>> 件名: [rtm-kek 00535] onWriteConvert
>> 宛先: rtm-kek @ m.aist.go.jp
>>
>>
>> 安です。onWriteConvertについて質問です。
>>
>> proc1, proc2, proc3という3つのコンポーネントの中のproc2にコールバックを
>> 入れようとしています。やりたいことは、proc2のInPortの RingBufferのwrite
>> のタイミングで、proc2のメインメソッドをすっ飛ばして、write時のコールバッ
>> クでOutPortのwrite を実行してしまうということです。
>>
>> InPortCorbaConsumer.hで
>> status = _ptr()->put(tmp);
>> でCORBAのデータ転送とRingBufferのputメソッドを行います。
>> OutPort.h, InPort.hのwriteメソッドの中で、
>> status = this->put((*m_OnWriteConvert)(value));
>> という形でコールバックが呼ばれます。
>>
>> proc1はOutPortのwriteをすると、RingBufferにput/getしてから _ptr()->putで
>> CORBA転送しproc2のRingBufferにデータが書き込まれます。書き込まれた
>> タイミングでコールバックするには、InPortCorbaConsumer.hにコールバックす
>> るような仕掛けがないといけないのではないでしょうか?
>>
>> コールバックの例題をみると、
>> OnWriteConvertの場合は、proc1ないしはproc2がOutPortのwriteを行うときに
>> フィルタープログラムをコールバックに入れて転送するという使い方が自然のよ
>> うですし、
>> onReadConvertの場合は、proc2ないしはproc3がInPortのreadを行うときにやは
>> りフィルタープログラムをコールバックに入れて読み込むという使い方が自然の
>> ようです。
>>
>> 私の理解が間違っているかもしれません。
>>
>> --
>> Yoshiji Yasu @ Online group, Institute of Particle and Nuclear Studies,
>> High Energy Accelerator Research Organization ( KEK ),
>> E-mail : Yoshiji.YASU @ kek.jp
>>
>>
>>
>>
>>
>> --
>> 安藤慶昭@独立行政法人産業技術総合研究所 研究員
>>  知能システム研究部門 タスクインテリジェンス研究グループ
>>  〒305-8568 茨城県つくば市梅園1-1-1 中央第2
>>  TEL: 029-861-5981 FAX: 029-862-6631
>>  n-ando @ aist.go.jp, n-ando @ ieee.org
>>
>
>
>
> --
> 安藤慶昭@独立行政法人産業技術総合研究所 研究員
>  知能システム研究部門 タスクインテリジェンス研究グループ
>  〒305-8568 茨城県つくば市梅園1-1-1 中央第2
>  TEL: 029-861-5981 FAX: 029-862-6631
>  n-ando @ aist.go.jp, n-ando @ ieee.org
>



-- 
--------------------------------------------
末永 剛 (Tsuyoshi Suenaga)
奈良先端科学技術大学院大学 情報科学研究科
ロボティクス講座 研究員
e-mail: tsuyo-s @ is.naist.jp
URL:    http://robotics.naist.jp/~tsuyo-s/
--------------------------------------------
-------------- next part --------------
tsuyo-s @ 244vmubuntu1004:~/tmp/Pipe_100$ gdb ./PipeComp 
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
---Type <return> to continue, or q <return> to quit---
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/tsuyo-s/tmp/Pipe_100/PipeComp...(no debugging symbols found)...done.
(gdb) run
Starting program: /home/tsuyo-s/tmp/Pipe_100/PipeComp 
[Thread debugging using libthread_db enabled]
[New Thread 0xb7fe0b70 (LWP 16823)]
[New Thread 0xb77dfb70 (LWP 16824)]
[New Thread 0xb6fdeb70 (LWP 16825)]
[New Thread 0xb67ddb70 (LWP 16831)]
[New Thread 0xb5fdcb70 (LWP 16832)]
[Thread 0xb67ddb70 (LWP 16831) exited]
*** glibc detected *** /home/tsuyo-s/tmp/Pipe_100/PipeComp: free(): invalid pointer: 0x08098668 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x966591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x967de8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x96aecd]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x87b741]
/usr/lib/libRTC-1.0.0.so.0(_ZN3RTC21ConnectorDataListenerD0Ev+0x28)[0x655298]
/usr/lib/libRTC-1.0.0.so.0(_ZN3RTC27ConnectorDataListenerHolderD1Ev+0x52)[0x655552]
/usr/lib/libRTC-1.0.0.so.0(_ZN3RTC10InPortBaseD2Ev+0x282)[0x65fd72]
/home/tsuyo-s/tmp/Pipe_100/PipeComp(_ZN3RTC6InPortINS_9TimedLongEED1Ev+0x9d)[0x805863d]
/home/tsuyo-s/tmp/Pipe_100/PipeComp(_ZN4PipeD0Ev+0x120)[0x8056810]
/home/tsuyo-s/tmp/Pipe_100/PipeComp(_ZN3RTC6DeleteI4PipeEEvPNS_13RTObject_implE+0x15)[0x8057c65]
/usr/lib/libRTC-1.0.0.so.0(_ZN3RTC10FactoryCXX7destroyEPNS_13RTObject_implE+0x39)[0x5de9c9]
/usr/lib/libRTC-1.0.0.so.0(_ZN3RTC7Manager15deleteComponentEPNS_13RTObject_implE+0x88)[0x5f19b8]
/usr/lib/libRTC-1.0.0.so.0(_ZN3RTC7Manager17cleanupComponentsEv+0x77)[0x5f21c7]
/usr/lib/libRTC-1.0.0.so.0(_ZN14ListenerObjectIN3RTC7ManagerEMS1_FvvEE6invokeEv+0x1c)[0x5f290c]
/usr/lib/libcoil.so.0(_ZN4coil5Timer6invokeEv+0xc3)[0x7b5923]
/usr/lib/libcoil.so.0(_ZN4coil5Timer3svcEv+0x80)[0x7b59d0]
/usr/lib/libcoil.so.0(_ZN4coil4Task7svc_runEPv+0x12)[0x7ba212]
/lib/tls/i686/cmov/libpthread.so.0(+0x596e)[0x13c96e]
/lib/tls/i686/cmov/libc.so.6(clone+0x5e)[0x9c8a4e]
======= Memory map: ========
00110000-0012b000 r-xp 00000000 08:01 1970536    /lib/ld-2.11.1.so
0012b000-0012c000 r--p 0001a000 08:01 1970536    /lib/ld-2.11.1.so
0012c000-0012d000 rw-p 0001b000 08:01 1970536    /lib/ld-2.11.1.so
0012d000-0012e000 r-xp 00000000 00:00 0          [vdso]
0012e000-00131000 r-xp 00000000 08:01 1966272    /lib/libuuid.so.1.3.0
00131000-00132000 r--p 00002000 08:01 1966272    /lib/libuuid.so.1.3.0
00132000-00133000 rw-p 00003000 08:01 1966272    /lib/libuuid.so.1.3.0
00133000-00135000 r-xp 00000000 08:01 1973926    /lib/tls/i686/cmov/libdl-2.11.1.so
00135000-00136000 r--p 00001000 08:01 1973926    /lib/tls/i686/cmov/libdl-2.11.1.so
00136000-00137000 rw-p 00002000 08:01 1973926    /lib/tls/i686/cmov/libdl-2.11.1.so
00137000-0014c000 r-xp 00000000 08:01 1973937    /lib/tls/i686/cmov/libpthread-2.11.1.so
0014c000-0014d000 r--p 00014000 08:01 1973937    /lib/tls/i686/cmov/libpthread-2.11.1.so
0014d000-0014e000 rw-p 00015000 08:01 1973937    /lib/tls/i686/cmov/libpthread-2.11.1.so
0014e000-00150000 rw-p 00000000 00:00 0 
00150000-002c7000 r-xp 00000000 08:01 2641218    /usr/lib/libomniORB4.so.1.2
002c7000-002c8000 ---p 00177000 08:01 2641218    /usr/lib/libomniORB4.so.1.2
002c8000-002d3000 r--p 00177000 08:01 2641218    /usr/lib/libomniORB4.so.1.2
002d3000-002d5000 rw-p 00182000 08:01 2641218    /usr/lib/libomniORB4.so.1.2
002d5000-002d7000 rw-p 00000000 00:00 0 
002d7000-002dc000 r-xp 00000000 08:01 2641213    /usr/lib/libomnithread.so.3.3
002dc000-002dd000 r--p 00004000 08:01 2641213    /usr/lib/libomnithread.so.3.3
002dd000-002de000 rw-p 00005000 08:01 2641213    /usr/lib/libomnithread.so.3.3
002de000-004e0000 r-xp 00000000 08:01 2641217    /usr/lib/libomniDynamic4.so.1.2
004e0000-0051b000 r--p 00202000 08:01 2641217    /usr/lib/libomniDynamic4.so.1.2
0051b000-0051d000 rw-p 0023d000 08:01 2641217    /usr/lib/libomniDynamic4.so.1.2
0051d000-0051e000 rw-p 00000000 00:00 0 
0051e000-0077b000 r-xp 00000000 08:01 2641259    /usr/lib/libRTC-1.0.0.so.0.0.4
0077b000-007a4000 r--p 0025d000 08:01 2641259    /usr/lib/libRTC-1.0.0.so.0.0.4
007a4000-007a8000 rw-p 00286000 08:01 2641259    /usr/lib/libRTC-1.0.0.so.0.0.4
007a8000-007be000 r-xp 00000000 08:01 2641261    /usr/lib/libcoil.so.0.0.0
007be000-007bf000 r--p 00015000 08:01 2641261    /usr/lib/libcoil.so.0.0.0
007bf000-007c0000 rw-p 00016000 08:01 2641261    /usr/lib/libcoil.so.0.0.0
007c0000-008a9000 r-xp 00000000 08:01 2625212    /usr/lib/libstdc++.so.6.0.13
008a9000-008aa000 ---p 000e9000 08:01 2625212    /usr/lib/libstdc++.so.6.0.13
008aa000-008ae000 r--p 000e9000 08:01 2625212    /usr/lib/libstdc++.so.6.0.13
008ae000-008af000 rw-p 000ed000 08:01 2625212    /usr/lib/libstdc++.so.6.0.13
008af000-008b6000 rw-p 00000000 00:00 0 
008b6000-008da000 r-xp 00000000 08:01 1973927    /lib/tls/i686/cmov/libm-2.11.1.so
008da000-008db000 r--p 00023000 08:01 1973927    /lib/tls/i686/cmov/libm-2.11.1.so
008db000-008dc000 rw-p 00024000 08:01 1973927    /lib/tls/i686/cmov/libm-2.11.1.so
008dc000-008f9000 r-xp 00000000 08:01 1966164    /lib/libgcc_s.so.1
008f9000-008fa000 r--p 0001c000 08:01 1966164    /lib/libgcc_s.so.1
008fa000-008fb000 rw-p 0001d000 08:01 1966164    /lib/libgcc_s.so.1
008fb000-00a4e000 r-xp 00000000 08:01 1973923    /lib/tls/i686/cmov/libc-2.11.1.so
00a4e000-00a4f000 ---p 00153000 08:01 1973923    /lib/tls/i686/cmov/libc-2.11.1.so
00a4f000-00a51000 r--p 00153000 08:01 1973923    /lib/tls/i686/cmov/libc-2.11.1.so
00a51000-00a52000 rw-p 00155000 08:01 1973923    /lib/tls/i686/cmov/libc-2.11.1.so
00a52000-00a55000 rw-p 00000000 00:00 0 
00a55000-00a5f000 r-xp 00000000 08:01 1973932    /lib/tls/i686/cmov/libnss_files-2.11.1.so
00a5f000-00a60000 r--p 00009000 08:01 1973932    /lib/tls/i686/cmov/libnss_files-2.11.1.so
00a60000-00a61000 rw-p 0000a000 08:01 1973932    /lib/tls/i686/cmov/libnss_files-2.11.1.so
08048000-0805d000 r-xp 00000000 08:01 13420      /home/tsuyo-s/tmp/Pipe_100/PipeComp
0805d000-08063000 r--p 00014000 08:01 13420      /home/tsuyo-s/tmp/Pipe_100/PipeComp
08063000-08064000 rw-p 0001a000 08:01 13420      /home/tsuyo-s/tmp/Pipe_100/PipeComp
08064000-080a6000 rw-p 00000000 00:00 0          [heap]
b5600000-b5621000 rw-p 00000000 00:00 0 
b5621000-b5700000 ---p 00000000 00:00 0 
b57dc000-b57dd000 ---p 00000000 00:00 0 
b57dd000-b5fdd000 rw-p 00000000 00:00 0 
b5fdd000-b5fde000 ---p 00000000 00:00 0 
b5fde000-b67de000 rw-p 00000000 00:00 0 
b67de000-b67df000 ---p 00000000 00:00 0 
b67df000-b6fdf000 rw-p 00000000 00:00 0 
b6fdf000-b6fe0000 ---p 00000000 00:00 0 
b6fe0000-b77e0000 rw-p 00000000 00:00 0 
b77e0000-b77e1000 ---p 00000000 00:00 0 
b77e1000-b7fe5000 rw-p 00000000 00:00 0 
b7ffc000-b8000000 rw-p 00000000 00:00 0 
bffeb000-c0000000 rw-p 00000000 00:00 0          [stack]

Program received signal SIGABRT, Aborted.
[Switching to Thread 0xb7fe0b70 (LWP 16823)]
0x0012d422 in __kernel_vsyscall ()
(gdb) 
Thu Oct 21 21:24:35 2010:

Checkpointing Phase 1: Prepare.
Checkpointing Phase 2: Commit.
Checkpointing completed.

(gdb) bt
#0  0x0012d422 in __kernel_vsyscall ()
#1  0x00925651 in raise () from /lib/tls/i686/cmov/libc.so.6
#2  0x00928a82 in abort () from /lib/tls/i686/cmov/libc.so.6
#3  0x0095c49d in ?? () from /lib/tls/i686/cmov/libc.so.6
#4  0x00966591 in ?? () from /lib/tls/i686/cmov/libc.so.6
#5  0x00967de8 in ?? () from /lib/tls/i686/cmov/libc.so.6
#6  0x0096aecd in free () from /lib/tls/i686/cmov/libc.so.6
#7  0x0087b741 in operator delete(void*) () from /usr/lib/libstdc++.so.6
---Type <return> to continue, or q <return> to quit---
#8  0x00655298 in RTC::ConnectorDataListener::~ConnectorDataListener() ()
   from /usr/lib/libRTC-1.0.0.so.0
#9  0x00655552 in RTC::ConnectorDataListenerHolder::~ConnectorDataListenerHolder() ()
   from /usr/lib/libRTC-1.0.0.so.0
#10 0x0065fd72 in RTC::InPortBase::~InPortBase() () from /usr/lib/libRTC-1.0.0.so.0
#11 0x0805863d in RTC::InPort<RTC::TimedLong>::~InPort() ()
#12 0x08056810 in Pipe::~Pipe() ()
#13 0x08057c65 in void RTC::Delete<Pipe>(RTC::RTObject_impl*) ()
---Type <return> to continue, or q <return> to quit---
#14 0x005de9c9 in RTC::FactoryCXX::destroy(RTC::RTObject_impl*) ()
   from /usr/lib/libRTC-1.0.0.so.0
#15 0x005f19b8 in RTC::Manager::deleteComponent(RTC::RTObject_impl*) ()
   from /usr/lib/libRTC-1.0.0.so.0
#16 0x005f21c7 in RTC::Manager::cleanupComponents() () from /usr/lib/libRTC-1.0.0.so.0
#17 0x005f290c in ListenerObject<RTC::Manager, void (RTC::Manager::*)()>::invoke() ()
   from /usr/lib/libRTC-1.0.0.so.0
#18 0x007b5923 in coil::Timer::invoke() () from /usr/lib/libcoil.so.0
---Type <return> to continue, or q <return> to quit---
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: Pipe_042.tar.g_
型:         application/octet-stream
サイズ:     9582 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20101022/ad529553/attachment-0003.obj>
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: Pipe_100.tar.g_
型:         application/octet-stream
サイズ:     11820 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20101022/ad529553/attachment-0004.obj>
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: GetAndSendTimedLong.tar.g_
型:         application/octet-stream
サイズ:     10039 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20101022/ad529553/attachment-0005.obj>
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: diff_Pipe_cpp.pdf
型:         application/pdf
サイズ:     52417 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20101022/ad529553/attachment-0002.pdf>
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: diff_Pipe_h.pdf
型:         application/pdf
サイズ:     51228 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20101022/ad529553/attachment-0003.pdf>
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: OnWriteCallBack.png
型:         image/png
サイズ:     158358 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20101022/ad529553/attachment-0001.png>


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