X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSALOMESDS%2FSALOMESDS_DataScopeServer.cxx;h=b6c961a275d57acf4381a826027fe2a65c974646;hb=f4fd1701433a617d0a8789cf5e90c78029842d4c;hp=8d2ffe575e8a9dc43fccfadf62065d5f16e651e1;hpb=4b14a3f48efda72f90b88c78c6ae02153631dfd6;p=modules%2Fkernel.git diff --git a/src/SALOMESDS/SALOMESDS_DataScopeServer.cxx b/src/SALOMESDS/SALOMESDS_DataScopeServer.cxx index 8d2ffe575..b6c961a27 100644 --- a/src/SALOMESDS/SALOMESDS_DataScopeServer.cxx +++ b/src/SALOMESDS/SALOMESDS_DataScopeServer.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 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 @@ -27,7 +27,7 @@ #include "SALOMESDS_TrustTransaction.hxx" #include "SALOMESDS_KeyWaiter.hxx" #include "SALOMESDS_Transaction.hxx" -#include "SALOME_NamingService.hxx" +#include "SALOME_NamingService_Abstract.hxx" #include "SALOMESDS_Exception.hxx" #include @@ -46,68 +46,41 @@ using namespace SALOMESDS; std::size_t DataScopeServerBase::COUNTER=0; -#if PY_VERSION_HEX < 0x03050000 -static char* -Py_EncodeLocale(const wchar_t *arg, size_t *size) -{ - return _Py_wchar2char(arg, size); -} -static wchar_t* -Py_DecodeLocale(const char *arg, size_t *size) -{ - return _Py_char2wchar(arg, size); -} -#endif - void DataScopeKiller::shutdown() { Py_Finalize(); _orb->shutdown(0); } -RequestSwitcher::RequestSwitcher(CORBA::ORB_ptr orb) +RequestSwitcher::RequestSwitcher(CORBA::ORB_ptr orb, DataScopeServerTransaction *ds):RequestSwitcherBase(orb),_ds(ds) { - CORBA::Object_var obj(orb->resolve_initial_references("RootPOA")); - PortableServer::POA_var poa(PortableServer::POA::_narrow(obj)); - _poa_manager_under_control=poa->the_POAManager(); - // - CORBA::PolicyList policies; - policies.length(1); - PortableServer::ThreadPolicy_var threadPol(poa->create_thread_policy(PortableServer::SINGLE_THREAD_MODEL)); - policies[0]=PortableServer::ThreadPolicy::_duplicate(threadPol); - // all is in PortableServer::POAManager::_nil. By specifying _nil cf Advanced CORBA Programming with C++ p 506 - // a new POA manager is created. This POA manager is independent from POA manager of the son ones. - _poa_for_request_control=poa->create_POA("4RqstSwitcher",PortableServer::POAManager::_nil(),policies); - threadPol->destroy(); - PortableServer::POAManager_var mgr(_poa_for_request_control->the_POAManager()); - mgr->activate(); - //obj=orb->resolve_initial_references ("POACurrent");// agy : usage of POACurrent breaks the hold_requests. Why ? - //PortableServer::Current_var current(PortableServer::Current::_narrow(obj)); } -void RequestSwitcher::holdRequests() +SALOME::StringVec *RequestSwitcher::listVars() +{ + return _ds->listVars(); +} + +SALOME::ByteVec *RequestSwitcher::fetchSerializedContent(const char *varName) { - _poa_manager_under_control->hold_requests(true); + return _ds->fetchSerializedContent(varName); } -void RequestSwitcher::activeRequests() +void RequestSwitcher::fetchAndGetAccessOfVar(const char *varName, CORBA::String_out access, SALOME::ByteVec_out data) { - _poa_manager_under_control->activate(); + return _ds->fetchAndGetAccessOfVar(varName,access,data); } -DataScopeServerBase::DataScopeServerBase(CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName):_globals(0),_locals(0),_pickler(0),_orb(CORBA::ORB::_duplicate(orb)),_name(scopeName),_killer(killer) +DataScopeServerBase::DataScopeServerBase(const SALOME_CPythonHelper *pyHelper, CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName, SALOME_NamingService_Abstract *ns):_ns(ns),_pyHelper(pyHelper),_orb(CORBA::ORB::_duplicate(orb)),_name(scopeName),_killer(killer) { } -DataScopeServerBase::DataScopeServerBase(const DataScopeServerBase& other):omniServant(other),ServantBase(other),_globals(0),_locals(0),_pickler(0),_name(other._name),_vars(other._vars),_killer(other._killer) +DataScopeServerBase::DataScopeServerBase(const DataScopeServerBase& other):omniServant(other),ServantBase(other),_ns(other._ns->cloneCoVar()),_pyHelper(other._pyHelper),_name(other._name),_vars(other._vars),_killer(other._killer) { } DataScopeServerBase::~DataScopeServerBase() { - // _globals is borrowed ref -> do nothing - Py_XDECREF(_locals); - Py_XDECREF(_pickler); for(std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::const_iterator it=_vars.begin();it!=_vars.end();it++) { BasicDataServer *obj((*it).second); @@ -116,6 +89,7 @@ DataScopeServerBase::~DataScopeServerBase() obj->decrRef(); } } + delete _ns; } /*! @@ -140,13 +114,13 @@ SALOME::StringVec *DataScopeServerBase::listVars() { SALOME::StringVec *ret(new SALOME::StringVec); std::size_t sz(_vars.size()); - ret->length(sz); + ret->length((CORBA::ULong)sz); //!< TODO: size_t to CORBA::ULong std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::iterator it(_vars.begin()); for(std::size_t i=0;igetVarNameCpp()); - (*ret)[i]=CORBA::string_dup(name.c_str()); + (*ret)[(CORBA::ULong)i]=CORBA::string_dup(name.c_str()); //!< TODO: size_t to CORBA::ULong } return ret; } @@ -192,14 +166,13 @@ void DataScopeServerBase::deleteVar(const char *varName) CORBA::Boolean DataScopeServerBase::shutdownIfNotHostedByDSM(SALOME::DataScopeKiller_out killer) { - SALOME_NamingService ns(_orb); - CORBA::Object_var obj(ns.Resolve(DataServerManager::NAME_IN_NS)); + CORBA::Object_var obj(_ns->Resolve(DataServerManager::NAME_IN_NS)); SALOME::DataServerManager_var dsm(SALOME::DataServerManager::_narrow(obj)); if(CORBA::is_nil(dsm)) throw Exception("Unable to reach in the NS the unique DataServerManager instance of the Session !"); // destroy ref in the naming service std::string fullScopeName(SALOMESDS::DataServerManager::CreateAbsNameInNSFromScopeName(_name)); - ns.Destroy_Name(fullScopeName.c_str()); + _ns->Destroy_Name(fullScopeName.c_str()); // establish if dsm and this shared the same POA. If yes dsm and this are collocated ! PortableServer::ServantBase *ret(0); try @@ -257,26 +230,45 @@ SALOME::SeqOfByteVec *DataScopeServerBase::getAllKeysOfVarWithTypeDict(const cha } Py_ssize_t sz(PyList_Size(keys)); SALOME::SeqOfByteVec *ret(new SALOME::SeqOfByteVec); - ret->length(sz); + ret->length((CORBA::ULong)sz); //!< TODO: convert Py_ssize_t in CORBA::ULong for(Py_ssize_t i=0;ipickelize(item));//item consumed - PickelizedPyObjServer::FromCppToByteSeq(pickel,(*ret)[i]); + PickelizedPyObjServer::FromCppToByteSeq(pickel,(*ret)[(CORBA::ULong)i]); //!< TODO: convert Py_ssize_t in CORBA::ULong } Py_XDECREF(keys); return ret; } -SALOME::RequestSwitcher_ptr DataScopeServerBase::getRequestSwitcher() +SALOME::ByteVec *DataScopeServerBase::getValueOfVarWithTypeDict(const char *varName, const SALOME::ByteVec& constKey) { - if(_rs.isNull()) + BasicDataServer *var(retrieveVarInternal2(varName)); + PickelizedPyObjServer *varc(dynamic_cast(var)); + if(!varc) + { + std::ostringstream oss; oss << "DataScopeServerBase::getValueOfVarWithTypeDict : var \"" << varName << "\" exists but it is not serialized !"; + throw Exception(oss.str()); + } + if(!varc->isDict()) { - _rs=new RequestSwitcher(_orb); + std::ostringstream oss; oss << "DataScopeServerBase::getValueOfVarWithTypeDict : var \"" << varName << "\" exists but it is not a PyDict !"; + throw Exception(oss.str()); } - CORBA::Object_var obj(_rs->activate()); - return SALOME::RequestSwitcher::_narrow(obj); + // + std::string keyCpp; + PickelizedPyObjServer::FromByteSeqToCpp(constKey,keyCpp); + SALOME::AutoPyRef key(PickelizedPyObjServer::GetPyObjFromPickled(keyCpp,this)); + PyObject *value(PyDict_GetItem(varc->getPyObj(),key.get()));//borrowed + if(!value) + { + std::ostringstream oss; oss << "DataScopeServerBase::getValueOfVarWithTypeDict : var \"" << varName << "\" seems to not have key specified !"; + throw Exception(oss.str()); + } + Py_XINCREF(value); + std::string ret(PickelizedPyObjServer::Pickelize(value,this));//value is consumed + return PickelizedPyObjServer::FromCppToByteSeq(ret); } void DataScopeServerBase::takeANap(CORBA::Double napDurationInSec) @@ -297,44 +289,9 @@ void DataScopeServerBase::takeANap(CORBA::Double napDurationInSec) #endif } -void DataScopeServerBase::initializePython(int argc, char *argv[]) -{ - Py_Initialize(); - PyEval_InitThreads(); - wchar_t **changed_argv = new wchar_t*[argc]; // Setting arguments - for (int i = 0; i < argc; i++) - changed_argv[i] = Py_DecodeLocale(argv[i], NULL); - PySys_SetArgv(argc, changed_argv); - PyObject *mainmod(PyImport_AddModule("__main__")); - _globals=PyModule_GetDict(mainmod); - if(PyDict_GetItemString(_globals, "__builtins__") == NULL) - { - PyObject *bimod(PyImport_ImportModule("__builtin__")); - if (bimod == NULL || PyDict_SetItemString(_globals, "__builtins__", bimod) != 0) - Py_FatalError("can't add __builtins__ to __main__"); - Py_XDECREF(bimod); - } - _locals=PyDict_New(); - PyObject *tmp(PyList_New(0)); - _pickler=PyImport_ImportModuleLevel(const_cast("pickle"),_globals,_locals,tmp,0); -} - void DataScopeServerBase::registerToSalomePiDict() const { - PyObject *mod(PyImport_ImportModule("addToKillList"));//new value - if(!mod) - return; - PyObject *meth(PyObject_GetAttrString(mod,"addToKillList"));//new value - if(!meth) - { Py_XDECREF(mod); return ; } - PyObject *args(PyTuple_New(2)); - PyTuple_SetItem(args,0,PyLong_FromLong(getpid())); - PyTuple_SetItem(args,1,PyUnicode_FromString("SALOME_DataScopeServerBase")); - PyObject *res(PyObject_CallObject(meth,args)); - Py_XDECREF(args); - Py_XDECREF(res); - Py_XDECREF(meth); - Py_XDECREF(mod); + _pyHelper->registerToSalomePiDict("SALOME_DataScopeServerBase",getpid()); } void DataScopeServerBase::setPOA(PortableServer::POA_var poa) @@ -345,8 +302,7 @@ void DataScopeServerBase::setPOA(PortableServer::POA_var poa) void DataScopeServerBase::registerInNS(SALOME::DataScopeServerBase_ptr ptr) { std::string fullScopeName(SALOMESDS::DataServerManager::CreateAbsNameInNSFromScopeName(_name)); - SALOME_NamingService ns(_orb); - ns.Register(ptr,fullScopeName.c_str()); + _ns->Register(ptr,fullScopeName.c_str()); } std::string DataScopeServerBase::BuildTmpVarNameFrom(const std::string& varName) @@ -366,11 +322,16 @@ std::vector< std::string > DataScopeServerBase::getAllVarNames() const return ret; } -void DataScopeServerBase::checkNotAlreadyExistingVar(const std::string& varName) const +bool DataScopeServerBase::isExistingVar(const std::string& varName) const { std::vector allNames(getAllVarNames()); std::vector::iterator it(std::find(allNames.begin(),allNames.end(),varName)); - if(it!=allNames.end()) + return it!=allNames.end(); +} + +void DataScopeServerBase::checkNotAlreadyExistingVar(const std::string& varName) const +{ + if(isExistingVar(varName)) { std::ostringstream oss; oss << "DataScopeServerBase::checkNotAlreadyExistingVar : name \"" << varName << "\" already exists !"; throw Exception(oss.str()); @@ -446,8 +407,7 @@ void DataScopeServerBase::moveStatusOfVarFromRdExtOrRdExtInitToRdExtInit(const s throw Exception("DataScopeServerBase::moveStatusOfVarFromRdExtOrRdExtInitToRdExtInit : var is neither RdExt nor RdExtInit !"); if(varc0) { - PyObject *pyobj(varc0->getPyObj()); Py_XINCREF(pyobj); - PickelizedPyObjRdExtInitServer *newVar(new PickelizedPyObjRdExtInitServer(this,varName,pyobj)); + PickelizedPyObjRdExtInitServer *newVar(varc0->buildInitInstanceFrom(varName)); newVar->incrNbClients(); CORBA::Object_var obj(newVar->activate()); SALOME::BasicDataServer_var obj2(SALOME::BasicDataServer::_narrow(obj)); @@ -470,8 +430,7 @@ void DataScopeServerBase::moveStatusOfVarFromRdExtOrRdExtInitToRdExt(const std:: { if(varc0->decrNbClients()) { - PyObject *pyobj(varc0->getPyObj()); Py_XINCREF(pyobj); - PickelizedPyObjRdExtServer *newVar(new PickelizedPyObjRdExtServer(this,varName,pyobj)); + PickelizedPyObjRdExtServer *newVar(varc0->buildStdInstanceFrom(varName)); CORBA::Object_var obj(newVar->activate()); SALOME::BasicDataServer_var obj2(SALOME::BasicDataServer::_narrow(obj)); p.first=obj2; p.second=newVar; @@ -514,7 +473,7 @@ std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::iterat /////// -DataScopeServer::DataScopeServer(CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName):DataScopeServerBase(orb,killer,scopeName) +DataScopeServer::DataScopeServer(const SALOME_CPythonHelper *pyHelper, CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName, SALOME_NamingService_Abstract *ns):DataScopeServerBase(pyHelper,orb,killer,scopeName,ns) { } @@ -561,7 +520,7 @@ DataScopeServer::~DataScopeServer() //////// -DataScopeServerTransaction::DataScopeServerTransaction(CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName):DataScopeServerBase(orb,killer,scopeName) +DataScopeServerTransaction::DataScopeServerTransaction(const SALOME_CPythonHelper *pyHelper, CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName, SALOME_NamingService_Abstract *ns):DataScopeServerBase(pyHelper,orb,killer,scopeName,ns) { CORBA::Object_var obj(_orb->resolve_initial_references("RootPOA")); PortableServer::POA_var poa(PortableServer::POA::_narrow(obj)); @@ -622,6 +581,51 @@ void DataScopeServerTransaction::createRdExtVarInternal(const std::string& varNa _vars.push_back(p); } +void DataScopeServerTransaction::createRdExtVarFreeStyleInternal(const std::string& varName, const SALOME::ByteVec& constValue, std::string&& compareFuncContent, SALOME::AutoPyRef&& compareFunc) +{ + if(!isExistingVar(varName)) + { + PickelizedPyObjRdExtFreeStyleServer *tmp(new PickelizedPyObjRdExtFreeStyleServer(this,varName,constValue,std::move(compareFuncContent),std::move(compareFunc))); + CORBA::Object_var ret(tmp->activate()); + std::pair< SALOME::BasicDataServer_var, BasicDataServer * > p(SALOME::BasicDataServer::_narrow(ret),tmp); + _vars.push_back(p); + } + else + { + BasicDataServer *ds(retrieveVarInternal2(varName)); + if(!ds) + { + std::ostringstream oss; + oss << "DataScopeServerTransaction::createRdExtVarFreeStyleInternal : internal error 1 for varname \"" << varName << "\"!"; + throw Exception(oss.str()); + } + Sha1Keeper *ds2(dynamic_cast(ds)); + if(!ds2) + { + std::ostringstream oss; + oss << "DataScopeServerTransaction::createRdExtVarFreeStyleInternal : varname \"" << varName << "\" already exists with a non Sha1Keeper type !"; + throw Exception(oss.str()); + } + PickelizedPyObjServer *ds3(dynamic_cast(ds)); + if(!ds3) + { + std::ostringstream oss; + oss << "DataScopeServerTransaction::createRdExtVarFreeStyleInternal : varname \"" << varName << "\" already exists with a non PickelizedPyObjServer type !"; + throw Exception(oss.str()); + } + std::vector constValueAsCpp; + Transaction::FromByteSeqToVB(constValue,constValueAsCpp); + SALOME::AutoPyRef newObj(PickelizedPyObjServer::GetPyObjFromPickled(constValueAsCpp,this)); + if(newObj.isNull()) + { + std::ostringstream oss; + oss << "DataScopeServerTransaction::createRdExtVarFreeStyleInternal : varname \"" << varName << "\" already exists but input pickelized object is not loadable !"; + throw Exception(oss.str()); + } + ds2->checkSame(varName,compareFuncContent,ds3->getPyObj(),newObj); + } +} + void DataScopeServerTransaction::createRdExtInitVarInternal(const std::string& varName, const SALOME::ByteVec& constValue) { checkNotAlreadyExistingVar(varName); @@ -656,6 +660,13 @@ SALOME::Transaction_ptr DataScopeServerTransaction::createRdExtVarTransac(const return SALOME::Transaction::_narrow(obj); } +SALOME::Transaction_ptr DataScopeServerTransaction::createRdExtVarFreeStyleTransac(const char *varName, const SALOME::ByteVec& constValue, const char *compareFuncContent) +{// no check on varName done here. Will be done on perform + TransactionRdExtVarFreeStyleCreate *ret(new TransactionRdExtVarFreeStyleCreate(this,varName,constValue,compareFuncContent)); + CORBA::Object_var obj(ret->activate()); + return SALOME::Transaction::_narrow(obj); +} + SALOME::Transaction_ptr DataScopeServerTransaction::createRdExtInitVarTransac(const char *varName, const SALOME::ByteVec& constValue) { checkNotAlreadyExistingVar(varName); @@ -683,16 +694,25 @@ void DataScopeServerTransaction::pingKey(PyObject *keyObj) { std::size_t ii(0); // this part does nothing except to be sure that in notify key all will be OK. + PyObject *args(PyTuple_New(1)); + PyTuple_SetItem(args,0,keyObj); Py_XINCREF(keyObj); for(std::list< KeyWaiter *>::iterator it=_waiting_keys.begin();it!=_waiting_keys.end();it++,ii++) { PyObject *waitKey((*it)->getKeyPyObj()); - PyObject *res(PyObject_CallMethodObjArgs(keyObj, PyUnicode_DecodeASCII("__ne__", 6, NULL), waitKey)); + PyObject *meth(PyObject_GetAttrString(waitKey,"__eq__")); + if(!meth) + { + std::ostringstream oss; oss << "DataScopeServerTransaction::pingKey : for object id #" << ii << " no __eq__ in pyobj !"; + throw Exception(oss.str()); + } + PyObject *res(PyObject_CallObject(meth,args)); + Py_XDECREF(meth); if(res==NULL) { std::ostringstream oss; oss << "DataScopeServerTransaction::pingKey : for object id #" << ii << " error during cmp(k,wk[i]) !"; throw Exception(oss.str()); } - PyLong_AsLong(res); // res is bool, but it s ok since __int__ is called + PyBool_Check(res); if(PyErr_Occurred()) { std::ostringstream oss; oss << "DataScopeServerTransaction::pingKey : for object id #" << ii << " error during interpretation of cmp(k,wk[i]) !"; @@ -700,11 +720,14 @@ void DataScopeServerTransaction::pingKey(PyObject *keyObj) } Py_XDECREF(res); } + Py_XDECREF(args); } void DataScopeServerTransaction::notifyKey(const std::string& varName, PyObject *keyObj, PyObject *valueObj) { std::size_t ii(0); + PyObject *args(PyTuple_New(1)); + PyTuple_SetItem(args,0,keyObj); Py_XINCREF(keyObj); std::list< KeyWaiter *> newList,listOfEltToWakeUp; for(std::list< KeyWaiter *>::iterator it=_waiting_keys.begin();it!=_waiting_keys.end();it++,ii++) { @@ -714,24 +737,31 @@ void DataScopeServerTransaction::notifyKey(const std::string& varName, PyObject continue; } PyObject *waitKey((*it)->getKeyPyObj()); - PyObject *res(PyObject_CallMethodObjArgs(keyObj, PyUnicode_DecodeASCII("__ne__", 6, NULL), waitKey)); - if(res==NULL) - { - std::ostringstream oss; oss << "DataScopeServerTransaction::notifyKey : MAIN INTERNAL ERROR ! for object id #" << ii << " error during cmp(k,wk[i]) !"; - throw Exception(oss.str()); - } - long resCpp(PyLong_AsLong(res)); // res is bool, but it s ok since __int__ is called + PyObject *meth(PyObject_GetAttrString(waitKey,"__eq__")); + if(!meth) + { + std::ostringstream oss; oss << "DataScopeServerTransaction::pingKey : for object id #" << ii << " no __eq__ in pyobj !"; + throw Exception(oss.str()); + } + PyObject *res(PyObject_CallObject(meth,args)); + Py_XDECREF(meth); + if(!PyBool_Check(res)) + { + std::ostringstream oss; oss << "DataScopeServerTransaction::pingKey : for object id #" << ii << " no __eq__ in pyobj !"; + throw Exception(oss.str()); + } if(PyErr_Occurred()) { std::ostringstream oss; oss << "DataScopeServerTransaction::notifyKey : MAIN INTERNAL ERROR ! for object id #" << ii << " error during interpretation of cmp(k,wk[i]) !"; throw Exception(oss.str()); } - Py_XDECREF(res); - if(resCpp==0) + if(res==Py_True) listOfEltToWakeUp.push_back(*it); else newList.push_back(*it); + Py_XDECREF(res); } + Py_XDECREF(args); for(std::list< KeyWaiter *>::iterator it=listOfEltToWakeUp.begin();it!=listOfEltToWakeUp.end();it++) (*it)->valueJustCome(valueObj); for(std::list< KeyWaiter *>::iterator it=listOfEltToWakeUp.begin();it!=listOfEltToWakeUp.end();it++) @@ -827,7 +857,7 @@ SALOME::ByteVec *DataScopeServerTransaction::waitForMonoThrRev(SALOME::KeyWaiter KeyWaiter *retc(dynamic_cast(ret)); if(!retc) throw Exception("DataScopeServerTransaction::invokeMonoThr : internal error 1 !"); - retc->_remove_ref();// restore the counter afer _poa_for_key_waiter->reference_to_servant(kw) + retc->_remove_ref();// restore the counter after _poa_for_key_waiter->reference_to_servant(kw) SALOME::ByteVec *zeRet(retc->waitForMonoThr()); retc->enforcedRelease(); return zeRet; @@ -844,7 +874,7 @@ SALOME::ByteVec *DataScopeServerTransaction::waitForAndKill(SALOME::KeyWaiter_pt KeyWaiter *retc(dynamic_cast(ret)); if(!retc) throw Exception("DataScopeServerTransaction::invokeMonoThr : internal error 1 !"); - retc->_remove_ref();// restore the counter afer _poa_for_key_waiter->reference_to_servant(kw) + retc->_remove_ref();// restore the counter after _poa_for_key_waiter->reference_to_servant(kw) SALOME::ByteVec *zeRet(retc->waitForAndKill()); retc->enforcedRelease(); return zeRet; @@ -862,7 +892,7 @@ void DataScopeServerTransaction::atomicApply(const SALOME::ListOfTransaction& tr Transaction *elt(0); try { - eltBase=_poa->reference_to_servant(transactions[i]); + eltBase=_poa->reference_to_servant(transactions[(CORBA::ULong)i]); //!< TODO: size_t to CORBA::ULong elt=dynamic_cast(eltBase); } catch(...) @@ -895,3 +925,12 @@ DataScopeServerTransaction::~DataScopeServerTransaction() { } +SALOME::RequestSwitcher_ptr DataScopeServerTransaction::getRequestSwitcher() +{ + if(_rs.isNull()) + { + _rs=new RequestSwitcher(_orb,this); + } + CORBA::Object_var obj(_rs->activate()); + return SALOME::RequestSwitcher::_narrow(obj); +}