]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
Fix on Bug GEOM6047
authorsmh <smh@opencascade.com>
Wed, 9 Jun 2004 11:35:40 +0000 (11:35 +0000)
committersmh <smh@opencascade.com>
Wed, 9 Jun 2004 11:35:40 +0000 (11:35 +0000)
  Script GEOM_example3.py freeze IAPP
(Now, salome.sg.updateObjBrowser(0) freeze the IAPP !!! )

src/Event/SALOME_Event.cxx
src/Event/SALOME_Event.hxx
src/SALOMEGUI/PyInterp_PyQt.cxx
src/SALOMEGUI/QAD_Desktop.cxx
src/SALOMEGUI/QAD_PyEditor.cxx
src/SALOME_PYQT/SALOME_PYQT_GUI.cxx
src/Session/SALOME_Session_Server.cxx
src/Session/SALOME_Session_i.cxx

index dfebd7b02f751dbe9c8e6181150566b3d28a68b9..42ca096d4a7fd42c304e2322b8a78f530ce512ee 100644 (file)
@@ -46,16 +46,11 @@ static int MYDEBUG = 0;
  *  Constructor
  */
 //===========================================================
-SALOME_Event::SALOME_Event(): 
-  myWait( true ),
-  myAutoRelease( false )
-{
-  if(MYDEBUG) MESSAGE( "SALOME_Event::SALOME_Event(): this = "<<this<<", myWait = "<<myWait );
-  if ( myWait ) {
-    // Prepare the semaphore 
-    mySemaphore = new QSemaphore( 2 );
-    mySemaphore->operator+=( 2 );
-  }
+SALOME_Event::SALOME_Event(){
+  if(MYDEBUG) MESSAGE( "SALOME_Event::SALOME_Event(): this = "<<this );
+  // Prepare the semaphore 
+  mySemaphore = new QSemaphore( 2 );
+  *mySemaphore += 2;
 }
 
 //===========================================================
@@ -64,14 +59,11 @@ SALOME_Event::SALOME_Event():
  *  Destructor
  */
 //===========================================================
-SALOME_Event::~SALOME_Event()
-{
-  if(MYDEBUG) MESSAGE( "SALOME_Event::~SALOME_Event(): this = "<<this<<", myWait = "<<myWait );
-  if ( myWait ) {
-    if ( mySemaphore->available() < mySemaphore->total() )
-      mySemaphore->operator-=( mySemaphore->total() - mySemaphore->available() );
-    delete mySemaphore;
-  }
+SALOME_Event::~SALOME_Event(){
+  if(MYDEBUG) MESSAGE( "SALOME_Event::~SALOME_Event(): this = "<<this );
+  if ( mySemaphore->available() < mySemaphore->total() )
+    *mySemaphore -= mySemaphore->total() - mySemaphore->available();
+  delete mySemaphore;
 }
 
 //===========================================================
@@ -82,17 +74,10 @@ SALOME_Event::~SALOME_Event()
 //===========================================================
 void SALOME_Event::process()
 {
-  if(MYDEBUG) MESSAGE( "SALOME_Event::process(): this = "<<this<<", myWait = "<<myWait );
   QThread::postEvent( qApp, new QCustomEvent( SALOME_EVENT, (void*)this ) );
-  if ( myWait ) {
-    if(MYDEBUG) MESSAGE( "SALOME_Event::process(): available = " << mySemaphore->available() );
-    if ( !mySemaphore->available() )
-      mySemaphore->operator+=( 1 );
-
-    if(MYDEBUG) MESSAGE( "SALOME_Event::process() COMPLETED: this = "<<this<<", myWait = "<<myWait );
-  }
-  if ( myAutoRelease )
-    release();
+  if(MYDEBUG) MESSAGE( "SALOME_Event::process(): this = "<<this<<", *mySemaphore += 1 " );
+  *mySemaphore += 1;
+  if(MYDEBUG) MESSAGE( "SALOME_Event::process(): this = "<<this<<" - COMPLETED" );
 }
 
 //===========================================================
@@ -103,38 +88,7 @@ void SALOME_Event::process()
 //===========================================================
 void SALOME_Event::processed()
 {
-  if(MYDEBUG) MESSAGE( "SALOME_Event::processed(): this = "<<this<<", myWait = "<<myWait );
-  if ( myWait ) {
-    if(MYDEBUG) MESSAGE( "SALOME_Event::processed(): available = " << mySemaphore->available() );
-    if ( !mySemaphore->available() ) {
-      // process() takes control over mySemaphore after the next line is executed
-      mySemaphore->operator-=( 1 );
-
-      if(MYDEBUG) MESSAGE( "SALOME_Event::processed(): semaphore DECREMENTED" );
-
-      // Current thread will block here until process() completes
-      mySemaphore->operator+=( mySemaphore->total() );
-    }
-  }
-  if(MYDEBUG) MESSAGE( "SALOME_Event::processed() COMPLETED: this = "<<this<<", myWait = "<<myWait );
-}
-
-//===========================================================
-/*!
- *  SALOME_Event::release
- *  Wakes up the desktop
- */
-//===========================================================
-void SALOME_Event::release()
-{
-  if(MYDEBUG) MESSAGE( "SALOME_Event::release(): this = "<<this<<", myWait = "<<myWait );
-  if ( myWait ) {
-    if(MYDEBUG) MESSAGE( "SALOME_Event::release(): available = " << mySemaphore->available() );
-    mySemaphore->operator-=( mySemaphore->total() - mySemaphore->available() );
-  }
-  if(MYDEBUG) MESSAGE( "SALOME_Event::release() COMPLETED: this = "<<this<<", myWait = "<<myWait );
+  if(MYDEBUG) MESSAGE( "SALOME_Event::processed(): this = "<<this );
+  // process() takes control over mySemaphore after the next line is executed
+  *mySemaphore -= 1;
 }
-
-
-
-
index 2467912d904ee9345081cc3f60262fe0c8eca2dd..bfcc980522e3b9e8e2358a0bd78fd884db23824b 100644 (file)
@@ -36,6 +36,8 @@
 
 class QSemaphore;
 
+extern bool IsSessionThread();
+
 //===========================================================
 /*!
  *  Class: SALOME_Event
@@ -51,39 +53,25 @@ class QSemaphore;
  *  no need to protect such fields with a mutex, for only one thread working with
  *  a SALOME_Event object is active at any moment.
  *
- *  It is possible to make the thread that creates SALOME_Event
- *  wait until the event is processed by the component GUI, SALOME_Event
- *  should be constructed with <wait> == TRUE in such a case.
- *
- *  SALOME_Event objects should be created on the heap. QAD_Desktop deletes
- *  these objects as soon as they have been processed.
- *
  *  Usage:
  *  - create SALOME_Event object on the heap with proper <type> and <wait> parameters. 
  *    Components can derive their own event class from SALOME_Event
  *    in order to pass custom data to the event handler.
  *  - call process() method to post the event. Between process() and release()
  *    it is possible to examine fields of your custom event object.
- *  - call release() method to wake up the desktop (you can also set <autoRelease>
+ *  - perform delete operator on the event to wake up the desktop (you can also set <autoRelease>
  *    parameter to TRUE to automatically wake up desktop after process()
  * 
  *  processed() method is used by the desktop to signal that event processing 
  *  has been completed.
  *  
  *  Caveats: 
- *  1. Never create SALOME_Event with <wait> == TRUE in code that is 
- *     supposed to be called within main GUI thread, for this will result
- *     in GUI process deadlock.
- *  2. Always call release() method after process() if you use <wait> parameters as TRUE,
- *     otherwise processed() method will never return and main GUI thread will be blocked!
- *  3. Never use pointers to the event after it has been released (either by calling release()
- *     or automatically by process() if <autoRelease> == TRUE) to avoid application crashes!
+ *    There is no.
  */
 //===========================================================
 
 
-class SALOME_Event
-{
+class SALOME_Event{
 public:
   SALOME_Event();
   virtual ~SALOME_Event();
@@ -92,13 +80,11 @@ public:
   virtual void Execute() = 0;
 
   void process();
-  void processed();
-
-  void release();
 
 private:
-  bool        myWait;
-  bool        myAutoRelease;
+  void processed();
+  friend class QAD_Desktop;
+
   QSemaphore* mySemaphore;
 };
 
@@ -242,17 +228,27 @@ private:
 
 // Template function for processing events with result returing
 template<class TEvent> inline typename TEvent::TResult ProcessEvent(TEvent* theEvent){
-  theEvent->process();
-  typename TEvent::TResult aResult = theEvent->myResult;
-  theEvent->release();
+  typename TEvent::TResult aResult;
+  if(IsSessionThread()){
+    theEvent->Execute();
+    aResult = theEvent->myResult;
+  }else{
+    theEvent->process();
+    aResult = theEvent->myResult;
+  }
+  delete theEvent;
   return aResult;
 }
 
 
 // Template function for processing events without result
 inline void ProcessVoidEvent(SALOME_Event* theEvent){
-  theEvent->process();
-  theEvent->release();
+  if(IsSessionThread()){
+    theEvent->Execute();
+  }else{
+    theEvent->process();
+  }
+  delete theEvent;
 }
 
 
index dd136e506e506c7f77acc3b2bde9e7bff6ae02af..2ae675da688884bb6df245aa2d94c18ea4f492e0 100644 (file)
@@ -22,7 +22,6 @@ using namespace std;
  */
 PyInterp_PyQt::PyInterp_PyQt(): PyInterp_base()
 {
-  initialize();
 }
 
 PyInterp_PyQt::~PyInterp_PyQt()
@@ -64,4 +63,3 @@ void PyInterp_PyQt::run(const char *command)
   }
   Py_DECREF(r);
 }
-
index 3f222202750327d04d1bd58c325ff9194d766e77..24ee1a939bd9f85fa088d74f15e8151c0fd77bd7 100644 (file)
@@ -453,11 +453,8 @@ bool QAD_Desktop::eventFilter( QObject* o, QEvent* e )
   }
   else if ( e->type() == SALOME_EVENT ) { 
     SALOME_Event* aSE = (SALOME_Event*)((QCustomEvent*)e)->data();
-    processEvent( aSE );
-    // Signal the calling thread that the event has been processed
-    aSE->processed();
+    processEvent(aSE);
     ((QCustomEvent*)e)->setData( 0 );
-    delete aSE;
     return TRUE;
   }
   return QMainWindow::eventFilter( o, e );
