AW: [omniORB] Boost shared_ptr

Vázquez Landa, David david.vazquez-landa at ndsatcom.com
Fri Nov 14 15:54:21 GMT 2008


Thanks for the answer... Pity that it won't work on the client side, I was hoping for a way of automatically calling "destroy()" when an interface isn't used anymore...

See, On the server side I use Java, but I still have a destroy() method for my interfaces, such that I can deactivate them (remove them from the AOM.)

Thus, user would see like:

Interface user 
{
	void setName(in string name);
	string getName();
	void destroy();
};

And by using shared_ptr on the client side, I was hoping to be able to call my own implementation of the interface's destructor, hence, calling user->destroy(); automatically...

So now I'm at a loss... :S  If I wrote a wrapper for the interface user, I suppose I could use a shared_ptr to that wrapper and call the wrapper's destructor and, well, you get it, I suppose.

It's perhaps very onion-like, but I still HAVE TO use wrappers (not my decission really), so I may as well try it like that... 

What do you think? Would it be viable?

-----Ursprüngliche Nachricht-----
Von: Michael [mailto:omniorb at bindone.de] 
Gesendet: Freitag, 14. November 2008 15:46
An: Vázquez Landa, David
Cc: omniorb-list at omniorb-support.com
Betreff: Re: [omniORB] Boost shared_ptr

Client side:
There is very little reason to do this, don't try to use boost::shared_ptr<User_ptr>, it won't really work and cause headaches.
You could of course use boost::shared_ptr<User_var>, but this is not smart either.
If anybody knows a reasonable way of doing this I would like to be enlightened as well :)

Server side:
Depending of the type of POA you're using it can make sense to have shared_ptrs here. I use the following template:

template<class T>
class CorbaDeleter
{
  PortableServer::POA_var _poa;

public:
  CorbaDeleter(PortableServer::POA_ptr poa):
           _poa(PortableServer::POA::_duplicate(poa))
  {}

  void operator()(T* p)
  {
    try
    {
      if (!_poa->_non_existent())
      {
        PortableServer::ObjectId_var oid = _poa->servant_to_id(p);
        _poa->deactivate_object(oid);
      }
    }
    catch(...)
    {
      std::cerr << "Exception while deactivating object (maybe not activated in the first place)" << std::endl;
    }
    p->_remove_ref();
  }
};

I use this for hierarchical objects where I also need to keep a list of child objects in a parent object. This way all children will get destroyed correctly if the parent goes away.

Usage looks like:
typedef boost::shared_ptr<User_impl> UserRef; typedef std::vector<UserRef> UserList;

UserRef user(new User_impl(...), CorbaDeleter<User_impl>(myPoa)); PortableServer::ObjectId_var oid = PortableServer::string_to_ObjectId(...);
myPoa->activate_object_with_id(oid, user.get());

UserList ul;
ul.push_back(user);





Vázquez Landa wrote:
> Hi,
> 
> I guess many of you are using shared_ptr's in your codes... So I wanted to ask how does it work with CORBA...
> 
> Say I have an interface:
> 
> Interface User
> {
> 	void setName(in string name);
> 	string getName();
> };
> 
> Normally, I would use CORBA's User_var in my code to perform operations... Now my obvious question is if I can use a shared pointer for that purpose... 
> 
> Thanks :)
> 
> _______________________________________________
> omniORB-list mailing list
> omniORB-list at omniorb-support.com
> http://www.omniorb-support.com/mailman/listinfo/omniorb-list




More information about the omniORB-list mailing list