Commit ab0cf843 authored by Pavel Vainerman's avatar Pavel Vainerman

Начало работы над переходом на weak_ptr в работе UniSetObject,UniSetManager,UniSetActivator

parent 84dd804d
......@@ -72,7 +72,7 @@ class UniSetManager:
virtual UniSetTypes::SimpleInfoSeq* getObjectsInfo( CORBA::Long MaxLength=300 ) override ;
// --------------------------
void initPOA(UniSetManager* rmngr);
void initPOA( const std::weak_ptr<UniSetManager>& rmngr );
virtual bool addObject( const std::shared_ptr<UniSetObject>& obj );
virtual bool removeObject( const std::shared_ptr<UniSetObject>& obj );
......
......@@ -193,7 +193,7 @@ class UniSetObject:
inline void setActive( bool set ){ active = set; }
UniSetTypes::VoidMessage msg;
UniSetManager* mymngr;
std::weak_ptr<UniSetManager> mymngr;
void setThreadPriority( int p );
......@@ -208,10 +208,10 @@ class UniSetObject:
}
/*! функция потока */
void work();
void work();
//! Инициализация параметров объекта
bool init(UniSetManager* om);
//! Прямая деактивизация объекта
bool init( const std::weak_ptr<UniSetManager>& om );
//! Прямая деактивизация объекта
bool deactivate();
//! Непосредственная активизация объекта
bool activate();
......
......@@ -256,7 +256,7 @@ void UniSetActivator::run( bool thread )
{
ulogsys << myname << "(run): создаю менеджер "<< endl;
UniSetManager::initPOA(this);
UniSetManager::initPOA( get_aptr() );
if( getId() == UniSetTypes::DefaultObjectId )
offThread(); // отключение потока обработки сообщений, раз не задан ObjectId
......
......@@ -152,19 +152,23 @@ UniSetManager::~UniSetManager()
mlist.clear();
}
// ------------------------------------------------------------------------------------------
void UniSetManager::initPOA( UniSetManager* rmngr )
void UniSetManager::initPOA( const std::weak_ptr<UniSetManager>& rmngr )
{
auto m = rmngr.lock();
if( !m )
{
ostringstream err;
err << myname << "(initPOA): failed weak_ptr !!";
ucrit << err.str() << endl;
throw SystemError(err.str());
}
if( CORBA::is_nil(pman) )
this->pman = rmngr->getPOAManager();
/*
string mname(getName());
mname+="_poamngr";
PortableServer::POA_var root_poa = rmngr->getPOA();
poa = root_poa->create_POA(mname.c_str(), pman, policyList);
*/
PortableServer::POA_var rpoa = rmngr->getPOA();
this->pman = m->getPOAManager();
PortableServer::POA_var rpoa = m->getPOA();
if( rpoa != poa )
poa = rmngr->getPOA();
poa = m->getPOA();
if( CORBA::is_nil(poa) )
ucrit << myname << "(initPOA): failed init poa " << endl;
......@@ -249,7 +253,7 @@ void UniSetManager::managers( OManagerCommand cmd )
switch(cmd)
{
case initial:
li->initPOA(this);
li->initPOA( get_mptr() );
break;
case activ:
......@@ -311,7 +315,7 @@ void UniSetManager::objects(OManagerCommand cmd)
switch(cmd)
{
case initial:
li->init(this);
li->init(get_mptr());
break;
case activ:
......
......@@ -46,7 +46,6 @@ using namespace UniSetTypes;
// ------------------------------------------------------------------------------------------
UniSetObject::UniSetObject():
ui(UniSetTypes::DefaultObjectId),
mymngr(NULL),
msgpid(0),
reg(false),
active(0),
......@@ -66,7 +65,6 @@ stCountOfQueueFull(0)
// ------------------------------------------------------------------------------------------
UniSetObject::UniSetObject( ObjectId id ):
ui(id),
mymngr(NULL),
msgpid(0),
reg(false),
active(0),
......@@ -99,7 +97,6 @@ stCountOfQueueFull(0)
UniSetObject::UniSetObject(const string& name, const string& section):
ui(UniSetTypes::DefaultObjectId),
mymngr(NULL),
msgpid(0),
reg(false),
active(0),
......@@ -177,7 +174,7 @@ void UniSetObject::init_object()
* \param om - указазтель на менджер управляющий объектом
* \return Возращает \a true если инициализация прошда успешно, и \a false если нет
*/
bool UniSetObject::init( UniSetManager* om )
bool UniSetObject::init( const std::weak_ptr<UniSetManager>& om )
{
uinfo << myname << ": init..." << endl;
this->mymngr = om;
......@@ -334,7 +331,8 @@ void UniSetObject::registered()
return;
}
if( !mymngr )
auto m = mymngr.lock();
if( !m )
{
uwarn << myname << "(registered): unknown my manager" << endl;
string err(myname+": unknown my manager");
......@@ -370,7 +368,6 @@ void UniSetObject::registered()
(так бы можно было проверить и если "не жив", то смело заменять ссылку на новую). Но существует обратная сторона:
если заменяемый объект "жив" и завершит свою работу, то он может почистить за собой ссылку и это тогда наш(новый)
объект станет недоступен другим, а знать об этом не будет!!!
*/
ucrit << myname << "(registered): replace object (ObjectNameAlready)" << endl;
reg = true;
......@@ -638,21 +635,26 @@ bool UniSetObject::deactivate()
{
uinfo << myname << "(deactivate): ..." << endl;
PortableServer::POA_var poamngr = mymngr->getPOA();
if( !PortableServer::POA_Helper::is_nil(poamngr) )
{
try
{
deactivateObject();
}
catch(...){}
auto m = mymngr.lock();
if( m )
{
PortableServer::POA_var poamngr = m->getPOA();
if( !PortableServer::POA_Helper::is_nil(poamngr) )
{
try
{
deactivateObject();
}
catch(...){}
unregister();
PortableServer::ObjectId_var oid = poamngr->servant_to_id(static_cast<PortableServer::ServantBase*>(this));
poamngr->deactivate_object(oid);
uinfo << myname << "(disacivate): finished..." << endl;
return true;
}
}
unregister();
PortableServer::ObjectId_var oid = poamngr->servant_to_id(static_cast<PortableServer::ServantBase*>(this));
poamngr->deactivate_object(oid);
uinfo << myname << "(disacivate): finished..." << endl;
return true;
}
uwarn << myname << "(deactivate): manager already destroyed.." << endl;
}
catch(CORBA::TRANSIENT)
......@@ -684,13 +686,16 @@ bool UniSetObject::activate()
{
uinfo << myname << ": activate..." << endl;
if( mymngr == NULL )
auto m = mymngr.lock();
if( !m )
{
ucrit << myname << "(activate): mymngr=NULL!!! activate failure..." << endl;
return false;
ostringstream err;
err << myname << "(activate): mymngr=NULL!!! activate failure...";
ucrit << err.str() << endl;
throw SystemError(err.str());
}
PortableServer::POA_var poa = mymngr->getPOA();
PortableServer::POA_var poa = m->getPOA();
if( poa == NULL || CORBA::is_nil(poa) )
{
string err(myname+": не задан менеджер");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment