[openrtm-users 00596] Re: shutdown 処理についてのお伺い
Akio Uda
uda-axa @ necst.nec.co.jp
2008年 9月 4日 (木) 10:47:45 JST
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
openrtm-users メーリングリストの案内