[openrtm-users 00598] Re: shutdown 処理についてのお伺い

Akio Uda uda-axa @ necst.nec.co.jp
2008年 9月 4日 (木) 18:36:37 JST


To: 産総研 安藤様

いつも御世話になります。宇田@NECシステムテクノロジーです

ご回答ありがとうございます。

> 宇田様、清水様
> 
> 安藤です
> 
> 清水さん、詳しい解説ありがとうございます。
> 宇田さんのやりたいことというのは、コンポーネントが終了した際に
> そのプロセスも落としたいということでしょうか?

厳密には、コンポーネントが外部からのシャットダウン要求を受け付けた
場合、例えば音声認識のコンポーネントがユーザからの「シャットダウン」
要求を受け付けた場合に、そのコンポーネントを含むプロセス全体を終了
させるようなケースを想定しておりました。


> もし、あるコンポーネントをexitしたときに、たとえ同じプロセスで
> 他のコンポーネントも動いていたとしても、そのプロセスを強制的に
> 終了したいのであれば、以下のような方法があります。
> 
> 仮に、そのコンポーネントをexitするとプロセスを強制的に終了させる
> TerminatorComponentというのを作ったとします。
> そのonFinalize関数で以下のようにSIGINTシグナルを発行してやると、
> Ctrl+Cを押したのと同じ状態になりますので、プロセスごと終了します。
> 
> RTC::ReturnCode_t TerminatorComponent::onFinalize()
> {
>   raise(SIGINT);
>   return RTC::RTC_OK;
> }
> 
> ただし、サンプルのConsoleInCompのような入力待ちをしているRTCが
> 同じプロセスにあると、入力があるまで終了してくれません。
> 通常はコンポーネントで単純なcinを使った入力待ちはしないとおもいますので、
> この方法で宇田さんの目的は達成されるのではないかと思います。

了解いたしました。では、raise(SIGINT) を使った方式を試してみたいと
思います。


> あまりきれいなやり方ではありませんが、SIGINTを発行してやると、コンポーネントの
> deactivateとPOAやORBのdeactivate/shutdownおよび、オブジェクトのデストラクタなどが
> 別スレッドで走るので、いまのところ一番安全かつ確実な方法だと思います。
> 
> 本来Managerは、デーモンとして使用することを考えて作りましたので、
> コンポーネントがManagerを落とすという使い方は考慮していません。
> (RTCはManager上で生成されるので、RTCの終了前にManagerが終了することは
> オブジェクトの寿命の依存関係を壊すことになりますので。。。)
> 
> ただし、そういった使い方をしたいことあるかもしれませんので、
> 1.ManagerにCORBAインターフェースを持たせて、外部からManagerの終了を
>   制御できるようにする
> 2.ManagerとRTCの依存関係を切る
> といった方向で次期バージョンに反映させたいと思います。

どうもありがとうございます。もし可能でしたら、上記のcin待ちのコンポー
ネントを含むプロセス終了処理もご検討頂けると助かります(特にテスト用途
の場合、ユーザからのコンソールコマンド入力を受け付けるコンポーネントも
多用されるかと思いますので)。

ご教授ありがとうございます。


