[openrtm-users 00594] shutdown処理についてのお伺い

5 posts / 0 new
Last post
root
Offline
Last seen: 2 days 8 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00594] 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 …… ☆
│・・
└─────────────────────────────────┘

Undefined
root
Offline
Last seen: 2 days 8 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00595] 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()
を呼ぶと、より安全にマネージャを終了させることができます

清水

root
Offline
Last seen: 2 days 8 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00596] shutdown 処理についてのお伺い

いつも御世話になります。宇田@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()
> を呼ぶと、より安全にマネージャを終了させることができます
> 。
>
> 清水
>

root
Offline
Last seen: 2 days 8 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00597] shutdown 処理についてのお伺い

宇田様、清水様

安藤です

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

もし、あるコンポーネントを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 :
> 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 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::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 …… ☆
>> > │・・
>> >
>> > └──────────────────────────
>> ───────┘
>> >
>> >
>> >

root
Offline
Last seen: 2 days 8 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00598] shutdown 処理についてのお伺い

いつも御世話になります。宇田@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:
> > 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 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::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 …… ☆
> >> > │・・
> >> >
> >> > └──────────────────────────
> >> ───────┘
> >> >
> >> >
> >> >

Log in or register to post comments

Download

latest Releases : 2.0.0-RELESE

2.0.0-RELESE Download page

Number of Projects

Choreonoid

Motion editor/Dynamics simulator

OpenHRP3

Dynamics simulator

OpenRTP

Integrated Development Platform

AIST RTC collection

RT-Components collection by AIST

TORK

Tokyo Opensource Robotics Association

DAQ-Middleware

Middleware for DAQ (Data Aquisition) by KEK