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

Masayuki Shimizu masayuki.shimizu @ aist.go.jp
2008年 9月 4日 (木) 02:53:39 JST


静岡大 清水です。

終了処理に関しては、私も四苦八苦していますので、
私が知っている範囲内で情報提供します。

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



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