class AutoPyRef
{
public:
- AutoPyRef(PyObject *pyobj=0):_pyobj(pyobj) { }
+ AutoPyRef(PyObject *pyobj=nullptr):_pyobj(pyobj) { }
~AutoPyRef() { release(); }
AutoPyRef(const AutoPyRef& other):_pyobj(other._pyobj) { if(_pyobj) Py_XINCREF(_pyobj); }
AutoPyRef& operator=(const AutoPyRef& other) { if(_pyobj==other._pyobj) return *this; release(); _pyobj=other._pyobj; Py_XINCREF(_pyobj); return *this; }
}
//
std::unique_ptr<Engines::pickledArgs> serializationInputCorba(new Engines::pickledArgs);
+ AutoPyRef serializationInput;
{
AutoGIL agil;
PyObject *args(0),*ob(0);
PyObject_Print(args,stderr,Py_PRINT_RAW);
std::cerr << endl;
#endif
- PyObject *serializationInput(PyObject_CallFunctionObjArgs(_pyfuncSer,args,NULL));
+ serializationInput.set(PyObject_CallFunctionObjArgs(_pyfuncSer,args,nullptr));
Py_DECREF(args);
//The pickled string may contain NULL characters so use PyString_AsStringAndSize
char *serializationInputC(0);
Py_ssize_t len;
if (PyBytes_AsStringAndSize(serializationInput, &serializationInputC, &len))
throw Exception("DistributedPythonNode problem in python pickle");
- serializationInputCorba->length(len);
- for(int i=0; i < len ; i++)
- (*serializationInputCorba.get())[i]=serializationInputC[i];
- Py_DECREF(serializationInput);
+ // no copy here. The C byte array of Python is taken as this into CORBA sequence to avoid copy
+ serializationInputCorba.reset(new Engines::pickledArgs(len,len,reinterpret_cast<CORBA::Octet *>(serializationInputC),0));
}
//get the list of output argument names
try
{
//pass outargsname and dict serialized
- resultCorba=_pynode->execute(myseq,*(serializationInputCorba.get()));
+ _pynode->executeFirst(*(serializationInputCorba.get()));
+ //serializationInput and serializationInputCorba are no more needed for server. Release it.
+ serializationInputCorba.reset(nullptr); serializationInput.set(nullptr);
+ resultCorba=_pynode->executeSecond(myseq);
}
catch( const SALOME::SALOME_Exception& ex )
{
{
_pynode->UnRegister();
}
- serializationInputCorba.reset(nullptr);
_pynode = Engines::PyScriptNode::_nil();
//
bool dummy;