安藤です
> OpenRTM-aist開発者の皆様
>
> SdoConfigurationのデストラクタ、
> SDOPackage::~Configuration_impl();
> の実装がまずいと思います。
>
> このクラスはCORBAサーバント実装なので、
> コンストラクタで、
> this->_this();
> とimplicit activationしています。
> したがって、デストラクタでdeactivation
> をしなければ安全でないと思います。
> このクラスをnewしてそのままdeleteされる
> 可能性を考えて実装すべきと考えます。
SdoConfigurationのdeactivateはRTObjectのshutdownの中で行っています。
SdoConfigurationの寿命はRTObjectの寿命以下なので、
とりあえずこれでも問題ないと思います。
コンストラクタの中で、activateしているので、デストラクタの中で
deactivateするのが筋かとは思いますが。
> よって、以下のようなデストラクタの実装が
> 必要ではないでしょうか。
> ----------
> try{
> PortableServer::POA_var poa = this->_default_POA();
> PortableServer::ObjectId* id =
> poa->servant_to_id(this);
> poa->deactivate_object(*id);
> }catch(...){
> }
> ----------
>
> P.S. ところで、このクラスではdefaultPOAを使っていますが
> 、
> ManagerのPOAと一致させなくても大丈夫なのでしょうか?
> 現在のところは、ManagerのPOAもdefaultPOAなのでよいですが
> 、
> もし将来的にManagerのPOAがdefaultPOAでなくなったときに、
> 何らかの問題が起きるのでは?と感じます。
そうですね、RTObjectのshutdown内でのdeactivateでManagerから
もらったPOAでdeactivateをしているのでこれは問題になるかもしれません。
ところで、defaultでないPOAを使いたい場面とか、なにかありますか。
あるようなら、独自のServantBaseを実装してもよいのですが。。。
OpenRTM-aist開発者の皆様
SdoConfigurationのデストラクタ、
SDOPackage::~Configuration_impl();
の実装がまずいと思います。
このクラスはCORBAサーバント実装なので、
コンストラクタで、
this->_this();
とimplicit activationしています。
したがって、デストラクタでdeactivation
をしなければ安全でないと思います。
このクラスをnewしてそのままdeleteされる
可能性を考えて実装すべきと考えます。
よって、以下のようなデストラクタの実装が
必要ではないでしょうか。
----------
try{
PortableServer::POA_var poa = this->_default_POA();
PortableServer::ObjectId* id =
poa->servant_to_id(this);
poa->deactivate_object(*id);
}catch(...){
}
----------
P.S. ところで、このクラスではdefaultPOAを使っていますが
、
ManagerのPOAと一致させなくても大丈夫なのでしょうか?
現在のところは、ManagerのPOAもdefaultPOAなのでよいですが
、
もし将来的にManagerのPOAがdefaultPOAでなくなったときに、
何らかの問題が起きるのでは?と感じます。
静岡大 清水