]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
First try
authorAnthony Geay <anthony.geay@edf.fr>
Thu, 9 Mar 2017 14:06:41 +0000 (15:06 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Thu, 9 Mar 2017 14:06:41 +0000 (15:06 +0100)
idl/SALOME_SDS.idl
src/SALOMESDS/SALOMESDS_DataScopeServer.cxx
src/SALOMESDS/SALOMESDS_DataScopeServer.hxx
src/SALOMESDS/SALOMESDS_KeyWaiter.cxx
src/SALOMESDS/SALOMESDS_KeyWaiter.hxx

index c5d7e288df843be1b35d38682d3eee865e991e48..24a707899834134cafc34785a708af7eba591f74 100644 (file)
@@ -130,6 +130,7 @@ module SALOME
     KeyWaiter waitForKeyInVarAndKillIt(in string varName, in ByteVec keyVal, out Transaction transac) raises (SALOME::SALOME_Exception);
     void atomicApply(in ListOfTransaction transactions) raises (SALOME::SALOME_Exception);
     ByteVec waitForMonoThrRev(in KeyWaiter kw) raises (SALOME::SALOME_Exception);
+    ByteVec waitForAndKill(in KeyWaiter kw) raises (SALOME::SALOME_Exception);
   };
 
   interface DataServerManager
index 92dae779437b24cf9b3ccfa80e2f2b559a42b5b0..ac4772586dec68428acb06ac9583db8891904918 100644 (file)
@@ -771,6 +771,23 @@ SALOME::ByteVec *DataScopeServerTransaction::waitForMonoThrRev(SALOME::KeyWaiter
   return zeRet;
 }
 
+SALOME::ByteVec *DataScopeServerTransaction::waitForAndKill(SALOME::KeyWaiter_ptr kw)
+{
+  PortableServer::ServantBase *ret(0);
+  try
+    {
+      ret=_poa_for_key_waiter->reference_to_servant(kw);// Warning ref cnt of ret has been incremented !
+    }
+  catch(...) { ret=0; }
+  KeyWaiter *retc(dynamic_cast<KeyWaiter *>(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)
+  SALOME::ByteVec *zeRet(retc->waitForAndKill());
+  retc->enforcedRelease();
+  return zeRet;
+}
+
 void DataScopeServerTransaction::atomicApply(const SALOME::ListOfTransaction& transactions)
 {
   std::size_t sz(transactions.length());
index 8f1e87e04c72fa3ee95796979600a83a620defd3..c814dd3ec18242247e7505f81d4d6bf7627fac37 100644 (file)
@@ -129,6 +129,7 @@ namespace SALOMESDS
     void pingKey(PyObject *keyObj);
     void notifyKey(const std::string& varName, PyObject *keyObj, PyObject *valueObj);
     SALOME::ByteVec *waitForMonoThrRev(SALOME::KeyWaiter_ptr kw);
+    SALOME::ByteVec *waitForAndKill(SALOME::KeyWaiter_ptr kw);
   public://remotely callable
     char *getAccessOfVar(const char *varName);
     void fetchAndGetAccessOfVar(const char *varName, CORBA::String_out access, SALOME::ByteVec_out data);
index ca951bcdace303d263138176845d7dc450f1faf0..076aec74547d11c24a0c677276a09ed1c01c4fc6 100644 (file)
@@ -97,6 +97,19 @@ SALOME::ByteVec *KeyWaiter::waitForMonoThr()
   return PickelizedPyObjServer::FromCppToByteSeq(st);
 }
 
+SALOME::ByteVec *KeyWaiter::waitForAndKill()
+{
+  if(!_ze_value)
+    throw Exception("KeyWaiter::waitForAndKill : no value ! invalid call of this method !");
+  Py_XINCREF(_ze_value);
+  std::string st(PickelizedPyObjServer::Pickelize(_ze_value,_var->getFather()));
+  //
+  if(PyDict_DelItem(_var->getPyObj(),_ze_key)!=0)
+    throw Exception("KeyWaiter::waitForAndKill : error during entry removal !");
+  //
+  return PickelizedPyObjServer::FromCppToByteSeq(st);
+}
+
 /*!
  * WARNING call this method before calling go !
  */
index 7f3eee1b02976684d049491a5fd3b84e8865169b..521ce705a302cebe4639d465f3dc998b44add267 100644 (file)
@@ -49,6 +49,7 @@ namespace SALOMESDS
     void go();
     std::string getVarName() const { return _var->getVarNameCpp(); }
     SALOME::ByteVec *waitForMonoThr();
+    SALOME::ByteVec *waitForAndKill();
   private:
     DataScopeServerTransaction *getDSS() const { return static_cast<DataScopeServerTransaction *>(_var->getFather()); }//thanks to dynamic_cast in constructor
   private: