Commit ab0cf843 authored by Pavel Vainerman's avatar Pavel Vainerman

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

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