[openrtm-users 01149] Re: Managerのshutdownに関連したバグ

Ando Noriaki n-ando @ aist.go.jp
2010年 2月 28日 (日) 01:09:43 JST


菅様

安藤です

毎度、ご指摘ありがとうございます。

> OpenRTM-aist MLの皆さま:
> 早大の菅です.
> いつもお騒がせしております.
>
> さて今回は,C++ RELEASE1.0版のManagerについてです.
> 現在,RTC-scilabというツールを開発していますが,
> RELEASE1.0になって基本的な動作は動くようになりましたが,
> 終了時の不具合が続いています.
>
> 特殊な使い方かもしれませんが,手動でshutdownする場合の不具合です.
> ご検討ください.
>
>
> ■結論
> Manager.cppにバグと思われる部分があり,
> コードから以下の部分が気になっています.
>
> ○m_timerがNULLで初期化されていないため,timer_enable:NOとすると落ちる

m_timer を0で初期化するようにしました。

> ○shutdown_nortcsがスペルミスでshutdown_onrtcsになっている

すみません。スペルミスですね。ただし、shutdown no rtc もおかしいので、
たぶん shutdown_on_nortcs のつもりだったのだと思います。
#Manager::shutdownOnNoRtcs() という関数がありますので。。。
なので、そのように修正しました。

> ○手動でshutdownするとm_timerが残っているので悪さをするから,
> m_timer->stopのコードをManager::shutdown内に含めるべきでは?

shutdownManager() 関数の中で呼ぶように修正しました。

修正されたソースは、
http://openrtp.jp/openrtm/svn/OpenRTM-aist/branches/RELENG_1_0/OpenRTM-aist
からチェックアウトするか、添付のパッチを当ててください。

> ○Timerがデフォルトで0.1秒ごとに,ManagerやNameServerなどの振る舞いを監視
> している.

正確に言いますと、タイマの分解能が100msで、
・ネームサーバのチェックは 10秒毎、
(naming.update.interval で変更可能)
・自動シャットダウンが 10秒毎、
・コンポーネントの終了処理が1秒毎、
に処理を行っています。

> ○Managerでは,rtc.confでmanager.shutdown_nortcsがYESだと,Managerが生成
> したRTCが無くなると自動的にshutdownする.
> ○同じく,manager.timer_enableでtimerの生成を抑制できる
> などが分かりました.

> そこでいくつかコードを読んで気になる部分がありました.
>
> ■RTC::Manager::m_timerメンバが初期化されていない場合がある.
> Managerのコンストラクタでm_timerがNULLに初期化されていないので,
> timer_enable: NOを指定するとアクセス違反を起こします.
> これは早急に改善してほしい部分です.

すみません。初期化を忘れてました。
とりあえずは、Managerの変数に関してはポインタはすべて0初期化しました。

> ■shutdown_nortcs:NOが効かない?
> Manager.cppの763行目あたりで,スペルミスがあります.
> shutdown_nortcsとなるべき場所が,shutdown_onrtcsになっています.
> ヘッダーファイルでもスペルミスが見られます.
>
> このようにコード中に定数を配置するやり方は,
> 個人的には違和感を感じます.
> 自分はヘッダーなどでdefineするようにしていますがどうなのですか?

おっしゃるとおりです。C言語的にはそれが正しいので、ModuleManager.h を
見てもらえるとわかるのですが、私も以前はこんな感じでdefineしてました。

ただし、C++的には const char* で定義するのが正しいようです。
その辺の理由に関しては、Effective C++ あるいは、
C++ coding standards などの本に書いてあったと思います。
#要はconst変数であれば、型のチェックもされるのでdefineよりお勧め、ということです。

で、実装する上で可読性等などいろいろ考えて結局rtc.confのオプションは
文字列リテラルをそのままコードに記述する方法をとりました。
今回みたいなバグが発覚しないという問題はありますが。。。

> プログラミングは我流なので…

私も、C++を本格的にやりだしたのは、OpenRTM-aistを実装し始めてから
なのでたいしたことはないです。大学で習ったのはFORTRANだけですし(笑

やはり、プログラミングは自分で本やコードを読むなどして勉強するしか
ないんじゃないですかね。

詳しく調査していただき、ありがとうございました。
また、何か不具合等見つかりましたらよろしくお願いします。
-- 
安藤慶昭@独立行政法人産業技術総合研究所 知能システム研究部門
    統合知能研究グループ 主任研究員, 博士(工学)
    〒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
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: Manager.cpp.diff
型:         application/octet-stream
サイズ:     2287 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20100228/9d32fe30/attachment-0001.obj>


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