@@ -468,9 +465,11 @@ bool QAD_Desktop::eventFilter( QObject* o, QEvent* e )
 */
 void QAD_Desktop::processEvent( SALOME_Event* theEvent )
 {
-  if ( !theEvent )
-    return;
-  theEvent->Execute();
+  if( theEvent ){
+    theEvent->Execute();
+    // Signal the calling thread that the event has been processed
+    theEvent->processed();
+  }
 }
 
 /*!
index 72e22033ea4058816a10fa161458b08d7e9933a5..0b7c7f7b2c044bef208a7ba30a16742c558c0cfa 100644 (file)
@@ -409,7 +409,6 @@ void QAD_PyEditor::keyPressEvent( QKeyEvent *e )
              _isInHistory = true;
              _currentCommand = text(endLine).remove(0,SIZEPR);
              _currentCommand.truncate( _currentCommand.length() - 1 );
-             SCRUTE(_currentCommand);
            }
          QString previousCommand = myInterp->getPrevious();
          if (previousCommand.compare(BEGIN_HISTORY_PY) != 0)
index 73e33fd0527db93bb64f39b54903b7d91e118b43..61350d784257d5f8c13344d65ac7fb7c09f39bba 100644 (file)
@@ -94,7 +94,8 @@ void SALOME_PYQT_GUI::initInterp(int StudyID)
      * The creation of Python interpretor must be protected par a C++ Lock because of C threads
      */
     ThreadLock aPyLock = GetPyThreadLock("SALOME_PYQT_GUI::initInterp");
