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

Ando Noriaki n-ando @ aist.go.jp
2008年 9月 4日 (木) 18:01:42 JST


宇田様、清水様

安藤です

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

もし、あるコンポーネントをexitしたときに、たとえ同じプロセスで
他のコンポーネントも動いていたとしても、そのプロセスを強制的に
終了したいのであれば、以下のような方法があります。

仮に、そのコンポーネントをexitするとプロセスを強制的に終了させる
TerminatorComponentというのを作ったとします。
そのonFinalize関数で以下のようにSIGINTシグナルを発行してやると、
Ctrl+Cを押したのと同じ状態になりますので、プロセスごと終了します。

RTC::ReturnCode_t TerminatorComponent::onFinalize()
{
  raise(SIGINT);
  return RTC::RTC_OK;
}

ただし、サンプルのConsoleInCompのような入力待ちをしているRTCが
同じプロセスにあると、入力があるまで終了してくれません。
通常はコンポーネントで単純なcinを使った入力待ちはしないとおもいますので、
この方法で宇田さんの目的は達成されるのではないかと思います。

あまりきれいなやり方ではありませんが、SIGINTを発行してやると、コンポーネントの
deactivateとPOAやORBのdeactivate/shutdownおよび、オブジェクトのデストラクタなどが
別スレッドで走るので、いまのところ一番安全かつ確実な方法だと思います。

本来Managerは、デーモンとして使用することを考えて作りましたので、
コンポーネントがManagerを落とすという使い方は考慮していません。
(RTCはManager上で生成されるので、RTCの終了前にManagerが終了することは
オブジェクトの寿命の依存関係を壊すことになりますので。。。)

ただし、そういった使い方をしたいことあるかもしれませんので、
1.ManagerにCORBAインターフェースを持たせて、外部からManagerの終了を
  制御できるようにする
2.ManagerとRTCの依存関係を切る
といった方向で次期バージョンに反映させたいと思います。



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



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