[openrtm-users 01148] Managerのshutdownに関連したバグ

3 個の投稿 / 0 new
最終投稿
root
オフライン
Last seen: 4日 6時間 前
登録日: 2009-06-23 14:31
[openrtm-users 01148] Managerのshutdownに関連したバグ

OpenRTM-aist MLの皆さま:
早大の菅です.
いつもお騒がせしております.

さて今回は,C++ RELEASE1.0版のManagerについてです.
現在,RTC-scilabというツールを開発していますが,
RELEASE1.0になって基本的な動作は動くようになりましたが,
終了時の不具合が続いています.

特殊な使い方かもしれませんが,手動でshutdownする場合の不具合です.
ご検討ください.

■結論
Manager.cppにバグと思われる部分があり,
コードから以下の部分が気になっています.

○m_timerがNULLで初期化されていないため,timer_enable:NOとすると落ちる
○shutdown_nortcsがスペルミスでshutdown_onrtcsになっている
○手動でshutdownするとm_timerが残っているので悪さをするから,
m_timer->stopのコードをManager::shutdown内に含めるべきでは?

■詳細
RTC-scilabでは,C++版のOpenRTMに独自の
手続き型のインターフェースを備えたDLLを定義し,
scilabからロードすることによって
RTMとの相互通信を実現しています.

そこでダイナミックにRTCを生成・ポート追加/除去・削除をするために,
やはりManagerをscilabのプロセスから生成する必要があるのですが,
最初にno-blockingモードで生成して
ManagerのオブジェクトはDLL側のメモリ内に格納しておき,
必要によって独自定義の関数からアクセスしています.

そこで最後にDLLをアンロードする前に,Managerをshutdownしたいのですが,
shutdownをすると,1・2秒後にscilabプロセス全体が落ちます.
これはTimerクラスの仕業と考え,コードを読みましたところ,

○Timerがデフォルトで0.1秒ごとに,ManagerやNameServerなどの振る舞いを監視
している.
○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を指定するとアクセス違反を起こします.
これは早急に改善してほしい部分です.

■shutdown_nortcs:NOが効かない?
Manager.cppの763行目あたりで,スペルミスがあります.
shutdown_nortcsとなるべき場所が,shutdown_onrtcsになっています.
ヘッダーファイルでもスペルミスが見られます.

このようにコード中に定数を配置するやり方は,
個人的には違和感を感じます.
自分はヘッダーなどでdefineするようにしていますがどうなのですか?
プログラミングは我流なので…

■手動でshutdownするとManager::m_timerが残っているのでは?
このおかげでshutdownが2回呼ばれます.
おそらく他の終了タスクも割り当てられているはずなので,
ここでもエラーが起きるはずです.

このshutdownメンバ関数内で,m_timer->stop()を呼び出せば問題は回避されま
すが,
他の終了処理の部分までは目を通していないので,
すべて解決かどうかは分かりません.

以上です.
至らない点など御座いましたら,お手数ですがご指摘いただけますでしょうか?
よろしくお願いします.

ではでは

未定義
root
オフライン
Last seen: 4日 6時間 前
登録日: 2009-06-23 14:31
[openrtm-users 01149] Managerのshutdownに関連したバグ

菅様

安藤です

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

> 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だけですし(笑

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

詳しく調査していただき、ありがとうございました。
また、何か不具合等見つかりましたらよろしくお願いします。

root
オフライン
Last seen: 4日 6時間 前
登録日: 2009-06-23 14:31
[openrtm-users 01150] Managerのshutdownに関連したバグ

菅さん

安藤です

Windows版のソースはリポジトリのソースから作るのが
結構面倒なので最新のソースはここにおいときます。

http://www.openrtm.org/pub/OpenRTM-aist/cxx/1.0.0/OpenRTM-aist-1.0.0-win32-p0.zip

コメントを投稿するにはログインまたはユーザー登録を行ってください

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2209
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク