]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
PR: from Sergey Mozokhin, Supervisor problem, crash after killing a dataflow execution.
authorprascle <prascle>
Mon, 4 Sep 2006 05:27:15 +0000 (05:27 +0000)
committerprascle <prascle>
Mon, 4 Sep 2006 05:27:15 +0000 (05:27 +0000)
src/Container/Component_i.cxx
src/Container/Container_i.cxx
src/Container/SALOME_Component_i.hxx

index 0e6a5c0aba475374ba4958b1ae8ca34c84e3ba71..934019a98c84579e229ea00b2fea5458bfd14ca6 100644 (file)
@@ -95,7 +95,8 @@ Engines_Component_i::Engines_Component_i(CORBA::ORB_ptr orb,
   _Executed(false) ,
   _graphName("") ,
   _nodeName(""),
- _studyId(-1)
+  _studyId(-1),
+  _CanceledThread(false)
 {
   MESSAGE("Component constructor with instanceName "<< _instanceName);
   //SCRUTE(pd_refCount);
@@ -140,7 +141,8 @@ Engines_Component_i::Engines_Component_i(CORBA::ORB_ptr orb,
  _Executed(false) ,
  _graphName("") ,
  _nodeName(""),
- _studyId(-1)
+ _studyId(-1),
+ _CanceledThread(false)
 {
   _orb = CORBA::ORB::_duplicate(orb);
   _poa = PortableServer::POA::_duplicate(poa);
@@ -333,7 +335,7 @@ bool Engines_Component_i::Kill_impl()
 #ifndef WNT
   if ( _ThreadId > 0 && pthread_self() != _ThreadId )
     {
-      RetVal = Killer( _ThreadId , 0 ) ;
+      RetVal = Killer( _ThreadId , SIGUSR2 ) ;
       _ThreadId = (pthread_t ) -1 ;
     }
 
@@ -581,6 +583,7 @@ void Engines_Component_i::beginService(const char *serviceName)
   _ThreadCpuUsed = 0 ;
   _Executed = true ;
   _serviceName = serviceName ;
+  theEngines_Component = this ;
   if ( pthread_setcanceltype( PTHREAD_CANCEL_ASYNCHRONOUS , NULL ) )
     {
       perror("pthread_setcanceltype ") ;
@@ -632,7 +635,8 @@ void Engines_Component_i::beginService(const char *serviceName)
 
 void Engines_Component_i::endService(const char *serviceName)
 {
-  _ThreadCpuUsed = CpuUsed_impl() ;
+  if ( !_CanceledThread )
+    _ThreadCpuUsed = CpuUsed_impl() ;
   MESSAGE(pthread_self() << " Send EndService notification for " << serviceName
          << endl << " Component instance : " << _instanceName << " StartUsed "
           << _StartUsed << " _ThreadCpuUsed "<< _ThreadCpuUsed << endl <<endl);
@@ -713,7 +717,8 @@ bool Engines_Component_i::Killer( pthread_t ThreadId , int signum )
 
 void SetCpuUsed()
 {
-  theEngines_Component->SetCurCpu() ;
+  if ( theEngines_Component )
+    theEngines_Component->SetCurCpu() ;
 }
 
 //=============================================================================
@@ -766,6 +771,23 @@ long Engines_Component_i::CpuUsed()
   return cpu ;
 }
 
+void CallCancelThread()
+{
+  if ( theEngines_Component )
+    theEngines_Component->CancelThread() ;
+}
+
+//=============================================================================
+/*!
+ *  C++ method:
+ */
+//=============================================================================
+
+void Engines_Component_i::CancelThread()
+{
+  _CanceledThread = true;
+}
+
 //=============================================================================
 /*! 
  *  C++ method: Send message to event channel
index acdbe7f632d5e17fdfb3ee14c613e8904473251e..9b2174d4602eb7d9281f19a04e844d6ddabedf0c 100644 (file)
@@ -905,6 +905,11 @@ void ActSigIntHandler()
       perror("SALOME_Container main ") ;
       exit(0) ;
     }
+  if ( sigaction( SIGUSR2 , &SigIntAct, NULL ) )
+    {
+      perror("SALOME_Container main ") ;
+      exit(0) ;
+    }
 
   //PAL9042 JR : during the execution of a Signal Handler (and of methods called through Signal Handlers)
   //             use of streams (and so on) should never be used because :
@@ -922,6 +927,7 @@ void ActSigIntHandler()
 }
 
 void SetCpuUsed() ;
+void CallCancelThread() ;
 
 #ifndef WNT
 void SigIntHandler(int what ,
@@ -952,6 +958,10 @@ void SigIntHandler(int what ,
        {
          SetCpuUsed() ;
        }
+      else if ( siginfo->si_signo == SIGUSR2 )
+       {
+         CallCancelThread() ;
+       }
       else 
        {
          _Sleeping = true ;
index 3d988b4a445da427827aecbd9291389d98510ac4..6b4261d7834dbb88b8c10ce3f2edf5c5c448efb2 100644 (file)
@@ -126,6 +126,7 @@ public:
   bool Killer( pthread_t ThreadId , int signum );
   void SetCurCpu() ;
   long CpuUsed() ;
+  void CancelThread() ;
 
 protected:
   int _studyId; // -1: not initialised; 0: multiStudy; >0: study
@@ -157,6 +158,7 @@ private:
   long      _StartUsed ;
   long      _ThreadCpuUsed ;
   bool      _Executed ;
+  bool      _CanceledThread ;
 };
 
 #endif