1 // SUPERV GraphExecutor : contains classes that permit execution of graphs and particularly the execution automaton
3 // Copyright (C) 2003 CEA/DEN, EDF R&D
7 // File : DataFlowExecutor_PyDynInvoke.cxx
8 // Author : Jean Rahuel, CEA
17 #include "DataFlowExecutor_InNode.hxx"
18 #include "DataFlowExecutor_OutNode.hxx"
20 using namespace CORBA ;
22 extern GraphExecutor::FiniteStateMachine * theAutomaton ;
24 //static PyObject * MyPyObjSignal = NULL ;
25 static PyObject * MyPyObjRef = NULL ;
26 static PyObject * MyPyObjIor = NULL ;
27 static PyObject * MyPyRunMethod = NULL ;
29 static PyMethodDef MethodPyRunMethod[] = {
30 { "RunMethod", PyRunMethod, METH_VARARGS },
34 bool GraphExecutor::InNode::InitPython() {
35 cdebug_in << "InitPython" << endl ;
37 Automaton()->PyLock() ;
38 // PyObject * Module = Py_InitModule( "InitPyRunMethod" , MethodPyRunMethod ) ;
39 if ( !Automaton()->PyInitModule() ) {
40 Py_InitModule( "InitPyRunMethod" , MethodPyRunMethod ) ;
41 // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL
42 //_OutNode->SuperVisionContainer()->ActivatePythonExecution( "InitPyRunMethod" , MethodPyRunMethod ) ;
44 // PyObject * Dictionnary = PyModule_GetDict( Module ) ;
45 // InitPyDynInvokeError = PyErr_NewException( "InitPyDynInvokeError" , NULL , NULL ) ;
46 // PyDict_SetItemString( Dictionnary , InitPyDynInvokeError ) ;
47 cdebug << ThreadNo() << "Py_Initialized() " << endl ;
50 //JR : Python documentation says that there is no sense to set a handler of synchronous
51 // signals as SIGSEGV and SIGFPE !!!
52 if ( Automaton()->PyFunction( "PyObjSignal" ) == NULL ) {
54 aPyFunc = "import signal\n" ;
55 aPyFunc += "import InitPyRunMethod\n" ;
56 aPyFunc += "import sys\n" ;
57 aPyFunc += "import CORBA\n" ;
58 aPyFunc += "import omniORB\n" ;
59 aPyFunc += "def PySignalHandler( aSignal , aStackFrame ) :\n" ;
60 aPyFunc += " print 'PySignalHandler(aSignal =',aSignal,',aStackFrame= ',aStackFrame,')'\n" ;
61 aPyFunc += "InitPyRunMethod.RunMethod( PySignalHandler )\n" ;
62 aPyFunc += "PrevHandler = signal.signal( signal.SIGSEGV , PySignalHandler )\n" ;
63 aPyFunc += "print 'PyObjSignal PrevHandler of SIGSEGV :', PrevHandler\n" ;
64 aPyFunc += "print 'PyObjSignal actual handler of SIGSEGV :', signal.getsignal( signal.SIGSEGV )\n" ;
65 // if ( PyRun_SimpleString( (char *) aPyFunc.c_str() ) ) {
66 if ( PyRunSimpleString( (char *) aPyFunc.c_str() ) ) {
67 cdebug << ThreadNo() << " " << Name() << " PyRun_SimpleString ERROR " << endl << aPyFunc << endl ;
68 Automaton()->PyUnLock() ;
71 MyPyObjSignal = MyPyRunMethod ;
72 Automaton()->PyFunction( "PyObjSignal" , MyPyObjSignal ) ;
75 MyPyObjSignal = Automaton()->PyFunction( "PyObjSignal" ) ;
79 // PyObjRef convert an IOR (string) to an Python ObjectReference
80 if ( Automaton()->PyFunction( "PyObjRef" ) == NULL ) {
82 aPyFunc = "import InitPyRunMethod\n" ;
83 aPyFunc += "import sys\n" ;
84 aPyFunc += "import CORBA\n" ;
85 aPyFunc += "import omniORB\n" ;
86 aPyFunc += "def PyObjRef( IORObjStr ) :\n" ;
87 aPyFunc += " orb = CORBA.ORB_init( sys.argv , CORBA.ORB_ID )\n" ;
88 aPyFunc += " objref = orb.string_to_object( IORObjStr )\n" ;
89 aPyFunc += " return objref\n" ;
90 aPyFunc += "InitPyRunMethod.RunMethod( PyObjRef )\n" ;
91 if ( PyRun_SimpleString( (char *) aPyFunc.c_str() ) ) {
92 // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL
93 //if ( PyRunSimpleString( (char *) aPyFunc.c_str() ) ) {
94 cdebug << ThreadNo() << " " << Name() << " PyRun_SimpleString ERROR " << endl << aPyFunc << endl ;
95 Automaton()->PyUnLock() ;
98 MyPyObjRef = MyPyRunMethod ;
99 Automaton()->PyFunction( "PyObjRef" , MyPyObjRef ) ;
102 MyPyObjRef = Automaton()->PyFunction( "PyObjRef" ) ;
105 // PyObjRef convert an Python ObjectReference to an IOR (string)
106 if ( Automaton()->PyFunction( "PyObjIor" ) == NULL ) {
108 aPyFunc = "import InitPyRunMethod\n" ;
109 aPyFunc += "import sys\n" ;
110 aPyFunc += "import CORBA\n" ;
111 aPyFunc += "import omniORB\n" ;
112 aPyFunc += "def PyObjIor( ObjRef ) :\n" ;
113 aPyFunc += " orb = CORBA.ORB_init( sys.argv , CORBA.ORB_ID )\n" ;
114 aPyFunc += " objIor = orb.object_to_string( ObjRef )\n" ;
115 aPyFunc += " return objIor\n" ;
116 aPyFunc += "InitPyRunMethod.RunMethod( PyObjIor )\n" ;
117 if ( PyRun_SimpleString( (char *) aPyFunc.c_str() ) ) {
118 // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL
119 //if ( PyRunSimpleString( (char *) aPyFunc.c_str() ) ) {
120 cdebug << ThreadNo() << " " << Name() << " PyRun_SimpleString ERROR " << endl << aPyFunc << endl ;
121 Automaton()->PyUnLock() ;
124 MyPyObjIor = MyPyRunMethod ;
125 Automaton()->PyFunction( "PyObjIor" , MyPyObjIor ) ;
128 MyPyObjIor = Automaton()->PyFunction( "PyObjIor" ) ;
130 Automaton()->PyUnLock() ;
132 cdebug_out << "InitPython" << endl ;
137 void GraphExecutor::InNode::RemovePyDynInvoke( char * PyFuncName ) {
138 // Automaton()->PyLock() ; // Already done ...
139 if ( Automaton()->ErasePyFunction( PyFuncName ) ) {
140 cdebug << "InNode::RemovePyDynInvoke( " << PyFuncName << " ) success" << endl ;
143 cdebug << "InNode::RemovePyDynInvoke( " << PyFuncName << " ) ERROR failed" << endl ;
145 // Automaton()->PyUnLock() ;
148 PyObject * GraphExecutor::InNode::InitPyDynInvoke( char * PyFuncName ,
149 const SUPERV::ListOfStrings * aPythonFunction ,
154 PyObject * thePyRunMethod = NULL ;
156 cdebug_in << "InitPyDynInvoke '" << PyFuncName << "' length " << (*aPythonFunction).length() << endl ;
158 if ( strlen( PyFuncName ) ) {
159 Automaton()->PyLock() ;
160 thePyRunMethod = Automaton()->PyFunction( PyFuncName ) ;
161 if ( (*aPythonFunction).length() ) {
162 if ( thePyRunMethod == NULL ) {
164 aPyFunc += "import InitPyRunMethod\n" ;
165 for ( i = 0 ; i < (*aPythonFunction).length() ; i++ ) {
166 aPyFunc += (*aPythonFunction)[ i ] ;
169 aPyFunc += "InitPyRunMethod.RunMethod( " ;
170 aPyFunc += PyFuncName ;
172 /*cdebug *///cout<< "InitPyDynInvoke PyRun_SimpleString " << endl << aPyFunc << endl ;
173 // if ( PyRun_SimpleString( (char *) aPyFunc.c_str() ) ) {
174 if ( PyRunSimpleString( (char *) aPyFunc.c_str() ) ) {
175 cdebug << ThreadNo() << " " << Name() << " PyRunSimpleString ERROR " << endl << aPyFunc << endl ;
176 PyFuncRunned( false ) ;
181 PyFuncRunned( true ) ;
182 thePyRunMethod = MyPyRunMethod ;
184 Automaton()->PyFunction( PyFuncName , thePyRunMethod ) ;
185 cdebug << ThreadNo() << "PyRunSimpleString( " << (*aPythonFunction)[ 0 ] << " ) " << endl ;
189 Automaton()->PyUnLock() ;
190 cdebug_out << "InitPyDynInvoke '" << PyFuncName << "' thePyRunMethod " << thePyRunMethod << " "
191 << thePyRunMethod->ob_refcnt << endl ;
192 return thePyRunMethod ;
195 else if ( thePyRunMethod ) {
196 Automaton()->PyUnLock() ;
197 cdebug_out << "InitPyDynInvoke '" << PyFuncName << "' thePyRunMethod " << thePyRunMethod << " "
198 << thePyRunMethod->ob_refcnt << endl ;
199 return thePyRunMethod ;
201 Automaton()->PyUnLock() ;
204 cdebug_out << "InitPyDynInvoke '" << PyFuncName << "' thePyRunMethod Null Err " << Err << endl ;
209 extern "C" PyObject * PyRunMethod( PyObject * dummy , PyObject * Args ) {
210 PyObject * Result = NULL ;
211 PyObject * Temp = NULL ;
212 if ( PyArg_ParseTuple( Args , "O:set_callback" , & Temp ) ) {
213 // cout << "PyArg_ParsedTuple" << endl ;
214 if ( !PyCallable_Check( Temp ) ) {
215 // PyErr_SetString( PyExc_TypeError , "PyRunMethod must be callable" ) ;
216 // cout << "PyRunMethod must be callable" << endl ;
220 Py_XDECREF( MyPyRunMethod ) ;
221 MyPyRunMethod = Temp ;
222 Py_INCREF( Py_None ) ;
228 #define PyDynInvokeTrace 1
229 bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod ,
231 ServicesAnyData * InParametersList , int nInParams ,
232 ServicesAnyData * OutParametersList , int nOutParams ) {
240 cdebug_in << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
241 << " method " << method
242 << " InParametersList " << InParametersList
243 << " OutParametersList " << OutParametersList
244 << " " << nInParams << " InArgs " << nOutParams
245 << " OutArgs MyPyRunMethod " ;
247 if ( MyPyRunMethod ) {
249 cdebug << MyPyRunMethod << " " << MyPyRunMethod->ob_refcnt << endl ;
254 cdebug << " NULL" << endl ;
261 PyObject * ArgsList = NULL ;
262 PyObject * ArgValue = NULL ;
263 PyObject * Result = NULL ;
264 PyObject * MyPyObjRefList = NULL ;
265 PyObject * ResultObj = NULL ;
266 PyObject * MyPyObjIorList = NULL ;
267 PyObject * ResultIor = NULL ;
269 CORBA::Object_ptr ObjRef ;
273 if ( !PyCallable_Check( MyPyRunMethod ) ) {
278 ArgsList = PyTuple_New( nInParams ) ;
280 for ( i = 0 ; i < nInParams ; i++ ) {
281 data = InParametersList[i].Value ;
282 sname = InParametersList[i].Name.c_str() ;
283 switch ( data.type()->kind() ) {
284 case CORBA::tk_string : {
287 PyObject * ArgValue = Py_BuildValue( "s" , t ) ;
288 PyTuple_SetItem( ArgsList , i , ArgValue ) ;
290 cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << t << " (string) "
291 << " ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
292 << ArgValue->ob_refcnt << endl ;
296 case CORBA::tk_boolean : {
298 data >>= (CORBA::Any::to_boolean ) b ;
299 PyObject * ArgValue = Py_BuildValue( "b" , b ) ;
300 PyTuple_SetItem( ArgsList , i , ArgValue ) ;
302 cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << b
303 << " (boolean) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
304 << ArgValue->ob_refcnt << endl ;
308 case CORBA::tk_char : {
310 data >>= (CORBA::Any::to_char ) c ;
311 PyObject * ArgValue = Py_BuildValue( "c" , c ) ;
312 PyTuple_SetItem( ArgsList , i , ArgValue ) ;
314 cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << c
315 << " (char) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
316 << ArgValue->ob_refcnt << endl ;
320 case CORBA::tk_short : {
323 PyObject * ArgValue = Py_BuildValue( "h" , s ) ;
324 PyTuple_SetItem( ArgsList , i , ArgValue ) ;
326 cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << s
327 << " (short) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
328 << ArgValue->ob_refcnt << endl ;
332 case CORBA::tk_long : {
335 PyObject * ArgValue = Py_BuildValue( "l" , l ) ;
337 cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << l
338 << " ArgValue->ob_refcnt" << ArgValue->ob_refcnt << endl ;
340 PyTuple_SetItem( ArgsList , i , ArgValue ) ;
342 cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << l
343 << " (long) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
344 << ArgValue->ob_refcnt << endl ;
348 case CORBA::tk_float : {
351 PyObject * ArgValue = Py_BuildValue( "f" , f ) ;
352 PyTuple_SetItem( ArgsList , i , ArgValue ) ;
354 cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << f
355 << " (float) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
356 << ArgValue->ob_refcnt << endl ;
360 case CORBA::tk_double : {
363 PyObject * ArgValue = Py_BuildValue( "d" , d ) ;
364 PyTuple_SetItem( ArgsList , i , ArgValue ) ;
366 cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << d
367 << " (double) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
368 << ArgValue->ob_refcnt << endl ;
372 case CORBA::tk_objref : {
373 MyPyObjRefList = PyTuple_New( 1 ) ;
374 PyObject * ObjValue ;
375 #if OMNIORB_VERSION >= 4
376 data >>= (CORBA::Any::to_object ) ObjRef ;
380 IORObjRef = ObjectToString( ObjRef ) ;
381 ObjValue = Py_BuildValue( "s" , IORObjRef ) ;
382 PyTuple_SetItem( MyPyObjRefList , 0 , ObjValue ) ;
384 cdebug << "ArgIn" << i << " : " << sname << " " << method << " " << " Value " << IORObjRef << " (objref) "
385 << MyPyObjRef->ob_refcnt << "/" << MyPyObjRefList->ob_refcnt << endl ;
387 // ResultObj = PyEval_CallObject( MyPyObjRef , MyPyObjRefList ) ;
388 ResultObj = PyEvalCallObject( "PyObjRef" , MyPyObjRef , MyPyObjRefList ) ;
390 cdebug << "ObjValue->ob_refcnt" << ObjValue->ob_refcnt << endl ;
392 ArgValue = Py_BuildValue( "O" , ResultObj ) ;
393 PyTuple_SetItem( ArgsList , i , ArgValue ) ;
396 cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value (objref) ArgsList->ob_refcnt"
397 << ArgsList->ob_refcnt << " ArgValue->ob_refcnt" << ArgValue->ob_refcnt << endl ;
399 cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value (objref) ArgsList->ob_refcnt"
400 << ArgsList->ob_refcnt << " ArgValue is NULL" << endl ;
401 cdebug << "MyPyObjRefList->ob_refcnt " << MyPyObjRefList->ob_refcnt-1 << endl ;
403 Py_DECREF( MyPyObjRefList ) ;
404 if ( CORBA::is_nil( ObjRef ) ) {
410 cdebug << "ResultObj->ob_refcnt " << ResultObj->ob_refcnt-1 << endl ;
412 cdebug << "ResultObj is NULL" << endl ;
415 Py_DECREF( ResultObj ) ;
420 cdebug << "ArgIn" << i << " : " << sname << " Value " << "(other ERROR)" << endl ;
425 // Result = PyEval_CallObject( MyPyRunMethod , ArgsList ) ;
426 Result = PyEvalCallObject( method , MyPyRunMethod , ArgsList ) ;
429 cdebug << "ArgsList->ob_refcnt" << ArgsList->ob_refcnt << endl ;
432 if ( Result == NULL ) {
433 cdebug_out << "GraphExecutor::InNode::PyDynInvoke Node " << Name() << " " << method << " Error Result == NULL"
438 for ( i = 0 ; i < nOutParams ; i++ ) {
439 data = OutParametersList[i].Value ;
440 sname = OutParametersList[i].Name.c_str() ;
441 switch ( data.type()->kind() ) {
442 case CORBA::tk_string : {
444 PyObject * ArgValue ;
445 if ( PyTuple_Check( Result ) ) {
446 ArgValue = PyTuple_GetItem( Result , i ) ;
451 if ( !PyString_Check( ArgValue ) ) {
452 cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (string)" << endl ;
456 t = PyString_AsString( ArgValue ) ;
460 cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << t << " (string)"
461 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
462 << ArgValue->ob_refcnt << endl ;
466 case CORBA::tk_boolean : {
468 PyObject * ArgValue ;
469 if ( PyTuple_Check( Result ) ) {
470 ArgValue = PyTuple_GetItem( Result , i ) ;
475 if ( !PyInt_Check( ArgValue ) ) {
476 cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (boolean)" << endl ;
480 b = PyInt_AsLong( ArgValue ) ;
482 data <<= (CORBA::Any::from_boolean ) b ;
484 cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << b << " (boolean)"
485 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
486 << ArgValue->ob_refcnt << endl ;
490 case CORBA::tk_char : {
491 unsigned char c = 0 ;
492 PyObject * ArgValue ;
493 if ( PyTuple_Check( Result ) ) {
494 ArgValue = PyTuple_GetItem( Result , i ) ;
499 //JR 04.04.2005 Debug if ( !PyInt_Check( ArgValue ) ) {
500 //Difficult to understand that behavior ... Python char type is a string of length 1 !
501 // or type is int ...
502 if ( !PyString_Check( ArgValue ) && !PyInt_Check( ArgValue ) ) {
503 cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (char)" << endl ;
507 c = PyInt_AsLong( ArgValue ) ;
509 data <<= (CORBA::Any::from_char ) c ;
511 cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << c << " (char)"
512 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
513 << ArgValue->ob_refcnt << endl ;
517 case CORBA::tk_short : {
519 PyObject * ArgValue ;
520 if ( PyTuple_Check( Result ) ) {
521 ArgValue = PyTuple_GetItem( Result , i ) ;
526 if ( !PyInt_Check( ArgValue ) ) {
527 cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (short)" << endl ;
531 s = PyInt_AsLong( ArgValue ) ;
535 cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << s << " (short)"
536 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
537 << ArgValue->ob_refcnt << endl ;
541 case CORBA::tk_long : {
543 PyObject * ArgValue ;
544 if ( PyTuple_Check( Result ) ) {
545 ArgValue = PyTuple_GetItem( Result , i ) ;
550 if ( PyLong_Check( ArgValue ) ) {
551 l = PyLong_AsLong( ArgValue ) ;
553 else if ( PyInt_Check( ArgValue ) ) {
554 l = PyInt_AsLong( ArgValue ) ;
557 cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (CORBA::tk_long)" << endl ;
562 cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << l << " (long)"
563 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
564 << ArgValue->ob_refcnt << endl ;
568 case CORBA::tk_float : {
570 PyObject * ArgValue ;
571 if ( PyTuple_Check( Result ) ) {
572 ArgValue = PyTuple_GetItem( Result , i ) ;
577 if ( !PyFloat_Check( ArgValue ) ) {
578 cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (float)" << endl ;
582 f = PyFloat_AsDouble( ArgValue ) ;
584 data.replace(CORBA::TypeCode::PR_float_tc(), (void*)(&f));
587 cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << f << " (float)"
588 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
589 << ArgValue->ob_refcnt << endl ;
593 case CORBA::tk_double : {
595 PyObject * ArgValue ;
596 if ( PyTuple_Check( Result ) ) {
597 ArgValue = PyTuple_GetItem( Result , i ) ;
602 if ( !PyFloat_Check( ArgValue ) ) {
603 cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (double)" << endl ;
607 d = PyFloat_AsDouble( ArgValue ) ;
609 data.replace(CORBA::TypeCode::PR_double_tc(), (void*)(&d));
612 cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << d << " (double)"
613 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
614 << ArgValue->ob_refcnt << endl ;
618 case CORBA::tk_objref : {
620 MyPyObjIorList = PyTuple_New( 1 ) ;
621 if ( PyTuple_Check( Result ) ) {
622 ObjIor = PyTuple_GetItem( Result , i ) ;
628 cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << "(object reference) "
629 << " Result->ob_refcnt" << Result->ob_refcnt << " ObjIor->ob_refcnt"
630 << ObjIor->ob_refcnt << endl ;
632 Py_INCREF( ObjIor ) ;
633 // PyObject_Print( ObjIor , stdout , 0 ) ;
634 PyTuple_SetItem( MyPyObjIorList , 0 , ObjIor ) ;
635 // ResultIor = PyEval_CallObject( MyPyObjIor , MyPyObjIorList ) ;
636 ResultIor = PyEvalCallObject( "PyObjIor" , MyPyObjIor , MyPyObjIorList ) ;
638 cdebug << "ObjIor->ob_refcnt " << ObjIor->ob_refcnt-1 << endl ;
640 Py_DECREF( ObjIor ) ;
642 cdebug << "MyPyObjIorList->ob_refcnt " << MyPyObjIorList->ob_refcnt-1 << endl ;
644 Py_DECREF( MyPyObjIorList ) ;
646 cdebug << "MyPyObjIor->ob_refcnt " << MyPyObjIor->ob_refcnt << endl ;
650 IOR = PyString_AsString( ResultIor ) ;
651 ObjRef = StringToObject( IOR ) ;
652 //JR 05.08.2005 BUG OMNIORB4 ? : that line does run with SALOME_3 (OMNIOrb4) for
653 // object references ... (It's Ok with OMNIOrb3)
654 // IOR and ObjRef and IORObjRef are Ok
655 // BUT data contains a nil reference !!!
659 SUPERV::SuperG_var mySuperVisionComponent ;
660 mySuperVisionComponent = theAutomaton->SuperVisionComponent() ;
661 if ( CORBA::is_nil( mySuperVisionComponent ) ) {
662 Engines::Container_var myContainer ;
663 Engines::Component_var myObjComponent ;
664 _OutNode->Graph()->StartComponent( ThreadNo() , "SuperVisionContainer" ,
666 myContainer , myObjComponent ) ;
667 mySuperVisionComponent = SUPERV::SuperG::_narrow( myObjComponent ) ;
668 theAutomaton->SuperVisionComponent( mySuperVisionComponent ) ;
670 //JR 24.08.2005 BUG OMNIORB4 ? : That does not run also ==> Comments
671 // CORBA::Object_ptr ObjRef1 ;
672 // ObjRef1 = mySuperVisionComponent->ToObject( ObjRef ) ;
673 // data <<= ObjRef1 ;
674 //JR 24.08.2005 BUG OMNIORB4 ? : BUT THAT RUNS WITH THE "IDENTITY METHOD ToObject of SUPERV.idl :
675 // Object ToObject( in Object anObject ) ;
676 //CODE of that method !!! :
677 //CORBA::Object_ptr SuperV_Impl::ToObject( CORBA::Object_ptr anObjectRef ) {
678 // beginService( "SuperV_Impl::ToObject" );
679 // CORBA::Object_ptr anObject ;
680 // anObject = CORBA::Object::_duplicate( anObjectRef ) ;
681 // endService( "SuperV_Impl::ToObject" );
684 //BUT THAT RUNS ONLY IF WE USE Dynamic invocation of CORBA (DynInvoke)
685 ServicesAnyData anInParametersList ;
686 anInParametersList.Name = "anObjRef" ;
687 anInParametersList.Value <<= ObjRef ;
688 DynInvoke( mySuperVisionComponent , "ToObject" ,
689 &anInParametersList , 1 , &OutParametersList[i] , 1 ) ;
690 data = OutParametersList[i].Value ;
692 IORObjRef = ObjectToString( ObjRef ) ;
694 cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value IORPy "
695 << IOR << " IORObjRef " << IORObjRef << " (objref) " << endl ;
697 if ( CORBA::is_nil( ObjRef ) ) {
699 cdebug << "ObjRef ERROR(nil reference) ResultIor->ob_refcnt "
700 << ResultIor->ob_refcnt-1 << endl ;
706 cdebug << "ObjRef NOT(nil reference)ResultIor->ob_refcnt "
707 << ResultIor->ob_refcnt-1 << endl ;
709 Py_DECREF( ResultIor ) ;
713 cdebug_out << "GraphExecutor::InNode::PyDynInvoke Error ResultIor == NULL Node "
714 << Name() << " method " << method << " " << endl ;
720 cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << "(other ERROR)" << endl ;
724 //JR 05.08.2005 BUG OMNIORB4 ? : that line does run with SALOME_3 (OMNIOrb4) for
725 // object references ...
726 OutParametersList[i].Value = data ;
727 // if ( data.type()->kind() == CORBA::tk_objref ) {
728 // IORObjRef = ObjectToString( ObjRef ) ;
729 //#if PyDynInvokeTrace
730 // cdebug << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
731 // << "ArgOut" << i << " : " << sname << " " << method << " ObjRef "
732 // << IORObjRef << " (objref) " << endl ;
733 // Engines::Component_var theObjComponent ;
734 // theObjComponent = Engines::Component::_narrow( ObjRef ) ;
735 // DynInvoke( theObjComponent , "ping" , NULL , 0 , NULL , 0 ) ;
737 // Engines::Container_var myContainer ;
738 // Engines::Component_var myObjComponent ;
739 // _OutNode->Graph()->StartComponent( ThreadNo() , "SuperVisionContainer" ,
741 // myContainer , myObjComponent ) ;
742 // SUPERV::SuperG_var mySuperVisionComponent ;
743 // mySuperVisionComponent = SUPERV::SuperG::_narrow( myObjComponent ) ;
744 // CORBA::Object_ptr ObjRef1 ;
745 // ObjRef1 = mySuperVisionComponent->ToObject( IORObjRef ) ;
746 //#if PyDynInvokeTrace
747 // IORObjRef = ObjectToString( ObjRef1 ) ;
748 // cdebug << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
749 // << "ArgOut" << i << " : " << sname << " " << method << " ToObject "
750 // << IORObjRef << " (objref) " << endl ;
753 // ServicesAnyData anInParametersList ;
754 // anInParametersList.Name = "anIORObjRef" ;
755 // anInParametersList.Value <<= IORObjRef ;
756 // DynInvoke( mySuperVisionComponent , "ToObject" ,
757 // &anInParametersList , 1 , &OutParametersList[i] , 1 ) ;
758 //#if PyDynInvokeTrace
759 // OutParametersList[i].Value >>= ObjRef1 ;
760 // IORObjRef = ObjectToString( ObjRef1 ) ;
761 // cdebug << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
762 // << "ArgOut" << i << " : " << sname << " " << method
763 // << " DynInvoke(ToObject) " << IORObjRef << " (objref) " << endl ;
769 cdebug << "InNode::PyDynInvoke Result->ob_refcnt " << Result->ob_refcnt-1 << endl ;
771 Py_DECREF( Result ) ;
775 cdebug << "InNode::PyDynInvoke ArgsList->ob_refcnt " << ArgsList->ob_refcnt-1 << endl ;
777 Py_DECREF( ArgsList ) ;
783 for ( i = 0 ; i < nInParams ; i++ ) { // Without Gates
784 cdebug << "InParametersList[" << i << "] : "
785 << InParametersList[i].Name << " "
786 << AnyValue( InParametersList[i].Value ) << endl ;
788 for ( i = 0 ; i < nOutParams ; i++ ) { // Without Gates
789 cdebug << "OutParametersList[" << i << "] : "
790 << OutParametersList[i].Name << " "
791 << AnyValue( OutParametersList[i].Value ) << endl ;
797 cdebug_out << "GraphExecutor::InNode::PyDynInvoke Node " << Name() << " method " << method << " " << RetVal
805 bool GraphExecutor::InNode::PyRunSimpleString( char* thePyString )
807 const bool ErrorValue = true;
811 MESSAGE( pthread_self() << "Python method beginning : " << thePyString );
812 cdebug_in << pthread_self() << "Python method beginning : " << thePyString << endl ;
814 aRet = PyRun_SimpleString( thePyString );
815 // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL
816 //aRet = _OutNode->SuperVisionContainer()->ActivatePythonExecution( thePyString ) ;
818 MESSAGE( pthread_self() << "Python method finished." );
819 cdebug_out << pthread_self() << "Python method finished." << endl ;
822 MESSAGE( pthread_self() << "ERROR: Exception caught running Python method." );
823 cdebug_out << pthread_self() << "ERROR: Exception caught running Python method."
825 MESSAGE( " Python was reinitialized. Previous Python definitions are lost" );
826 // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL
829 Py_InitModule( "InitPyRunMethod" , MethodPyRunMethod );
830 _OutNode->PyInitialized( false );
836 PyObject * GraphExecutor::InNode::PyEvalCallObject( const char *method ,
837 PyObject * MyPyRunMethod ,
838 PyObject * ArgsList ) {
839 // cdebug_in << "Executor::InNode::PyEvalCallObject " << Name() << endl ;
840 PyObject * Result = NULL ;
842 // MESSAGE( pthread_self() << "PyEval_CallObject " << Name() << " method beginning : " << method );
843 // cdebug << pthread_self() << "PyEval_CallObject " << Name() << " method beginning : " << method << endl ;
844 Result = PyEval_CallObject( MyPyRunMethod , ArgsList ) ;
845 // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL
846 //Result = _OutNode->SuperVisionContainer()->ActivatePythonExecution( MyPyRunMethod , ArgsList ) ;
847 // MESSAGE( pthread_self() << "PyEval_CallObject method finished. Result " << Result );
848 // cdebug << pthread_self() << "PyEval_CallObject method finished. Result " << Result << endl ;
849 // cdebug_out << "Executor::InNode::PyEvalCallObject " << Name() << endl ;
851 MESSAGE( pthread_self() << "ERROR: Exception caught PyEval_CallObject " << Name()
852 << " Python method " << method << ". Result " << Result );
853 cdebug << pthread_self() << "ERROR: Exception caught PyEval_CallObject " << Name()
854 << " Python method " << method << ". Result " << Result << endl ;
855 MESSAGE( " Python was reinitialized. Previous Python definitions are lost Py_IsInitialized " << Py_IsInitialized() );
856 //JR ===> fatal error in python : no current thread
857 // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL
860 Automaton()->PyInitModule( false ) ;
861 Py_InitModule( "InitPyRunMethod" , MethodPyRunMethod );
862 _OutNode->PyInitialized( false );
864 if ( Result == NULL ) {
865 Kill() ; // Reset of _ThreadId
867 // cdebug << "Executor::InNode::PyEvalCallObject ERROR catched " << Name()
868 // << " Py_IsInitialized " << Py_IsInitialized() << endl ;
870 // cdebug_out << "Executor::InNode::PyEvalCallObject " << Name() << endl ;