> 2008/09/04 10:47 Akio Uda <uda-axa @ necst.nec.co.jp>:
> > To: 静岡大 清水様
> >
> > いつも御世話になります。宇田@NECシステムテクノロジーです
> >
> > どうも詳細な情報をありがとうございます。確かにご指摘の通り、
> > shutdown()に伴って呼び出し元のコンポーネント自体も消滅して
> > しまうことを失念しておりました。
> >
> > それでは、別スレッドを起動してshutdown()を呼ぶ方法を試して
> > みたいと思います。
> >
> > ご教授ありがとうございました。
> >
> >
> >> 静岡大 清水です。
> >>
> >> 終了処理に関しては、私も四苦八苦していますので、
> >> 私が知っている範囲内で情報提供します。
> >>
> >> Manager::shutdown()では、マネージャが管理している
> >> 全てのコンポーネントをexit()します。
> >> その際、各コンポーネントのCORBAオブジェクトが
> >> POA上で非活性化されるので、それ以降、コンポーネントの
> >> インタフェースをコールすることができなくなります。
> >> したがって、コンポーネントからマネージャをshutdown
> >> すると、自分自身もCORBAオブジェクトとして
> >> 存在できなくなります。
> >>
> >> プログラムでは、onExecute()内でManager::shutdown()
> >> を呼んでいるようですが、その場合、shutdown処理から
> >> 返った時点で、コンポーネントのCOBRAオブジェクトが
> >> 存在しなくなっています。onExecute()は、実行コンテキスト
> >> が
> >> CORBA経由でコールしているので、実行コンテキストから見る
> >> と、
> >> COBRA呼び出しをしている途中で、
> >> 呼び出しているCOBRAオブジェクトがPOAで非活性化されてしま
> >> うため、
> >> おかしなことになります。CORBAの場合、おそらく
> >> このケースはExceptionとなると思われます。
> >>
> >> ちょっと解説が長くなりましたが、要するに、
> >> コンポーネント内からManager::shutdown()を
> >> 呼ぶのはよろしくないと思います。
> >> マネージャをshutdown()するためには、
> >> コンポーネント(実行コンテキスト)以外の
> >> 別スレッドから呼ぶ必要があるので、
> >> 自分でスレッドを上げて、その中でManger::shutdown()
> >> を呼ぶと、より安全にマネージャを終了させることができます
> >> 。
> >>
> >> 清水
> >>
> >> --- Akio Uda <uda-axa @ necst.nec.co.jp> wrote:
> >>
> >> > いつも御世話になります。宇田@NECシステムテクノロジー
> >> です
> >> >
> >> > 度々申し訳ありません。
> >> >
> >> > OpenRTM-aist-0.4.2 環境において、RTC::Manager の
> >> > shutdown() を
> >> > 呼んだ場合に、shutdownORB() の処理で SystemException
> >> > が発生する
> >> > ようなのですが、omniORB
> >> > の設定で注意すべき点などはございますで
> >> > しょうか?
> >> >
> >> > OpenRTM は Fedora
> >> > 一括インストール・スクリプトを使っております。
> >> > 再現環境を添付致しますので、もし使用法などに問題があり
> >> ましたら
> >> > ご指摘頂ければ幸いです。
> >> >
> >> > よろしくお願い申し上げます。
> >> >
> >> >
> >> >
> >> >  ShutdownComp.h
> >> > ┌──────────────────────────
> >> ───────┐
> >> > │class ShutdownComp  : public
> >> > RTC::DataFlowComponentBase           │
> >> > │{
> >> >                │
> >> > │  ・・
> >> >                │
> >> > │ private:
> >> >                │
> >> > │  RTC::Manager* m_manager;
> >> >                │
> >> > │  int           m_count;
> >> >                │
> >> > │};
> >> >                │
> >> > └──────────────────────────
> >> ───────┘
> >> >
> >> >
> >> >  ShutdownComp.cpp
> >> > ┌──────────────────────────
> >> ───────┐
> >> > │ShutdownComp::ShutdownComp(RTC::Manager* manager)
> >> >                │
> >> > │    // <rtc-template block="initializer">
> >> >                │
> >> > │  : RTC::DataFlowComponentBase(manager),
> >> >                │
> >> > │    ・・
> >> >                │
> >> > │    m_manager(manager),
> >> >                │
> >> > │    m_count(10)
> >> >                │
> >> > │    ・・
> >> >                │
> >> > │{
> >> >                │
> >> > │  ・・
> >> >                │
> >> > │}
> >> >                │
> >> > │
> >> >                │
> >> > │
> >> >                │
> >> > │RTC::ReturnCode_t
> >> > ShutdownComp::onExecute(RTC::UniqueId ec_id)    │
> >> > │{
> >> >                │
> >> > │  m_count--;
> >> >                │
> >> > │  cout << "count douwn " << m_count << endl;
> >> >                │
> >> > │  if(m_count==0){
> >> >                │
> >> > │    cout << "shutdown start" << endl;
> >> >
> >> > │    m_manager->shutdown();
> >> >          …… ☆
> >> > │    cout << "shutdown end" << endl;
> >> >
> >> > │  }
> >> >                │
> >> > │  sleep(1);
> >> >                │
> >> > │
> >> >                │
> >> > │  return RTC::RTC_OK;
> >> >                │
> >> > │}
> >> >                │
> >> > └──────────────────────────
> >> ───────┘
> >> >
> >> >
> >> >  rtc27492.log
> >> > ┌──────────────────────────
> >> ───────┐
> >> > │・・
> >> >                │
> >> > │manager Manager::shutdown()
> >> >                │
> >> > │manager Manager::shutdownComponents()
> >> >                │
> >> > │manager Manager::shutdownComponents()
> >> >                │
> >> > │manager
> >> > Manager::unregisterComponent(ShutdownComp0)
> >> >      │
> >> > │manager Unbind name: ShutdownComp0.rtc
> >> >                │
> >> > │naming_svc
> >> > NamingManager::unbindObject(ShutdownComp0.rtc)
> >> >   │
> >> > │manager Manager::shutdownNaming()
> >> >                │
> >> > │naming_svc NamingManager::unbindAll(): 0 names.
> >> >                │
> >> > │manager Manager::shutdownORB()
> >> >                │
> >> > │manager No pending works of ORB. Shutting down POA
> >> > and ORB.       │
> >> > │manager Caught SystemException during root POA
> >> > destruction
> >> > │manager Caught CORBA::SystemException during ORB
> >> > shutdown   …… ☆
> >> > │・・
> >> >
> >> > └──────────────────────────
> >> ───────┘
> >> >
> >> >
> >> >
> >> zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
> >> > z  宇田 安規男
> >> >                   z
> >> > z  NECシステムテクノロジー株式会社
> >> > エンベデッドソフトウェア事業部  z
> >> > z  神奈川県川崎市中原区下沼部 1753  NEC 玉川事業場
> >> > S棟26F              z
> >> > z  〒 211-8666   Tel: 044-435-5657  Fax:
> >> > 044-435-5629                  z
> >> > z  E-mail: uda-axa @ necst.nec.co.jp
> >> >                   z
> >> >
> >> zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
> >>
> >> --------------------
> >> Masayuki Shimizu
> >> Assistant Professor
> >> Department of Mechanical Engineering
> >> Faculty of Engineering
> >> Shizuoka University
> >> 3-5-1, Johoku, Naka-ku, Hamamatsu 432-8561, JAPAN
> >
> > zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
> > z  宇田 安規男                                                        z
> > z  NECシステムテクノロジー株式会社  エンベデッドソフトウェア事業部  z
> > z  神奈川県川崎市中原区下沼部 1753  NEC 玉川事業場 S棟26F              z
> > z  〒 211-8666   Tel: 044-435-5657  Fax: 044-435-5629                  z
> > z  E-mail: uda-axa @ necst.nec.co.jp                                     z
> > zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
> 
> -- 
> 安藤慶昭@独立行政法人産業技術総合研究所 研究員
>  知能システム研究部門 タスクインテリジェンス研究グループ
>  〒305-8568 茨城県つくば市梅園1-1-1 中央第2
>  TEL: 029-861-5981 FAX: 029-862-6631
>  n-ando @ aist.go.jp, n-ando @ ieee.org

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
z  宇田 安規男                                                        z
z  NECシステムテクノロジー株式会社  エンベデッドソフトウェア事業部  z
z  神奈川県川崎市中原区下沼部 1753  NEC 玉川事業場 S棟26F              z
z  〒 211-8666   Tel: 044-435-5657  Fax: 044-435-5629                  z
z  E-mail: uda-axa @ necst.nec.co.jp                                     z
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz




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