静岡大 清水です。
終了処理に関しては、私も四苦八苦していますので、
私が知っている範囲内で情報提供します。
Manager::shutdown()では、マネージャが管理している
全てのコンポーネントをexit()します。
その際、各コンポーネントのCORBAオブジェクトが
POA上で非活性化されるので、それ以降、コンポーネントの
インタフェースをコールすることができなくなります。
したがって、コンポーネントからマネージャをshutdown
すると、自分自身もCORBAオブジェクトとして
存在できなくなります。
プログラムでは、onExecute()内でManager::shutdown()
を呼んでいるようですが、その場合、shutdown処理から
返った時点で、コンポーネントのCOBRAオブジェクトが
存在しなくなっています。onExecute()は、実行コンテキスト
が
CORBA経由でコールしているので、実行コンテキストから見る
と、
COBRA呼び出しをしている途中で、
呼び出しているCOBRAオブジェクトがPOAで非活性化されてしま
うため、
おかしなことになります。CORBAの場合、おそらく
このケースはExceptionとなると思われます。
ちょっと解説が長くなりましたが、要するに、
コンポーネント内からManager::shutdown()を
呼ぶのはよろしくないと思います。
マネージャをshutdown()するためには、
コンポーネント(実行コンテキスト)以外の
別スレッドから呼ぶ必要があるので、
自分でスレッドを上げて、その中でManger::shutdown()
を呼ぶと、より安全にマネージャを終了させることができます
。
清水
いつも御世話になります。宇田@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::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 …… ☆
│・・
└─────────────────────────────────┘