Salome HOME
fix DistributedPythonNode input an output serialization via CORBA
authorPaul RASCLE <paul.rascle@edf.fr>
Wed, 10 Jan 2018 22:43:48 +0000 (23:43 +0100)
committerPaul RASCLE <paul.rascle@edf.fr>
Wed, 10 Jan 2018 22:44:21 +0000 (23:44 +0100)
src/runtime/DistributedPythonNode.cxx

index bf78b6d30d9f462f34ba995814133d778b86f76f..c1940e1dc47ce5d934259275fe9aafbfea5cc70c 100644 (file)
@@ -180,11 +180,12 @@ void DistributedPythonNode::execute()
         PyTuple_SetItem(args,pos,ob);
       }
     PyObject *serializationInput=PyObject_CallObject(_pyfuncSer,args);
-    std::string serializationInputC=PyBytes_AsString(serializationInput);
+    Py_ssize_t len = PyBytes_Size(serializationInput);
+    char* serializationInputC = PyBytes_AsString(serializationInput);
+    //int ret = PyBytes_AsStringAndSize(serializationInput, &serializationInputC, &len);
     serializationInputCorba=new Engines::pickledArgs;
-    int len=serializationInputC.length();
-    serializationInputCorba->length(serializationInputC.length());
-    for(int i=0;i<serializationInputC.length();i++)
+    serializationInputCorba->length(len+1);
+    for(int i=0;i<len+1;i++)
       (*serializationInputCorba)[i]=serializationInputC[i];
     Py_DECREF(serializationInput);
   }
@@ -208,15 +209,25 @@ void DistributedPythonNode::execute()
   resultCorbaC[resultCorba->length()]='\0';
   for(int i=0;i<resultCorba->length();i++)
     resultCorbaC[i]=(*resultCorba)[i];
+  int lenResCorba=resultCorba->length();
   delete resultCorba;
   {
     AutoGIL agil;
     args = PyTuple_New(1);
-    PyObject* resultPython=PyBytes_FromString(resultCorbaC);
+    //PyObject* resultPython=PyBytes_FromString(resultCorbaC);
+    PyObject* resultPython=PyBytes_FromStringAndSize(resultCorbaC,lenResCorba);
     delete [] resultCorbaC;
     PyTuple_SetItem(args,0,resultPython);
     PyObject *finalResult=PyObject_CallObject(_pyfuncUnser,args);
     DEBTRACE( "-----------------DistributedPythonNode::outputs-----------------" );
+    if(finalResult == NULL)
+      {
+        std::stringstream msg;
+        msg << "Conversion with pickle of output ports failed !";
+        msg << " : " << __FILE__ << ":" << __LINE__;
+        _errorDetails=msg.str();
+        throw YACS::ENGINE::ConversionException(msg.str());
+      }
     int nres=1;
     if(finalResult == Py_None)
       nres=0;