プロジェクト

全般

プロフィール

バグ #2807

coil/Routing.cpp のwait(NULL)は不要

n-ando10年以上前に追加. ほぼ9年前に更新.

ステータス:
新規
優先度:
通常
担当者:
対象バージョン:
-
開始日:
2013/08/27
期日:
2013/08/27
進捗率:

30%

予定工数:

説明

coil/Routing.cpp (posix版) 内で子プロセス終了を待つために wait(NULL) が数か所あるが、wait自体はpclose内に含まれているので不要

産総研の中岡です。

度々すみません、Mac OS X (Lion) においてマネージャ初期化時に固まるという
不可解な症状に遭遇しましたので、報告させてください。

状況としては、Choreonoidにおいて起動時にRTC::Manager::init()を行なってお
り、ある条件下でこの関数が固まります。

固まる箇所をたどっていくと、

Manager::initNaming() -
NamingManager::registerNameServer()-
NamingManager::createNamingObj() -
NamingOnCorba::NamingOnCorba() -
coil::dest_to_endpoint()

ときて、ここから呼ばれる
coil::find_dest_ifname() と
coil::ifname_to_ipaddr() の関数です。

1.1.0-RELEASEのsrc/lib/coil/posix/coil/Routing.cppにおいて、
108行と107行にある

wait(NULL)

でブロックしたまま帰ってきていません。

ある条件というのは、マネージャの初期化を行なっているプロセスから、
マネージャ初期化の前にネームサーバのコマンドを(別プロセスとして)起動し
ているということです。同じコマンドをあらかじめ他のプロセスから起動してあ
る場合は、問題なく動くのですが…。また、この症状が出るのはOS Xだけで、
WindowsやLinuxでは同じ事を行なっても問題なく動いています。

そして、OS Xでも上記の2つのwait(NULL)をどちらもコメントアウトすると、固
まらなくなり、その後も特に問題なく動いているように見えます。

ちなみにネームサーバのコマンドはomniNamesを参考に自前で実装した
Choreonoid付属のものです。WindowsやMacではネームサーバがデーモンとして自
動では起動しないのが普通だと思いますが、そのような場合でもChoreonoidを起
動するだけで簡単にシミュレーションを行えるように、この機能をつけています。

以上のような症状なのですが、今後のリリースで上記のwait(NULL)を除去しても
らうというのは問題ありますでしょうか?

履歴

#1 n-ando10年以上前に更新

  • 進捗率0 から 10 に変更

#3 n-ando10年以上前に更新

  • 進捗率10 から 30 に変更

中岡さんより

安藤さん

本件ご確認いただきありがとうございます。

waitですが、wait(NULL)とすると、waitpidでpidに-1を指定したのと同じになる
ようです。この場合、全ての子プロセスの終了を待つことになってしまいます。

そこで、waitではなくwaitpidの方の関数を使うようにして、pidのパラメータに
0を入れるというのはどうでしょう?こうしますと、「全ての子プロセス」では
なくて、「プロセスグループidが親と同一の子プロセス」になるようです。(ち
なみに、デフォルトではプロセスグループidは親と同じになるようです。)

Choreonoidでは子プロセス起動時にプロセスグループidを変えるようにしていま
すので、こちらを使えばブロックしないことを確認しました。

もう少し具体的に書くと、

wait(NULL);

となっているところを、

waitpid(0, NULL, NULL);

とすればOKです。

以上ご検討ください。

Choreonoidでは当面この修正を行うパッチファイルを配布に入れておこうと思い
ます。

以上よろしくお願いします。

#4 n-ando約10年前に更新

  • 対象バージョンRELENG_1_1 から RELEASE_1_1_1 に変更

#5 n-andoほぼ9年前に更新

  • プロジェクトOpenRTM-aist (C++) から コア に変更

#6 n-andoほぼ9年前に更新

  • 対象バージョン を削除 (RELEASE_1_1_1)

他の形式にエクスポート: Atom PDF