]> SALOME platform Git repositories - modules/superv.git/blob - src/GraphExecutor/DataFlowExecutor_PyDynInvoke.cxx
Salome HOME
omniORB4 porting
[modules/superv.git] / src / GraphExecutor / DataFlowExecutor_PyDynInvoke.cxx
1 //  SUPERV GraphExecutor : contains classes that permit execution of graphs and particularly the execution automaton
2 //
3 //  Copyright (C) 2003  CEA/DEN, EDF R&D
4 //
5 //
6 //
7 //  File   : DataFlowExecutor_PyDynInvoke.cxx
8 //  Author : Jean Rahuel, CEA
9 //  Module : SUPERV
10 //  $Header:
11
12 using namespace std;
13
14 #include <stdarg.h>
15 #include <map>
16
17 #include "DataFlowExecutor_InNode.hxx"
18 #include "DataFlowExecutor_OutNode.hxx"
19
20 using namespace CORBA ;
21
22 extern GraphExecutor::FiniteStateMachine * theAutomaton ;
23
24 //static PyObject * MyPyObjSignal = NULL ;
25 static PyObject * MyPyObjRef = NULL ;
26 static PyObject * MyPyObjIor = NULL ;
27 static PyObject * MyPyRunMethod = NULL ;
28
29 static PyMethodDef MethodPyRunMethod[] = {
30   { "RunMethod", PyRunMethod, METH_VARARGS },
31   { NULL,        NULL }
32 };
33
34 bool GraphExecutor::InNode::InitPython() {
35   cdebug_in << "InitPython" << endl ;
36   
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 ) ;
43   }
44 //  PyObject * Dictionnary = PyModule_GetDict( Module ) ;
45 //  InitPyDynInvokeError = PyErr_NewException( "InitPyDynInvokeError" , NULL , NULL ) ;
46 //  PyDict_SetItemString( Dictionnary , InitPyDynInvokeError ) ;
47   cdebug << ThreadNo() << "Py_Initialized() " << endl ;
48
49 #if 0
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 ) {
53     string aPyFunc ;
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() ;
69       return false ;
70     }
71     MyPyObjSignal = MyPyRunMethod ;
72     Automaton()->PyFunction( "PyObjSignal" , MyPyObjSignal ) ;
73   }
74   else {
75     MyPyObjSignal = Automaton()->PyFunction( "PyObjSignal" ) ;
76   }
77 #endif
78
79 // PyObjRef convert an IOR (string) to an Python ObjectReference
80   if ( Automaton()->PyFunction( "PyObjRef" ) == NULL ) {
81     string aPyFunc ;
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() ;
96       return false ;
97     }
98     MyPyObjRef = MyPyRunMethod ;
99     Automaton()->PyFunction( "PyObjRef" , MyPyObjRef ) ;
100   }
101   else {
102     MyPyObjRef = Automaton()->PyFunction( "PyObjRef" ) ;
103   }
104
105 // PyObjRef convert an Python ObjectReference to an IOR (string)
106   if ( Automaton()->PyFunction( "PyObjIor" ) == NULL ) {
107     string aPyFunc ;
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() ;
122       return false ;
123     }
124     MyPyObjIor = MyPyRunMethod ;
125     Automaton()->PyFunction( "PyObjIor" , MyPyObjIor ) ;
126   }
127   else {
128     MyPyObjIor = Automaton()->PyFunction( "PyObjIor" ) ;
129   }
130   Automaton()->PyUnLock() ;
131
132   cdebug_out << "InitPython" << endl ;
133   
134   return true ;
135 }
136
137 void GraphExecutor::InNode::RemovePyDynInvoke( char * PyFuncName ) {
138 //  Automaton()->PyLock() ; // Already done ...
139   if ( Automaton()->ErasePyFunction( PyFuncName ) ) {
140     cdebug << "InNode::RemovePyDynInvoke( " << PyFuncName << " ) success" << endl ;
141   }
142   else {
143     cdebug << "InNode::RemovePyDynInvoke( " << PyFuncName << " ) ERROR failed" << endl ;
144   }
145 //  Automaton()->PyUnLock() ;
146 }
147
148 PyObject * GraphExecutor::InNode::InitPyDynInvoke( char * PyFuncName ,
149                                                    const SUPERV::ListOfStrings * aPythonFunction ,
150                                                    bool & Err ) {
151   bool RetVal = true ;
152   Err = false ;
153   string aPyFunc ;
154   PyObject * thePyRunMethod = NULL ;
155
156   cdebug_in << "InitPyDynInvoke '" << PyFuncName << "' length " << (*aPythonFunction).length() << endl ;
157
158   if ( strlen( PyFuncName ) ) {
159     Automaton()->PyLock() ;
160     thePyRunMethod = Automaton()->PyFunction( PyFuncName ) ;
161     if ( (*aPythonFunction).length() ) {
162       if ( thePyRunMethod == NULL ) {
163         unsigned int i ;
164         aPyFunc += "import InitPyRunMethod\n" ;
165         for ( i = 0 ; i < (*aPythonFunction).length() ; i++ ) {
166           aPyFunc += (*aPythonFunction)[ i ] ;
167           aPyFunc += "\n" ;
168         }
169         aPyFunc += "InitPyRunMethod.RunMethod( " ;
170         aPyFunc += PyFuncName ;
171         aPyFunc += " )\n" ;
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 ) ;
177           RetVal = false ;
178           Err = true ;
179         }
180         else {
181           PyFuncRunned( true ) ;
182           thePyRunMethod = MyPyRunMethod ;
183           
184           Automaton()->PyFunction( PyFuncName , thePyRunMethod ) ;
185           cdebug << ThreadNo() << "PyRunSimpleString( " << (*aPythonFunction)[ 0 ] << " ) " << endl ;
186         }
187       }
188       if ( RetVal ) {
189         Automaton()->PyUnLock() ;
190         cdebug_out << "InitPyDynInvoke '" << PyFuncName << "' thePyRunMethod " << thePyRunMethod << " "
191                    << thePyRunMethod->ob_refcnt << endl ;
192         return thePyRunMethod ;
193       }
194     }
195     else if ( thePyRunMethod ) {
196       Automaton()->PyUnLock() ;
197       cdebug_out << "InitPyDynInvoke '" << PyFuncName << "' thePyRunMethod " << thePyRunMethod << " "
198                  << thePyRunMethod->ob_refcnt << endl ;
199       return thePyRunMethod ;
200     }
201     Automaton()->PyUnLock() ;
202   }
203
204   cdebug_out << "InitPyDynInvoke '" << PyFuncName << "' thePyRunMethod Null Err " << Err << endl ;
205   
206   return NULL ;
207 }
208
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 ;
217       return NULL ;
218     }
219     Py_XINCREF( Temp ) ;
220     Py_XDECREF( MyPyRunMethod ) ;
221     MyPyRunMethod = Temp ;
222     Py_INCREF( Py_None ) ;
223     Result = Py_None ;
224   }
225   return Result ;
226 }
227
228 #define PyDynInvokeTrace 1
229 bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod ,
230                                          const char *method , 
231                                          ServicesAnyData * InParametersList , int nInParams ,
232                                          ServicesAnyData * OutParametersList , int nOutParams ) {
233   int i ;
234
235   bool RetVal = true ;
236
237   const char * sname;
238
239 #if PyDynInvokeTrace
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 " ;
246 #endif
247   if ( MyPyRunMethod ) {
248 #if PyDynInvokeTrace
249     cdebug << MyPyRunMethod << " " << MyPyRunMethod->ob_refcnt << endl ;
250 #endif
251   }
252   else {
253 #if PyDynInvokeTrace
254     cdebug << " NULL" << endl ;
255 #endif
256     return false ;
257   }
258
259   CORBA::Any data ;
260
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 ;
268
269   CORBA::Object_ptr ObjRef ;
270
271   char * IORObjRef ;
272
273   if ( !PyCallable_Check( MyPyRunMethod ) ) {
274     Result = NULL ;
275     RetVal = false ;
276   }
277   else {
278     ArgsList = PyTuple_New( nInParams ) ;
279
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 : {
285         char * t ;
286         data >>= t ;
287         PyObject * ArgValue = Py_BuildValue( "s" , t ) ;
288         PyTuple_SetItem( ArgsList , i , ArgValue ) ;
289 #if PyDynInvokeTrace
290         cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << t << " (string) "
291                << " ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
292                << ArgValue->ob_refcnt << endl ;
293 #endif
294         break ;
295       }
296       case CORBA::tk_boolean : {
297         bool b ;
298         data >>= (CORBA::Any::to_boolean ) b ;
299         PyObject * ArgValue = Py_BuildValue( "b" , b ) ;
300         PyTuple_SetItem( ArgsList , i , ArgValue ) ;
301 #if PyDynInvokeTrace
302         cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << b
303                << " (boolean) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
304                << ArgValue->ob_refcnt << endl ;
305 #endif
306         break ;
307       }
308       case CORBA::tk_char : {
309         unsigned char c ;
310         data >>= (CORBA::Any::to_char ) c ;
311         PyObject * ArgValue = Py_BuildValue( "c" , c ) ;
312         PyTuple_SetItem( ArgsList , i , ArgValue ) ;
313 #if PyDynInvokeTrace
314         cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << c
315                << " (char) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
316                << ArgValue->ob_refcnt << endl ;
317 #endif
318         break ;
319       }
320       case CORBA::tk_short : {
321         short s ;
322         data >>= s ;
323         PyObject * ArgValue = Py_BuildValue( "h" , s ) ;
324         PyTuple_SetItem( ArgsList , i , ArgValue ) ;
325 #if PyDynInvokeTrace
326         cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << s
327                << " (short) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
328                << ArgValue->ob_refcnt << endl ;
329 #endif
330         break ;
331       }
332       case CORBA::tk_long : {
333         long l ;
334         data >>= l ;
335         PyObject * ArgValue = Py_BuildValue( "l" , l ) ;
336 #if PyDynInvokeTrace
337         cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << l
338                << " ArgValue->ob_refcnt" << ArgValue->ob_refcnt << endl ;
339 #endif
340         PyTuple_SetItem( ArgsList , i , ArgValue ) ;
341 #if PyDynInvokeTrace
342         cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << l
343                << " (long) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
344                << ArgValue->ob_refcnt << endl ;
345 #endif
346         break ;
347       }
348       case CORBA::tk_float : {
349         float f ;
350         data >>= f ;
351         PyObject * ArgValue = Py_BuildValue( "f" , f ) ;
352         PyTuple_SetItem( ArgsList , i , ArgValue ) ;
353 #if PyDynInvokeTrace
354         cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << f
355                << " (float) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
356                << ArgValue->ob_refcnt << endl ;
357 #endif
358         break ;
359       }
360       case CORBA::tk_double : {
361         double d ;
362         data >>= d ;
363         PyObject * ArgValue = Py_BuildValue( "d" , d ) ;
364         PyTuple_SetItem( ArgsList , i , ArgValue ) ;
365 #if PyDynInvokeTrace
366         cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << d
367                << " (double) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
368                << ArgValue->ob_refcnt << endl ;
369 #endif
370         break ;
371       }
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 ;
377 #else
378         data >>= ObjRef ;
379 #endif
380         IORObjRef = ObjectToString( ObjRef ) ;
381         ObjValue = Py_BuildValue( "s" , IORObjRef ) ;
382         PyTuple_SetItem( MyPyObjRefList , 0 , ObjValue ) ;
383 #if PyDynInvokeTrace
384         cdebug << "ArgIn" << i << " : " << sname << " " << method << " " << " Value " << IORObjRef << " (objref) "
385                << MyPyObjRef->ob_refcnt << "/" << MyPyObjRefList->ob_refcnt << endl ;
386 #endif
387 //        ResultObj = PyEval_CallObject( MyPyObjRef , MyPyObjRefList ) ;
388         ResultObj = PyEvalCallObject( "PyObjRef" , MyPyObjRef , MyPyObjRefList ) ;
389 #if PyDynInvokeTrace
390         cdebug << "ObjValue->ob_refcnt" << ObjValue->ob_refcnt << endl ;
391 #endif
392         ArgValue = Py_BuildValue( "O" , ResultObj ) ;
393         PyTuple_SetItem( ArgsList , i , ArgValue ) ;
394 #if PyDynInvokeTrace
395         cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value  (objref) ArgsList->ob_refcnt"
396                << ArgsList->ob_refcnt << " ArgValue->ob_refcnt" << ArgValue->ob_refcnt << endl ;
397         cdebug << "MyPyObjRefList->ob_refcnt " << MyPyObjRefList->ob_refcnt-1 << endl ;
398 #endif
399         Py_DECREF( MyPyObjRefList ) ;
400         if ( CORBA::is_nil( ObjRef ) ) {
401           ResultObj = NULL ;
402         }
403         else {
404 #if PyDynInvokeTrace
405           cdebug << "ResultObj->ob_refcnt " << ResultObj->ob_refcnt-1 << endl ;
406 #endif
407           Py_DECREF( ResultObj ) ;
408         }
409         break ;
410       }
411       default : {
412         cdebug << "ArgIn" << i << " : " << sname << " Value " << "(other ERROR)" << endl ;
413       }
414       }
415     }
416
417 //    Result = PyEval_CallObject( MyPyRunMethod , ArgsList ) ;
418     Result = PyEvalCallObject( method , MyPyRunMethod , ArgsList ) ;
419
420 #if PyDynInvokeTrace
421     cdebug << "ArgsList->ob_refcnt" << ArgsList->ob_refcnt << endl ;
422 #endif
423
424     if ( Result == NULL ) {
425       cdebug_out << "GraphExecutor::InNode::PyDynInvoke Node " << Name() << " " << method << " Error Result == NULL"
426                  << endl ;
427       RetVal = false ;
428     }
429     else {
430       for ( i = 0 ; i < nOutParams ; i++ ) {
431         data = OutParametersList[i].Value ;
432         sname = OutParametersList[i].Name.c_str() ;
433         switch ( data.type()->kind() ) {
434         case CORBA::tk_string : {
435           char * t = "" ;
436           PyObject * ArgValue ;
437           if ( PyTuple_Check( Result ) ) {
438             ArgValue = PyTuple_GetItem( Result , i ) ;
439           }
440           else {
441             ArgValue = Result ;
442           }
443           if ( !PyString_Check( ArgValue ) ) {
444             cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (string)" << endl ;
445             RetVal = false ;
446           }
447           else {
448             t = PyString_AsString( ArgValue ) ;
449           }
450           data <<= t ;
451 #if PyDynInvokeTrace
452           cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << t << " (string)"
453                  << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
454                  << ArgValue->ob_refcnt << endl ;
455 #endif
456           break ;
457         }
458         case CORBA::tk_boolean : {
459           bool b = false ;
460           PyObject * ArgValue ;
461           if ( PyTuple_Check( Result ) ) {
462             ArgValue = PyTuple_GetItem( Result , i ) ;
463           }
464           else {
465             ArgValue = Result ;
466           }
467           if ( !PyInt_Check( ArgValue ) ) {
468             cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (boolean)" << endl ;
469             RetVal = false ;
470           }
471           else {
472             b = PyInt_AsLong( ArgValue ) ;
473           }
474           data <<= (CORBA::Any::from_boolean ) b ;
475 #if PyDynInvokeTrace
476           cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << b << " (boolean)"
477                  << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
478                  << ArgValue->ob_refcnt << endl ;
479 #endif
480           break ;
481         }
482         case CORBA::tk_char : {
483           unsigned char c = 0 ;
484           PyObject * ArgValue ;
485           if ( PyTuple_Check( Result ) ) {
486             ArgValue = PyTuple_GetItem( Result , i ) ;
487           }
488           else {
489             ArgValue = Result ;
490           }
491 //JR 04.04.2005 Debug          if ( !PyInt_Check( ArgValue ) ) {
492 //Difficult to understand that behavior ... Python char type is a string of length 1 !
493 //                                          or type is int ...
494           if ( !PyString_Check( ArgValue ) && !PyInt_Check( ArgValue ) ) {
495             cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (char)" << endl ;
496             RetVal = false ;
497           }
498           else {
499             c = PyInt_AsLong( ArgValue ) ;
500           }
501           data <<= (CORBA::Any::from_char ) c ;
502 #if PyDynInvokeTrace
503           cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << c << " (char)"
504                  << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
505                  << ArgValue->ob_refcnt << endl ;
506 #endif
507           break ;
508         }
509         case CORBA::tk_short : {
510           short s = 0 ;
511           PyObject * ArgValue ;
512           if ( PyTuple_Check( Result ) ) {
513             ArgValue = PyTuple_GetItem( Result , i ) ;
514           }
515           else {
516             ArgValue = Result ;
517           }
518           if ( !PyInt_Check( ArgValue ) ) {
519             cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (short)" << endl ;
520             RetVal = false ;
521           }
522           else {
523             s = PyInt_AsLong( ArgValue ) ;
524           }
525           data <<= s ;
526 #if PyDynInvokeTrace
527           cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << s << " (short)"
528                  << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
529                  << ArgValue->ob_refcnt << endl ;
530 #endif
531           break ;
532         }
533         case CORBA::tk_long : {
534           long l = 0 ;
535           PyObject * ArgValue ;
536           if ( PyTuple_Check( Result ) ) {
537             ArgValue = PyTuple_GetItem( Result , i ) ;
538           }
539           else {
540             ArgValue = Result ;
541           }
542           if ( PyLong_Check( ArgValue ) ) {
543             l = PyLong_AsLong( ArgValue ) ;
544           }
545           else if ( PyInt_Check( ArgValue ) ) {
546             l = PyInt_AsLong( ArgValue ) ;
547           }
548           else {
549             cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (CORBA::tk_long)" << endl ;
550             RetVal = false ;
551           }
552           data <<= l ;
553 #if PyDynInvokeTrace
554           cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << l << " (long)"
555                  << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
556                  << ArgValue->ob_refcnt << endl ;
557 #endif
558           break ;
559         }
560         case CORBA::tk_float : {
561           float f = 0 ;
562           PyObject * ArgValue ;
563           if ( PyTuple_Check( Result ) ) {
564             ArgValue = PyTuple_GetItem( Result , i ) ;
565           }
566           else {
567             ArgValue = Result ;
568           }
569           if ( !PyFloat_Check( ArgValue ) ) {
570             cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (float)" << endl ;
571             RetVal = false ;
572           }
573           else {
574             f = PyFloat_AsDouble( ArgValue ) ;
575           }
576           data <<= f ;
577 #if PyDynInvokeTrace
578           cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << f << " (float)"
579                  << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
580                  << ArgValue->ob_refcnt << endl ;
581 #endif
582           break ;
583         }
584         case CORBA::tk_double : {
585           double d = 0 ;
586           PyObject * ArgValue ;
587           if ( PyTuple_Check( Result ) ) {
588             ArgValue = PyTuple_GetItem( Result , i ) ;
589           }
590           else {
591             ArgValue = Result ;
592           }
593           if ( !PyFloat_Check( ArgValue ) ) {
594             cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (double)" << endl ;
595             RetVal = false ;
596           }
597           else {
598             d = PyFloat_AsDouble( ArgValue ) ;
599           }
600           data <<= d ;
601 #if PyDynInvokeTrace
602           cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << d << " (double)"
603                  << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
604                  << ArgValue->ob_refcnt << endl ;
605 #endif
606           break ;
607         }
608         case CORBA::tk_objref : {
609           PyObject * ObjIor ;
610           MyPyObjIorList = PyTuple_New( 1 ) ;
611           if ( PyTuple_Check( Result ) ) {
612             ObjIor = PyTuple_GetItem( Result , i ) ;
613           }
614           else {
615             ObjIor = Result ;
616           }
617 #if PyDynInvokeTrace
618           cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << "(object reference) "
619                  << " Result->ob_refcnt" << Result->ob_refcnt << " ObjIor->ob_refcnt"
620                  << ObjIor->ob_refcnt << endl ;
621 #endif
622           Py_INCREF( ObjIor ) ;
623 //          PyObject_Print( ObjIor , stdout , 0 ) ;
624           PyTuple_SetItem( MyPyObjIorList , 0 , ObjIor ) ;
625 //          ResultIor = PyEval_CallObject( MyPyObjIor , MyPyObjIorList ) ;
626           ResultIor = PyEvalCallObject( "PyObjIor" , MyPyObjIor , MyPyObjIorList ) ;
627 #if PyDynInvokeTrace
628           cdebug << "ObjIor->ob_refcnt " << ObjIor->ob_refcnt-1 << endl ;
629 #endif
630           Py_DECREF( ObjIor ) ;
631 #if PyDynInvokeTrace
632           cdebug << "MyPyObjIorList->ob_refcnt " << MyPyObjIorList->ob_refcnt-1 << endl ;
633 #endif
634           Py_DECREF( MyPyObjIorList ) ;
635 #if PyDynInvokeTrace
636           cdebug << "MyPyObjIor->ob_refcnt " << MyPyObjIor->ob_refcnt << endl ;
637 #endif
638           if ( ResultIor ) {
639             char * IOR = NULL ;
640             IOR = PyString_AsString( ResultIor ) ;
641             ObjRef = StringToObject( IOR ) ;
642 //JR 05.08.2005 BUG OMNIORB4 ? : that line does run with SALOME_3 (OMNIOrb4) for
643 //                               object references ... (It's Ok with OMNIOrb3)
644 //                               IOR and ObjRef and IORObjRef are Ok
645 //                               BUT data contains a nil reference !!!
646 #if !omniORB_4_0_5
647             data <<= ObjRef ;
648 #else
649             SUPERV::SuperG_var mySuperVisionComponent ;
650             mySuperVisionComponent = theAutomaton->SuperVisionComponent() ;
651             if ( CORBA::is_nil( mySuperVisionComponent ) ) {
652               Engines::Container_var myContainer ;
653               Engines::Component_var myObjComponent ;
654               _OutNode->Graph()->StartComponent( ThreadNo() , "SuperVisionContainer" ,
655                                                  "SUPERV" ,
656                                                  myContainer , myObjComponent ) ;
657               mySuperVisionComponent = SUPERV::SuperG::_narrow( myObjComponent ) ;
658               theAutomaton->SuperVisionComponent( mySuperVisionComponent ) ;
659             }
660 //JR 24.08.2005 BUG OMNIORB4 ? : That does not run also ==> Comments
661 //            CORBA::Object_ptr ObjRef1 ;
662 //            ObjRef1 = mySuperVisionComponent->ToObject( ObjRef ) ;
663 //            data <<= ObjRef1 ;
664 //JR 24.08.2005 BUG OMNIORB4 ? : BUT THAT RUNS WITH THE "IDENTITY METHOD ToObject of SUPERV.idl :
665 //                               Object ToObject( in Object anObject ) ;
666 //CODE of that method !!! :
667 //CORBA::Object_ptr SuperV_Impl::ToObject( CORBA::Object_ptr anObjectRef ) {
668 //  beginService( "SuperV_Impl::ToObject" );
669 //  CORBA::Object_ptr anObject ;
670 //  anObject = CORBA::Object::_duplicate( anObjectRef ) ;
671 //  endService( "SuperV_Impl::ToObject" );
672 //  return anObject ;
673 //}
674 //BUT THAT RUNS ONLY IF WE USE Dynamic invocation of CORBA (DynInvoke)
675             ServicesAnyData anInParametersList ;
676             anInParametersList.Name = "anObjRef" ;
677             anInParametersList.Value <<= ObjRef ;
678             DynInvoke( mySuperVisionComponent , "ToObject" ,
679                        &anInParametersList , 1 , &OutParametersList[i] , 1 ) ;
680             data = OutParametersList[i].Value ;
681 #endif
682             IORObjRef = ObjectToString( ObjRef ) ;
683 #if PyDynInvokeTrace
684             cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value IORPy "
685                    << IOR << " IORObjRef " << IORObjRef << " (objref) " << endl ;
686 #endif
687             if ( CORBA::is_nil( ObjRef ) ) {
688 #if PyDynInvokeTrace
689               cdebug << "ObjRef ERROR(nil reference) ResultIor->ob_refcnt "
690                      << ResultIor->ob_refcnt-1 << endl ;
691 #endif
692               ResultIor = NULL ;
693             }
694             else {
695 #if PyDynInvokeTrace
696               cdebug << "ObjRef NOT(nil reference)ResultIor->ob_refcnt "
697                      << ResultIor->ob_refcnt-1 << endl ;
698 #endif
699               Py_DECREF( ResultIor ) ;
700             }
701           }
702           else {
703             cdebug_out << "GraphExecutor::InNode::PyDynInvoke Error ResultIor == NULL Node "
704                        << Name() << " method " << method << " " << endl ;
705             RetVal = false ;
706           }
707           break ;
708         }
709         default : {
710           cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << "(other ERROR)" << endl ;
711             RetVal = false ;
712         }
713         }
714 //JR 05.08.2005 BUG OMNIORB4 ? : that line does run with SALOME_3 (OMNIOrb4) for
715 //                               object references ...
716         OutParametersList[i].Value = data ;
717 //        if ( data.type()->kind() == CORBA::tk_objref ) {
718 //          IORObjRef = ObjectToString( ObjRef ) ;
719 //#if PyDynInvokeTrace
720 //          cdebug << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
721 //                 << "ArgOut" << i << " : " << sname << " " << method << " ObjRef "
722 //                 << IORObjRef << " (objref) " << endl ;
723 //          Engines::Component_var theObjComponent ;
724 //          theObjComponent = Engines::Component::_narrow( ObjRef ) ;
725 //          DynInvoke( theObjComponent , "ping" , NULL , 0 , NULL , 0 ) ;
726 //#endif
727 //          Engines::Container_var myContainer ;
728 //          Engines::Component_var myObjComponent ;
729 //          _OutNode->Graph()->StartComponent( ThreadNo() , "SuperVisionContainer" ,
730 //                                             "SUPERV" ,
731 //                                              myContainer , myObjComponent ) ;
732 //          SUPERV::SuperG_var mySuperVisionComponent ;
733 //          mySuperVisionComponent = SUPERV::SuperG::_narrow( myObjComponent ) ;
734 //          CORBA::Object_ptr ObjRef1 ;
735 //          ObjRef1 = mySuperVisionComponent->ToObject( IORObjRef ) ;
736 //#if PyDynInvokeTrace
737 //          IORObjRef = ObjectToString( ObjRef1 ) ;
738 //          cdebug << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
739 //                 << "ArgOut" << i << " : " << sname << " " << method << " ToObject "
740 //                 << IORObjRef << " (objref) " << endl ;
741 //#endif
742
743 //          ServicesAnyData anInParametersList ;
744 //          anInParametersList.Name = "anIORObjRef" ;
745 //          anInParametersList.Value <<= IORObjRef ;
746 //          DynInvoke( mySuperVisionComponent , "ToObject" ,
747 //                     &anInParametersList , 1 , &OutParametersList[i] , 1 ) ;
748 //#if PyDynInvokeTrace
749 //          OutParametersList[i].Value >>= ObjRef1 ;
750 //          IORObjRef = ObjectToString( ObjRef1 ) ;
751 //          cdebug << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
752 //                 << "ArgOut" << i << " : " << sname << " " << method
753 //                 << " DynInvoke(ToObject) " << IORObjRef << " (objref) " << endl ;
754 //#endif
755 //        }
756       }
757
758 #if PyDynInvokeTrace
759       cdebug << "InNode::PyDynInvoke Result->ob_refcnt " << Result->ob_refcnt-1 << endl ;
760 #endif
761       Py_DECREF( Result ) ;
762     }
763
764 #if PyDynInvokeTrace
765     cdebug << "InNode::PyDynInvoke ArgsList->ob_refcnt " << ArgsList->ob_refcnt-1 << endl ;
766 #endif
767     Py_DECREF( ArgsList ) ;
768   }
769
770 #if 0
771   {
772     int i ;
773     for ( i = 0 ; i < nInParams ; i++ ) { // Without Gates
774       cdebug << "InParametersList[" << i << "] : "
775              << InParametersList[i].Name << " "
776              << AnyValue( InParametersList[i].Value ) << endl ;
777     }
778     for ( i = 0 ; i < nOutParams ; i++ ) { // Without Gates
779       cdebug << "OutParametersList[" << i << "] : "
780              << OutParametersList[i].Name << " "
781              << AnyValue( OutParametersList[i].Value ) << endl ;
782     }
783   }
784 #endif
785
786 #if PyDynInvokeTrace
787   cdebug_out << "GraphExecutor::InNode::PyDynInvoke Node " << Name() << " method " << method << " " << RetVal
788              << endl ;
789 #endif
790
791   return RetVal ;
792
793 }
794
795 bool GraphExecutor::InNode::PyRunSimpleString( char* thePyString )
796 {
797   const bool ErrorValue = true;
798   bool aRet;
799   try {
800 #if PyDynInvokeTrace
801     MESSAGE( pthread_self() << "Python method beginning : " << thePyString );
802     cdebug_in << pthread_self() << "Python method beginning : " << thePyString << endl ;
803 #endif
804     aRet = PyRun_SimpleString( thePyString );
805     // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL    
806     //aRet = _OutNode->SuperVisionContainer()->ActivatePythonExecution( thePyString ) ;
807 #if PyDynInvokeTrace
808     MESSAGE( pthread_self() << "Python method finished." );
809     cdebug_out << pthread_self() << "Python method finished." << endl ;
810 #endif
811   } catch( ... ) {
812     MESSAGE( pthread_self() << "ERROR: Exception caught running Python method." );
813     cdebug_out << pthread_self() << "ERROR: Exception caught running Python method."
814                << endl ;
815     MESSAGE( "       Python was reinitialized.  Previous Python definitions are lost" );
816     // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL    
817     Py_Finalize();
818     Py_Initialize();
819     Py_InitModule( "InitPyRunMethod" , MethodPyRunMethod );
820     _OutNode->PyInitialized( false );
821     aRet = ErrorValue;
822   }
823   return aRet;
824 }
825
826 PyObject * GraphExecutor::InNode::PyEvalCallObject( const char *method ,
827                                                     PyObject * MyPyRunMethod ,
828                                                     PyObject * ArgsList ) {
829 //  cdebug_in << "Executor::InNode::PyEvalCallObject " << Name() << endl ;
830   PyObject * Result = NULL ;
831   try {
832 //    MESSAGE( pthread_self() << "PyEval_CallObject " << Name() << " method beginning : " << method );
833 //    cdebug << pthread_self() << "PyEval_CallObject " << Name() << " method beginning : " << method << endl ;
834     Result = PyEval_CallObject( MyPyRunMethod , ArgsList ) ;
835     // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL    
836     //Result = _OutNode->SuperVisionContainer()->ActivatePythonExecution( MyPyRunMethod , ArgsList ) ;
837 //    MESSAGE( pthread_self() << "PyEval_CallObject method finished. Result " << Result );
838 //    cdebug << pthread_self() << "PyEval_CallObject method finished. Result " << Result << endl ;
839 //    cdebug_out << "Executor::InNode::PyEvalCallObject " << Name() << endl ;
840   } catch( ... ) {
841     MESSAGE( pthread_self() << "ERROR: Exception caught PyEval_CallObject " << Name()
842              << " Python method " << method << ". Result "  << Result );
843     cdebug << pthread_self() << "ERROR: Exception caught PyEval_CallObject " << Name()
844            << " Python method " << method << ". Result " << Result << endl ;
845     MESSAGE( "       Python was reinitialized.  Previous Python definitions are lost Py_IsInitialized " << Py_IsInitialized() );
846 //JR ===> fatal error in python : no current thread
847     // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL    
848     Py_Finalize();
849     Py_Initialize();
850     Automaton()->PyInitModule( false ) ;
851     Py_InitModule( "InitPyRunMethod" , MethodPyRunMethod );
852     _OutNode->PyInitialized( false );
853
854     if ( Result == NULL ) {
855       Kill() ; // Reset of _ThreadId
856     }
857 //    cdebug << "Executor::InNode::PyEvalCallObject ERROR catched " << Name()
858 //           << " Py_IsInitialized " << Py_IsInitialized() << endl ;
859   }
860 //  cdebug_out << "Executor::InNode::PyEvalCallObject " << Name() << endl ;
861   return Result ;
862 }