X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGraphExecutor%2FDataFlowExecutor_PyDynInvoke.cxx;fp=src%2FGraphExecutor%2FDataFlowExecutor_PyDynInvoke.cxx;h=09dcf693056f7f8ed56b084e2ca18280e8e4d853;hb=7a8c8a266c74690ca0ecb1a593b74d3066dfb18f;hp=68211dadd9ae588aadae2d0d05cbb5600e5e35c3;hpb=c7f4a494ccbe30a7966b48996cfc63bed844d446;p=modules%2Fsuperv.git diff --git a/src/GraphExecutor/DataFlowExecutor_PyDynInvoke.cxx b/src/GraphExecutor/DataFlowExecutor_PyDynInvoke.cxx index 68211da..09dcf69 100644 --- a/src/GraphExecutor/DataFlowExecutor_PyDynInvoke.cxx +++ b/src/GraphExecutor/DataFlowExecutor_PyDynInvoke.cxx @@ -40,6 +40,15 @@ bool GraphExecutor::InNode::InitPython() { Py_InitModule( "InitPyRunMethod" , MethodPyRunMethod ) ; // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL //_OutNode->SuperVisionContainer()->ActivatePythonExecution( "InitPyRunMethod" , MethodPyRunMethod ) ; + + // PAL10310: patch on omniORB + string aPyFunc; + aPyFunc = "import omnipatch\n" ; + if ( PyRun_SimpleString( (char *) aPyFunc.c_str() ) ) { + cdebug << ThreadNo() << " " << Name() << " PyRun_SimpleString ERROR " << endl << aPyFunc << endl ; + Automaton()->PyUnLock() ; + return false ; + } } // PyObject * Dictionnary = PyModule_GetDict( Module ) ; // InitPyDynInvokeError = PyErr_NewException( "InitPyDynInvokeError" , NULL , NULL ) ; @@ -83,8 +92,9 @@ bool GraphExecutor::InNode::InitPython() { aPyFunc += "import sys\n" ; aPyFunc += "import CORBA\n" ; aPyFunc += "import omniORB\n" ; + aPyFunc += "orb = CORBA.ORB_init( sys.argv , CORBA.ORB_ID )\n" ; aPyFunc += "def PyObjRef( IORObjStr ) :\n" ; - aPyFunc += " orb = CORBA.ORB_init( sys.argv , CORBA.ORB_ID )\n" ; + // aPyFunc += " orb = CORBA.ORB_init( sys.argv , CORBA.ORB_ID )\n" ; aPyFunc += " objref = orb.string_to_object( IORObjStr )\n" ; aPyFunc += " return objref\n" ; aPyFunc += "InitPyRunMethod.RunMethod( PyObjRef )\n" ; @@ -109,8 +119,9 @@ bool GraphExecutor::InNode::InitPython() { aPyFunc += "import sys\n" ; aPyFunc += "import CORBA\n" ; aPyFunc += "import omniORB\n" ; + aPyFunc += "orb = CORBA.ORB_init( sys.argv , CORBA.ORB_ID )\n" ; aPyFunc += "def PyObjIor( ObjRef ) :\n" ; - aPyFunc += " orb = CORBA.ORB_init( sys.argv , CORBA.ORB_ID )\n" ; + // aPyFunc += " orb = CORBA.ORB_init( sys.argv , CORBA.ORB_ID )\n" ; aPyFunc += " objIor = orb.object_to_string( ObjRef )\n" ; aPyFunc += " return objIor\n" ; aPyFunc += "InitPyRunMethod.RunMethod( PyObjIor )\n" ; @@ -157,7 +168,21 @@ PyObject * GraphExecutor::InNode::InitPyDynInvoke( char * PyFuncName , if ( strlen( PyFuncName ) ) { Automaton()->PyLock() ; + thePyRunMethod = Automaton()->PyFunction( PyFuncName ) ; + + //thePyRunMethod = NULL; + // asv 28.02.05 : VERY BAD fix of the following problem: after change of a function, + // the changes are NOT taken into account by Automation - it returns PyObject of the OLD function. + // so here we force re-automating the PyObject EVERY TIME, regardless if the function has changed or not. + // Once again - it is a very bad solution, it fully discards the whole idea of automation, + // here is it done as a quick fix for a bug. + // A better solution (to be implemented): store the PyObject NOT in Automation map, but in + // InLine node itself! And if the method is changed - remove the PyObject and force to regenerate it. + // But this means that PyObject must be stored in Editor's data model. + // asv 01.03.05 : the fix is not needed, the described bug is not reproduced. To investigate: + // WHERE PyObject is removed from Automation map on function change. + if ( (*aPythonFunction).length() ) { if ( thePyRunMethod == NULL ) { unsigned int i ; @@ -261,9 +286,9 @@ bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod , PyObject * ArgsList = NULL ; PyObject * ArgValue = NULL ; PyObject * Result = NULL ; - PyObject * MyPyObjRefList = NULL ; + //PyObject * MyPyObjRefList = NULL ; PyObject * ResultObj = NULL ; - PyObject * MyPyObjIorList = NULL ; + //PyObject * MyPyObjIorList = NULL ; PyObject * ResultIor = NULL ; CORBA::Object_ptr ObjRef ; @@ -370,27 +395,27 @@ bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod , break ; } case CORBA::tk_objref : { - MyPyObjRefList = PyTuple_New( 1 ) ; - PyObject * ObjValue ; + //MyPyObjRefList = PyTuple_New( 1 ) ; + //PyObject * ObjValue ; #if OMNIORB_VERSION >= 4 data >>= (CORBA::Any::to_object ) ObjRef ; #else data >>= ObjRef ; #endif IORObjRef = ObjectToString( ObjRef ) ; - ObjValue = Py_BuildValue( "s" , IORObjRef ) ; - PyTuple_SetItem( MyPyObjRefList , 0 , ObjValue ) ; + //ObjValue = Py_BuildValue( "s" , IORObjRef ) ; + //PyTuple_SetItem( MyPyObjRefList , 0 , ObjValue ) ; #if PyDynInvokeTrace - cdebug << "ArgIn" << i << " : " << sname << " " << method << " " << " Value " << IORObjRef << " (objref) " - << MyPyObjRef->ob_refcnt << "/" << MyPyObjRefList->ob_refcnt << endl ; + cdebug << "ArgIn" << i << " : " << sname << " " << method << " " << " Value " << IORObjRef << " (objref) "<< endl ; + // << MyPyObjRef->ob_refcnt << "/" << MyPyObjRefList->ob_refcnt << endl ; #endif // ResultObj = PyEval_CallObject( MyPyObjRef , MyPyObjRefList ) ; - ResultObj = PyEvalCallObject( "PyObjRef" , MyPyObjRef , MyPyObjRefList ) ; + //ResultObj = PyEvalCallObject( "PyObjRef" , MyPyObjRef , MyPyObjRefList ) ; #if PyDynInvokeTrace - cdebug << "ObjValue->ob_refcnt" << ObjValue->ob_refcnt << endl ; + //cdebug << "ObjValue->ob_refcnt" << ObjValue->ob_refcnt << endl ; #endif - ArgValue = Py_BuildValue( "O" , ResultObj ) ; - PyTuple_SetItem( ArgsList , i , ArgValue ) ; + //ArgValue = Py_BuildValue( "O" , ResultObj ) ; + //PyTuple_SetItem( ArgsList , i , ArgValue ) ; #if PyDynInvokeTrace if ( ArgValue ) cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value (objref) ArgsList->ob_refcnt" @@ -398,22 +423,33 @@ bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod , else cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value (objref) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue is NULL" << endl ; - cdebug << "MyPyObjRefList->ob_refcnt " << MyPyObjRefList->ob_refcnt-1 << endl ; -#endif - Py_DECREF( MyPyObjRefList ) ; - if ( CORBA::is_nil( ObjRef ) ) { - ResultObj = NULL ; - } - else { -#if PyDynInvokeTrace - if ( ResultObj ) - cdebug << "ResultObj->ob_refcnt " << ResultObj->ob_refcnt-1 << endl ; - else - cdebug << "ResultObj is NULL" << endl ; -#endif - if ( ResultObj ) - Py_DECREF( ResultObj ) ; - } + //cdebug << "MyPyObjRefList->ob_refcnt " << MyPyObjRefList->ob_refcnt-1 << endl ; +#endif + ResultObj = PyObject_CallFunction( MyPyObjRef , "s",IORObjRef ) ; + if(ResultObj == NULL){ + PyErr_Print(); + ResultObj=Py_None; + Py_INCREF(ResultObj) ; + } + PyTuple_SetItem( ArgsList , i , ResultObj ) ; + cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value (objref) ArgsList->ob_refcnt" + << ArgsList->ob_refcnt << " ArgValue->ob_refcnt" << ResultObj->ob_refcnt << endl ; +// << ArgsList->ob_refcnt << " ArgValue->ob_refcnt" << ArgValue->ob_refcnt << endl ; + //cdebug << "MyPyObjRefList->ob_refcnt " << MyPyObjRefList->ob_refcnt-1 << endl ; + //Py_DECREF( MyPyObjRefList ) ; + //if ( CORBA::is_nil( ObjRef ) ) { + // ResultObj = NULL ; + //} + //else { + //#if PyDynInvokeTrace + //if ( ResultObj ) + //cdebug << "ResultObj->ob_refcnt " << ResultObj->ob_refcnt-1 << endl ; + //else + //cdebug << "ResultObj is NULL" << endl ; + //#endif + //if ( ResultObj ) + //Py_DECREF( ResultObj ) ; + //} break ; } default : { @@ -432,6 +468,7 @@ bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod , if ( Result == NULL ) { cdebug_out << "GraphExecutor::InNode::PyDynInvoke Node " << Name() << " " << method << " Error Result == NULL" << endl ; + PyErr_Print(); RetVal = false ; } else { @@ -617,7 +654,7 @@ bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod , } case CORBA::tk_objref : { PyObject * ObjIor ; - MyPyObjIorList = PyTuple_New( 1 ) ; + //MyPyObjIorList = PyTuple_New( 1 ) ; if ( PyTuple_Check( Result ) ) { ObjIor = PyTuple_GetItem( Result , i ) ; } @@ -629,21 +666,22 @@ bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod , << " Result->ob_refcnt" << Result->ob_refcnt << " ObjIor->ob_refcnt" << ObjIor->ob_refcnt << endl ; #endif - Py_INCREF( ObjIor ) ; + //Py_INCREF( ObjIor ) ; // PyObject_Print( ObjIor , stdout , 0 ) ; - PyTuple_SetItem( MyPyObjIorList , 0 , ObjIor ) ; + //PyTuple_SetItem( MyPyObjIorList , 0 , ObjIor ) ; // ResultIor = PyEval_CallObject( MyPyObjIor , MyPyObjIorList ) ; - ResultIor = PyEvalCallObject( "PyObjIor" , MyPyObjIor , MyPyObjIorList ) ; + //ResultIor = PyEvalCallObject( "PyObjIor" , MyPyObjIor , MyPyObjIorList ) ; + ResultIor = PyObject_CallFunction( MyPyObjIor , "O",ObjIor ) ; #if PyDynInvokeTrace cdebug << "ObjIor->ob_refcnt " << ObjIor->ob_refcnt-1 << endl ; #endif - Py_DECREF( ObjIor ) ; + //Py_DECREF( ObjIor ) ; #if PyDynInvokeTrace - cdebug << "MyPyObjIorList->ob_refcnt " << MyPyObjIorList->ob_refcnt-1 << endl ; + //cdebug << "MyPyObjIorList->ob_refcnt " << MyPyObjIorList->ob_refcnt-1 << endl ; #endif - Py_DECREF( MyPyObjIorList ) ; + //Py_DECREF( MyPyObjIorList ) ; #if PyDynInvokeTrace - cdebug << "MyPyObjIor->ob_refcnt " << MyPyObjIor->ob_refcnt << endl ; + //cdebug << "MyPyObjIor->ob_refcnt " << MyPyObjIor->ob_refcnt << endl ; #endif if ( ResultIor ) { char * IOR = NULL ; @@ -710,7 +748,8 @@ bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod , } } else { - cdebug_out << "GraphExecutor::InNode::PyDynInvoke Error ResultIor == NULL Node " + PyErr_Print(); + cdebug_out << "GraphExecutor::InNode::PyDynInvoke Error ResultIor == NULL Node " << Name() << " method " << method << " " << endl ; RetVal = false ; } @@ -777,6 +816,9 @@ bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod , Py_DECREF( ArgsList ) ; } + fflush(stdout); + fflush(stderr); + #if 0 { int i ;