X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSALOMESDS%2FSALOMESDS_DataServerManager.cxx;h=4f2a0d0fee233d24d4951d5a29b8d045630971b1;hb=4d61f5b8863253a259cde301c39b60909a6b18fa;hp=0193b507661a6136c48e8ebd1917ce461145355a;hpb=7e6982e9ccf83f3ede551d990d5a80807dcf1a87;p=modules%2Fkernel.git diff --git a/src/SALOMESDS/SALOMESDS_DataServerManager.cxx b/src/SALOMESDS/SALOMESDS_DataServerManager.cxx index 0193b5076..4f2a0d0fe 100644 --- a/src/SALOMESDS/SALOMESDS_DataServerManager.cxx +++ b/src/SALOMESDS/SALOMESDS_DataServerManager.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -33,9 +33,19 @@ const char DataServerManager::NAME_IN_NS[]="/DataServerManager"; const char DataServerManager::DFT_SCOPE_NAME_IN_NS[]="Default"; -DataServerManager::DataServerManager(int argc, char *argv[], CORBA::ORB_ptr orb, PortableServer::POA_ptr poa):_orb(CORBA::ORB::_duplicate(orb)) +SALOME::StringVec *RequestSwitcherDSM::listScopes() { - DataScopeServer *dftScope(new DataScopeServer(orb,DFT_SCOPE_NAME_IN_NS));//_remove_ref will be call by DataScopeServer::shutdownIfNotHostedByDSM + return _dsm->listScopes(); +} + +SALOME::DataScopeServerTransaction_ptr RequestSwitcherDSM::giveADataScopeTransactionCalled(const char *scopeName, CORBA::Boolean& isCreated) +{ + return _dsm->giveADataScopeTransactionCalled(scopeName,isCreated); +} + +DataServerManager::DataServerManager(const SALOME_CPythonHelper *pyHelper, CORBA::ORB_ptr orb, PortableServer::POA_ptr poa):_orb(CORBA::ORB::_duplicate(orb)) +{ + DataScopeServer *dftScope(new DataScopeServer(pyHelper,orb,SALOME::DataScopeKiller::_nil(),DFT_SCOPE_NAME_IN_NS));//_remove_ref will be call by DataScopeServer::shutdownIfNotHostedByDSM PortableServer::POAManager_var pman(poa->the_POAManager()); CORBA::PolicyList policies; policies.length(1); @@ -43,8 +53,6 @@ DataServerManager::DataServerManager(int argc, char *argv[], CORBA::ORB_ptr orb, policies[0]=PortableServer::ThreadPolicy::_duplicate(threadPol); _poa=poa->create_POA("SingleThPOA4SDS",pman,policies); threadPol->destroy(); - // - dftScope->initializePython(argc,argv);// agy : Very important ! invoke this method BEFORE activation ! // activate this to be ready to be usable from NS. PortableServer::ObjectId_var id(_poa->activate_object(this)); CORBA::Object_var obj(_poa->id_to_reference(id)); @@ -53,10 +61,10 @@ DataServerManager::DataServerManager(int argc, char *argv[], CORBA::ORB_ptr orb, SALOME_NamingService ns(orb); ns.Register(obj2,NAME_IN_NS); // the default DataScopeServer object is the only one hosted by the current process - id=_poa->activate_object(dftScope); - obj=_poa->id_to_reference(id); + dftScope->setPOA(_poa); + obj=dftScope->activate(); SALOME::DataScopeServer_var dftScopePtr(SALOME::DataScopeServer::_narrow(obj)); - dftScope->setPOAAndRegister(_poa,dftScopePtr);// agy : Very important ! invoke this method BEFORE activation ! Because this method initializes Python ! + dftScope->registerInNS(dftScopePtr);// agy : Very important ! invoke this method BEFORE activation ! Because this method initializes Python ! } SALOME::StringVec *DataServerManager::listScopes() @@ -64,9 +72,9 @@ SALOME::StringVec *DataServerManager::listScopes() std::vector scopes(listOfScopesCpp()); SALOME::StringVec *ret(new SALOME::StringVec); std::size_t sz(scopes.size()); - ret->length(sz); + ret->length((CORBA::ULong)sz); //!< TODO: size_t to CORBA::ULong for(std::size_t i=0;ilength(sz); + ret->length((CORBA::ULong)sz); //!< TODO: size_t to CORBA::ULong for(std::size_t i=0;iping(); - } - catch(...) - { ret=false; } - return ret; + SALOME::DataScopeServerBase_var scopePtr(getScopePtrGivenName(scopeName)); + return IsAliveAndKicking(scopePtr); } -SALOME::DataScopeServer_ptr DataServerManager::createDataScope(const char *scopeName) +template +typename T::PtrType CreateDataScope(const std::string& scopeName, const std::vector& scopes, SALOME_NamingService& ns) { - std::string scopeNameCpp(scopeName); - std::vector scopes(listOfScopesCpp()); - if(std::find(scopes.begin(),scopes.end(),scopeNameCpp)!=scopes.end()) + int isTransactionInt(T::IsTransaction); + if(std::find(scopes.begin(),scopes.end(),scopeName)!=scopes.end()) { std::ostringstream oss; oss << "DataServerManager::createDataScope : scope name \"" << scopeName << "\" already exists !"; throw Exception(oss.str()); } // - SALOME_NamingService ns(_orb); - std::string fullScopeName(CreateAbsNameInNSFromScopeName(scopeName)); - std::ostringstream oss; oss << "SALOME_DataScopeServer" << " " << scopeName << " "; + std::string fullScopeName(DataServerManager::CreateAbsNameInNSFromScopeName(scopeName)); + std::ostringstream oss; oss << "SALOME_DataScopeServer" << " " << scopeName << " " << isTransactionInt << " "; SALOME_ContainerManager::AddOmninamesParams(oss,&ns); std::string command(oss.str()); SALOME_ContainerManager::MakeTheCommandToBeLaunchedASync(command); int status(SALOME_ContainerManager::SystemThreadSafe(command.c_str())); + if(status!=0) + { + std::ostringstream oss2; oss2 << "CreateDataScope : Fail to launch \"" << command << "\" ! Return code was : " << status << " !"; + throw Exception(oss2.str()); + } int count(SALOME_ContainerManager::GetTimeOutToLoaunchServer()); - SALOME::DataScopeServer_var ret(SALOME::DataScopeServer::_nil()); + typename T::VarType ret(T::nil()); while (CORBA::is_nil(ret) && count) { SALOME_ContainerManager::SleepInSecond(1); count--; CORBA::Object_var obj(ns.Resolve(fullScopeName.c_str())); - ret=SALOME::DataScopeServer::_narrow(obj); + ret=T::narrow(obj); } - return SALOME::DataScopeServer::_duplicate(ret); + return T::duplicate(ret); } -SALOME::DataScopeServer_ptr DataServerManager::giveADataScopeCalled(const char *scopeName, CORBA::Boolean& isCreated) +template +typename T::PtrType GiveADataScopeCalled(const std::string& scopeName, const std::vector& scopes, SALOME_NamingService& ns, CORBA::Boolean& isCreated) { - std::string scopeNameCpp(scopeName); - std::vector scopes(listOfScopesCpp()); - if(std::find(scopes.begin(),scopes.end(),scopeNameCpp)==scopes.end()) + if(std::find(scopes.begin(),scopes.end(),scopeName)==scopes.end()) { isCreated=true; - return createDataScope(scopeName); + return CreateDataScope(scopeName,scopes,ns); } else { - if(isAliveAndKicking(scopeName)) + SALOME::DataScopeServerBase_var ret(SALOMESDS::DataServerManager::GetScopePtrGivenName(scopeName,scopes,ns)); + if(SALOMESDS::DataServerManager::IsAliveAndKicking(ret)) { isCreated=false; - return retriveDataScope(scopeName); + typename T::PtrType ret2(T::narrow(ret)); + if(CORBA::is_nil(ret)) + return ret2; + if(CORBA::is_nil(ret2)) + { + std::ostringstream oss; oss << "DataServerManager::giveADataScopeCalled : scope \"" << scopeName << "\" exists but with invalid type !"; + throw Exception(oss.str()); + } + return ret2; } else { - SALOME_NamingService ns(_orb); - std::string fullScopeName(SALOMESDS::DataServerManager::CreateAbsNameInNSFromScopeName(scopeNameCpp)); + std::string fullScopeName(SALOMESDS::DataServerManager::CreateAbsNameInNSFromScopeName(scopeName)); ns.Destroy_Name(fullScopeName.c_str()); isCreated=true; - return createDataScope(scopeName); + return CreateDataScope(scopeName,scopes,ns); } } } -SALOME::DataScopeServer_ptr DataServerManager::retriveDataScope(const char *scopeName) +class NormalFunctor +{ +public: + typedef SALOME::DataScopeServer_ptr PtrType; + typedef SALOME::DataScopeServer_var VarType; + typedef SALOME::DataScopeServer TheType; + static const bool IsTransaction=false; + static PtrType nil() { return SALOME::DataScopeServer::_nil(); } + static PtrType narrow(CORBA::Object_ptr obj) { return SALOME::DataScopeServer::_narrow(obj); } + static PtrType duplicate(PtrType obj) { return SALOME::DataScopeServer::_duplicate(obj); } +}; + +class TransactionFunctor +{ +public: + typedef SALOME::DataScopeServerTransaction_ptr PtrType; + typedef SALOME::DataScopeServerTransaction_var VarType; + typedef SALOME::DataScopeServerTransaction TheType; + static const bool IsTransaction=true; + static PtrType nil() { return SALOME::DataScopeServerTransaction::_nil(); } + static PtrType narrow(CORBA::Object_ptr obj) { return SALOME::DataScopeServerTransaction::_narrow(obj); } + static PtrType duplicate(PtrType obj) { return SALOME::DataScopeServerTransaction::_duplicate(obj); } +}; + +SALOME::DataScopeServer_ptr DataServerManager::createDataScope(const char *scopeName) +{ + SALOME_NamingService ns(_orb); + return CreateDataScope(scopeName,listOfScopesCpp(),ns); +} + +SALOME::DataScopeServer_ptr DataServerManager::giveADataScopeCalled(const char *scopeName, CORBA::Boolean& isCreated) { - SALOME::DataScopeServer_var ret(getScopePtrGivenName(scopeName)); - return SALOME::DataScopeServer::_duplicate(ret); + SALOME_NamingService ns(_orb); + return GiveADataScopeCalled(scopeName,listOfScopesCpp(),ns,isCreated); +} + +SALOME::DataScopeServerTransaction_ptr DataServerManager::createDataScopeTransaction(const char *scopeName) +{ + SALOME_NamingService ns(_orb); + return CreateDataScope(scopeName,listOfScopesCpp(),ns); +} + +SALOME::DataScopeServerTransaction_ptr DataServerManager::giveADataScopeTransactionCalled(const char *scopeName, CORBA::Boolean& isCreated) +{ + SALOME_NamingService ns(_orb); + return GiveADataScopeCalled(scopeName,listOfScopesCpp(),ns,isCreated); +} + +SALOME::DataScopeServerBase_ptr DataServerManager::retriveDataScope(const char *scopeName) +{ + SALOME::DataScopeServerBase_var ret(getScopePtrGivenName(scopeName)); + return SALOME::DataScopeServerBase::_duplicate(ret); } void DataServerManager::removeDataScope(const char *scopeName) { - SALOME::DataScopeServer_var scs(getScopePtrGivenName(scopeName)); - scs->shutdownIfNotHostedByDSM(); + SALOME::DataScopeServerBase_var scs(getScopePtrGivenName(scopeName)); + SALOME::DataScopeKiller_ptr killer; + if(scs->shutdownIfNotHostedByDSM(killer)) + killer->shutdown(); + CORBA::release(killer); } void DataServerManager::cleanScopesInNS() @@ -193,7 +262,13 @@ void DataServerManager::shutdownScopes() { std::vector scopeNames(listOfScopesCpp()); for(std::vector::const_iterator it=scopeNames.begin();it!=scopeNames.end();it++) - getScopePtrGivenName(*it)->shutdownIfNotHostedByDSM(); + { + SALOME::DataScopeServerBase_var scope(getScopePtrGivenName(*it)); + SALOME::DataScopeKiller_ptr killer; + if(scope->shutdownIfNotHostedByDSM(killer)) + killer->shutdown(); + CORBA::release(killer); + } } std::string DataServerManager::CreateAbsNameInNSFromScopeName(const std::string& scopeName) @@ -202,6 +277,18 @@ std::string DataServerManager::CreateAbsNameInNSFromScopeName(const std::string& return oss.str(); } +CORBA::Boolean DataServerManager::IsAliveAndKicking(SALOME::DataScopeServerBase_ptr scopePtr) +{ + CORBA::Boolean ret(true); + try + { + scopePtr->ping(); + } + catch(...) + { ret=false; } + return ret; +} + std::vector DataServerManager::listOfScopesCpp() { SALOME_NamingService ns(_orb); @@ -210,18 +297,31 @@ std::vector DataServerManager::listOfScopesCpp() return ret; } -SALOME::DataScopeServer_var DataServerManager::getScopePtrGivenName(const std::string& scopeName) +SALOME::DataScopeServerBase_var DataServerManager::GetScopePtrGivenName(const std::string& scopeName, const std::vector& scopes, SALOME_NamingService& ns) { - std::vector scopes(listOfScopesCpp()); - std::size_t sz(scopes.size()); if(std::find(scopes.begin(),scopes.end(),scopeName)==scopes.end()) { std::ostringstream oss; oss << "DataServerManager::getScopePtrGivenName : scope name \"" << scopeName << "\" does not exist !"; throw Exception(oss.str()); } - SALOME_NamingService ns(_orb); std::string fullScopeName(CreateAbsNameInNSFromScopeName(scopeName)); CORBA::Object_var obj(ns.Resolve(fullScopeName.c_str())); - SALOME::DataScopeServer_var ret(SALOME::DataScopeServer::_narrow(obj)); + SALOME::DataScopeServerBase_var ret(SALOME::DataScopeServerBase::_narrow(obj)); return ret; } + +SALOME::DataScopeServerBase_var DataServerManager::getScopePtrGivenName(const std::string& scopeName) +{ + SALOME_NamingService ns(_orb); + return GetScopePtrGivenName(scopeName,listOfScopesCpp(),ns); +} + +SALOME::RequestSwitcherDSM_ptr DataServerManager::getRequestSwitcher() +{ + if(_rs.isNull()) + { + _rs=new RequestSwitcherDSM(_orb,this); + } + CORBA::Object_var obj(_rs->activate()); + return SALOME::RequestSwitcherDSM::_narrow(obj); +}