-    interp=new PyInterp_PyQt();
+    interp = new PyInterp_PyQt();
+    interp->initialize();
     mapInterp[StudyID] = interp;
   }
   // imports Python GUI module and puts it in _module attribute
index ff9a6cf3c20d22bc4258a65411887e366fbc4047..9fd38593b4907e61b6a3f4e87f426a2d1308c767 100644 (file)
@@ -33,6 +33,7 @@
 #include <unistd.h>
 using namespace std;
 
+#include <pthread.h>
 #include <qthread.h> 
 #include <qapplication.h>
 #include <qlabel.h>
@@ -86,10 +87,26 @@ using namespace std;
  *   - get session state
  */
 
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+static pthread_t myThread;
+
+extern bool IsSessionThread(){
+  bool aResult = myThread == pthread_self();
+  if(MYDEBUG) INFOS("IsSessionThread() - "<<aResult);
+  return aResult;
+}
+
 int main(int argc, char **argv)
 {
   try
     {
+      myThread = pthread_self();
+
       ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
       ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
       int orbArgc = 1;
index 89002812778d13903f45145f887d4affe473bb1b..6d0f0f640a04849e4f74ccbec2bdf9ad995989a4 100644 (file)
@@ -30,7 +30,6 @@
 
 #include "SALOME_Session_i.hxx"
 #include "SALOME_NamingService.hxx"
-#include "SALOME_Session_QThread.hxx"
 
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"