[omniORB-dev] Removing an entry from proxyObjectFactory

Christian Perez Christian.Perez@irisa.fr
Thu, 20 Feb 2003 18:22:27 +0100


This is a multi-part message in MIME format.
--------------D90DEE9F698B8409A5F9EDCB
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

Hello,

We would like to dynamically be able to load/unload code into a server.
It appears to work fine except for the management of proxyObjectFactory.

The proxyObjectFactory global variables in the IDL generated files correctly
register themself thanks to their constructor. However, there is
no destructor. When such a code is unloaded from the memory,
the list of registered proxyObjectFactory is incorrect because it contains
dangling pointers.

A solution is to implement the destructor of proxyObjectFactory.
Hence, proxyObjectFactory are going to be correctly removed.

In attachement, you'll find such an implementation of proxyFactory.cc
derived from omniORB3 (location src/lib/omniORB2/orbcore/proxyFactory.cc).
This implementation is based on the used of the map of the C++ STL.

As the proxyObjectFactory API is the same in omniORB4, the same modification
should work.

It would be very nice if such a patch can be applied to omniORB.

Best regards,
Christian Pérez
--
Research scientist - PARIS Project - IRISA/INRIA
http://www.irisa.fr/paris/
--------------D90DEE9F698B8409A5F9EDCB
Content-Type: text/plain; charset=us-ascii;
 name="proxyFactory-fix.cc"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="proxyFactory-fix.cc"


#include <omniORB3/CORBA.h>

#ifdef HAS_pch
#pragma hdrstop
#endif

#include <omniORB3/proxyFactory.h>
#include <map>

typedef map<const char*, proxyObjectFactory*> ofl_t;

// We used a pointer  because we do not know how to control
// the initialization of global variables.
static ofl_t *_ofl;

proxyObjectFactory::~proxyObjectFactory()  { _ofl->erase(pd_repoId); }


proxyObjectFactory::proxyObjectFactory(const char* repoId)
{

  // The first time such an object is build, it has to
  // initialize the _ofl object. So, we are ablt to control
  // the order of initialization./
  if (_ofl == 0) {
    _ofl = new  ofl_t();
  }

  OMNIORB_ASSERT(repoId);

  pd_repoId = CORBA::string_dup(repoId);

  // This code could be concurrently called with a lookup.
  // It should be protected with a mutex

  ofl_t::iterator it = _ofl->find(pd_repoId);

  if (it != _ofl->end() ) {
    it->second = this;
    if( omniORB::trace(15) )
      omniORB::logf("Replaced proxyObjectFactory for %s.", repoId);
  } else {
    (*_ofl)[repoId] = this;
  }

}


void
proxyObjectFactory::shutdown()
{
  _ofl->clear();
}


proxyObjectFactory*
proxyObjectFactory::lookup(const char* repoId)
{
  // This code has should be concurrently called with an constructor.
  // It should be protected with mutex

  OMNIORB_ASSERT(repoId);

  ofl_t::iterator it = _ofl->find(repoId);

  if ( it != _ofl->end() )
    return it->second;
  else
    return 0;
}

--------------D90DEE9F698B8409A5F9EDCB--