]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
CCAR: add a timeout for DSC/CALCIUM reads
authorcaremoli <caremoli>
Mon, 28 Sep 2009 13:54:34 +0000 (13:54 +0000)
committercaremoli <caremoli>
Mon, 28 Sep 2009 13:54:34 +0000 (13:54 +0000)
If a read (cplxxx) is waiting more than the value given by the environment
variable DSC_TIMEOUT, the read is interrupted and an exception is raised.
If DSC_TIMEOUT is not set or its value is 0, the timeout is infinite.
It is possible to set the timeout by using the properties of the component.
The value of a property is set in an environment variable with the same
name by a call to beginService

src/DSC/DSC_Python/calcium.i
src/DSC/DSC_Python/dsccalcium.py
src/DSC/DSC_User/Datastream/Calcium/CalciumCxxInterface.hxx
src/DSC/DSC_User/Datastream/GenericPort.hxx
src/DSC/DSC_User/Superv_Component_i.cxx
src/DSC/DSC_User/Superv_Component_i.hxx

index 768cb438c2c5c6a751ce36f891507dccfa40dbf1..bc504c30fd9e02b3d75a641bc096057e62fd98ec 100644 (file)
@@ -419,7 +419,6 @@ struct stringArray
   }
   ~stringArray() 
   {
-    std::cerr << "~stringArray() " << nelem << std::endl;
     for(int i=0;i<nelem;i++)
       free(data[i]);
     delete [] data;
@@ -636,13 +635,16 @@ CORBAPTR(PortableServer::POA)
 %typemap(out) Ports::Port_ptr 
 {
   $result = api->cxxObjRefToPyObjRef($1, 1);
-  //All output Ports::Port_ptr variables are duplicated by security. Need to release them for python . Explanation ??
+  //All output Ports::Port_ptr variables are duplicated by security. Need to release them for python.
   CORBA::release($1);
 }
 
 %typemap(out) Ports::PortProperties_ptr, Engines::Salome_file_ptr
 {
   $result = api->cxxObjRefToPyObjRef($1, 1);
+  //the _ptr is duplicated by the routine called. 
+  //Need to release it for Python because the call to cxxObjRefToPyObjRef has created another ref with a count of 1
+  CORBA::release($1);
 }
 
 %typemap(out) Engines::DSC::uses_port *
@@ -801,6 +803,7 @@ class PySupervCompo:public Superv_Component_i
   CORBA::Boolean is_connected(const char* port_name) throw (Engines::DSC::PortNotDefined);
 // End of DSC interface for python components
 
+   static void setTimeOut();
 
 
     %extend
index 6aa2d6c4b98259beef7d775f60b1b8165db5fe1a..e4d4b7f1cb2af04bd2737d4941d01c46f56c3388 100644 (file)
@@ -96,3 +96,7 @@ class PyDSCComponent(SALOME_ComponentPy.SALOME_ComponentPy_i,
   def checkOutputFilesToService(self,service_name):
     return self.proxy.checkOutputFilesToService(service_name)
 
+  def beginService(self,service_name):
+    SALOME_ComponentPy.SALOME_ComponentPy_i.beginService(self,service_name)
+    self.proxy.setTimeOut()
+
index 4b766d3b73166db01c576fe7ea5c0b1d07f76b8f..18738f46ad158d4ec9926f62598d83a47a28cb02 100644 (file)
@@ -259,36 +259,60 @@ namespace CalciumInterface {
     std::stringstream msgout,msg;
     if ( _dependencyType == CalciumTypes::TIME_DEPENDENCY ) 
       {
-        double   tt=ti;
-        msg << "ti=" << ti << ", tf=" << tf ;
-        writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),0,msg.str().c_str());
-        corbaData = port->get(tt,tf, 0);
-        msgout << "read t=" << tt ;
+        try
+          {
+            double   tt=ti;
+            msg << "ti=" << ti << ", tf=" << tf ;
+            writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),0,msg.str().c_str());
+            corbaData = port->get(tt,tf, 0);
+            msgout << "read t=" << tt ;
 #ifdef MYDEBUG
-        std::cout << "-------- CalciumInterface(ecp_lecture) MARK 5 ------------------" << std::endl;
+            std::cout << "-------- CalciumInterface(ecp_lecture) MARK 5 ------------------" << std::endl;
 #endif
+          }
+        catch ( const DSC_Exception & ex)
+          {
+            writeEvent("END_READ",containerName,componentName,nomVar.c_str(),0,ex.what());
+            throw;
+          }
       } 
     else if ( _dependencyType == CalciumTypes::ITERATION_DEPENDENCY ) 
       {
-        msg << "i=" << i ;
-        writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),0,msg.str().c_str());
-        corbaData = port->get(0, i);
-        msgout << "read i=" << i ;
+        try
+          {
+            msg << "i=" << i ;
+            writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),0,msg.str().c_str());
+            corbaData = port->get(0, i);
+            msgout << "read i=" << i ;
 #ifdef MYDEBUG
-        std::cout << "-------- CalciumInterface(ecp_lecture) MARK 6 ------------------" << std::endl;
+            std::cout << "-------- CalciumInterface(ecp_lecture) MARK 6 ------------------" << std::endl;
 #endif
+          }
+        catch ( const DSC_Exception & ex)
+          {
+            writeEvent("END_READ",containerName,componentName,nomVar.c_str(),0,ex.what());
+            throw;
+          }
       } 
     else 
       {
         // Sequential read
+        try
+          {
 #ifdef MYDEBUG
-        std::cout << "-------- CalciumInterface(ecp_lecture) MARK 7 ------------------" << std::endl;
+            std::cout << "-------- CalciumInterface(ecp_lecture) MARK 7 ------------------" << std::endl;
 #endif
-        writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),0,"Sequential read");
-        corbaData = port->next(ti,i);
-        msgout << "read ";
-        if(i==0)msgout<< "t=" <<ti;
-        else msgout<< "i=" <<i;
+            writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),0,"Sequential read");
+            corbaData = port->next(ti,i);
+            msgout << "read ";
+            if(i==0)msgout<< "t=" <<ti;
+            else msgout<< "i=" <<i;
+          }
+        catch ( const DSC_Exception & ex)
+          {
+            writeEvent("END_READ",containerName,componentName,nomVar.c_str(),0,ex.what());
+            throw;
+          }
       }
  
 #ifdef MYDEBUG
index 9a3a5d58d00115172d1932ecafa4c267212cf0f9..ba046314e7d8da89a2803309e3a54029b4753064 100644 (file)
 
 #include "CorbaTypeManipulator.hxx"
 
+#include "Superv_Component_i.hxx"
 // SALOME CORBA Exception
 #include "Utils_CorbaException.hxx"
 // SALOME C++   Exception
 #include "Utils_SALOME_Exception.hxx"
+#include "DSC_Exception.hxx"
 #include "utilities.h"
 
 #include <iostream>
@@ -116,7 +118,7 @@ GenericPort<DataManipulator, COUPLING_POLICY>::~GenericPort() {
 
 template < typename DataManipulator, typename COUPLING_POLICY> void 
 GenericPort<DataManipulator, COUPLING_POLICY>::close (PortableServer::POA_var poa, 
-                                                     PortableServer::ObjectId_var id) {
+                                                      PortableServer::ObjectId_var id) {
   // Ferme le port en supprimant le servant
   // La desactivation du servant du POA provoque sa suppression
   poa->deactivate_object (id);
@@ -148,8 +150,8 @@ GenericPort<DataManipulator, COUPLING_POLICY>::wakeupWaiting()
 template < typename DataManipulator, typename COUPLING_POLICY>
 template < typename TimeType,typename TagType>
 void GenericPort<DataManipulator, COUPLING_POLICY>::put(CorbaInDataType dataParam, 
-                                                       TimeType time, 
-                                                       TagType  tag) {
+                                                        TimeType time, 
+                                                        TagType  tag) {
   fflush(stdout);
   fflush(stderr);
   try {
@@ -229,25 +231,25 @@ void GenericPort<DataManipulator, COUPLING_POLICY>::put(CorbaInDataType dataPara
 #endif
 
       // On n'a pas trouvé de dataId supérieur au notre ou 
-      // on a trouvé une clé >  à cet Id         
+      // on a trouvé une clé >  à cet Id          
       if (wDataIt == storedDatas.end() || storedDatas.key_comp()(currentDataId,(*wDataIt).first) ) {
 #ifdef MYDEBUG
-       std::cout << "-------- Put : MARK 6 ------------------" << std::endl;
+        std::cout << "-------- Put : MARK 6 ------------------" << std::endl;
 #endif
-       // Ajoute la donnee dans la table
-       wDataIt = storedDatas.insert(wDataIt, make_pair (currentDataId, data));
+        // Ajoute la donnee dans la table
+        wDataIt = storedDatas.insert(wDataIt, make_pair (currentDataId, data));
       } else  {
-       // Si on n'est pas en fin de liste et qu'il n'y a pas de relation d'ordre strict
-       // entre notre dataId et le DataId pointé c'est qu'ils sont identiques
+        // Si on n'est pas en fin de liste et qu'il n'y a pas de relation d'ordre strict
+        // entre notre dataId et le DataId pointé c'est qu'ils sont identiques
 #ifdef MYDEBUG
-       std::cout << "-------- Put : MARK 7 ------------------" << std::endl;
+        std::cout << "-------- Put : MARK 7 ------------------" << std::endl;
 #endif
-       // Les données sont remplacées par les nouvelles valeurs
-       // lorsque que le dataId existe déjà
-       DataType old_data = (*wDataIt).second;
-       (*wDataIt).second = data;
-       // Detruit la vieille donnee
-       DataManipulator::delete_data (old_data);
+        // Les données sont remplacées par les nouvelles valeurs
+        // lorsque que le dataId existe déjà
+        DataType old_data = (*wDataIt).second;
+        (*wDataIt).second = data;
+        // Detruit la vieille donnee
+        DataManipulator::delete_data (old_data);
       }
   
 #ifdef MYDEBUG
@@ -278,14 +280,14 @@ void GenericPort<DataManipulator, COUPLING_POLICY>::put(CorbaInDataType dataPara
       // sur les dataIds (à cause du lock utilisé dans la méthode put et les méthodes get )
       // rem : Utilisation de l'évaluation gauche droite du logical C or
       if ( waitingForAnyDataId || 
-          ( waitingForConvenientDataId && 
-            isDataIdConveniant(storedDatas, expectedDataId, dummy1, dummy2, dummy3) ) 
-          ) {
+           ( waitingForConvenientDataId && 
+             isDataIdConveniant(storedDatas, expectedDataId, dummy1, dummy2, dummy3) ) 
+           ) {
 #ifdef MYDEBUG
-       std::cout << "-------- Put : MARK 10 ------------------" << std::endl;
+        std::cout << "-------- Put : MARK 10 ------------------" << std::endl;
 #endif
-       //Doit pouvoir réveiller le get ici (a vérifier)
-       expectedDataReceived = true;
+        //Doit pouvoir réveiller le get ici (a vérifier)
+        expectedDataReceived = true;
       }
     }
    
@@ -296,9 +298,9 @@ void GenericPort<DataManipulator, COUPLING_POLICY>::put(CorbaInDataType dataPara
       // si waitingForAnyDataId était positionné, c'est forcément lui qui a activer
       // expectedDataReceived à true
       if (waitingForAnyDataId) 
-       waitingForAnyDataId        = false;
+        waitingForAnyDataId        = false;
       else 
-       waitingForConvenientDataId = false;
+        waitingForConvenientDataId = false;
       // Reveille le thread du destinataire (stoppe son attente)
       // Ne faudrait-il pas réveiller plutôt tous les threads ?
       // Celui  réveillé ne correspond pas forcément à celui qui demande
@@ -348,7 +350,7 @@ template < typename DataManipulator, typename COUPLING_POLICY >
 template < typename TimeType,typename TagType>
 typename DataManipulator::Type 
 GenericPort<DataManipulator, COUPLING_POLICY>::get(TimeType time, 
-                                                  TagType  tag)
+                                                   TagType  tag)
 // REM : Laisse passer toutes les exceptions
 //       En particulier les SALOME_Exceptions qui viennent de la COUPLING_POLICY
 //       Pour déclarer le throw avec l'exception spécifique il faut que je vérifie
@@ -390,33 +392,33 @@ GenericPort<DataManipulator, COUPLING_POLICY>::get(TimeType time,
       if ( isEqual ) {
  
 #ifdef MYDEBUG
-       std::cout << "-------- Get : MARK 4 ------------------" << std::endl;
+        std::cout << "-------- Get : MARK 4 ------------------" << std::endl;
 #endif
-       // La propriété de la données N'EST PAS transmise à l'utilisateur en mode CALCIUM.
-       // Si l'utilisateur supprime la donnée, storedDataIds devient incohérent
-       // C'est EraseDataId qui choisi ou non de supprimer la donnée
-       // Du coup interaction potentielle entre le 0 copy et gestion de l'historique
-       dataToTransmit = (*wDataIt1).second; 
+        // La propriété de la données N'EST PAS transmise à l'utilisateur en mode CALCIUM.
+        // Si l'utilisateur supprime la donnée, storedDataIds devient incohérent
+        // C'est EraseDataId qui choisi ou non de supprimer la donnée
+        // Du coup interaction potentielle entre le 0 copy et gestion de l'historique
+        dataToTransmit = (*wDataIt1).second; 
 
 #ifdef MYDEBUG
-       std::cout << "-------- Get : MARK 5 ------------------" << std::endl;
-       std::cout << "-------- Get : Données trouvées à t : " << std::endl;
-       typename DataManipulator::InnerType const * const InIt1 = DataManipulator::getPointer(dataToTransmit);
-       size_t   N = DataManipulator::size(dataToTransmit);
-       std::copy(InIt1,        InIt1 + N,
-                 std::ostream_iterator< InnerType > (std::cout," "));
-       std::cout << std::endl;
+        std::cout << "-------- Get : MARK 5 ------------------" << std::endl;
+        std::cout << "-------- Get : Données trouvées à t : " << std::endl;
+        typename DataManipulator::InnerType const * const InIt1 = DataManipulator::getPointer(dataToTransmit);
+        size_t   N = DataManipulator::size(dataToTransmit);
+        std::copy(InIt1,        InIt1 + N,
+                  std::ostream_iterator< InnerType > (std::cout," "));
+        std::cout << std::endl;
 #endif
 
-       // Décide de la suppression de certaines  instances de données 
-       // La donnée contenu dans la structure CORBA et son dataId sont désallouées
-       // Méthode provenant de la COUPLING_POLICY 
-       typename COUPLING_POLICY::template EraseDataIdProcessor<DataManipulator> processEraseDataId(*this);
-       processEraseDataId.apply(storedDatas,wDataIt1);
+        // Décide de la suppression de certaines  instances de données 
+        // La donnée contenu dans la structure CORBA et son dataId sont désallouées
+        // Méthode provenant de la COUPLING_POLICY 
+        typename COUPLING_POLICY::template EraseDataIdProcessor<DataManipulator> processEraseDataId(*this);
+        processEraseDataId.apply(storedDatas,wDataIt1);
 #ifdef MYDEBUG
-       std::cout << "-------- Get : MARK 6 ------------------" << std::endl;
+        std::cout << "-------- Get : MARK 6 ------------------" << std::endl;
 #endif
-       break;
+        break;
 
       }
 #ifdef MYDEBUG
@@ -427,45 +429,45 @@ GenericPort<DataManipulator, COUPLING_POLICY>::get(TimeType time,
       // Le DataId demandé n'est pas trouvé mais est encadré ET la politique de couplage
       // implémente une méthode processBoundedDataId capable de générer les données à retourner
       if (  isBounded ) {
-       // Pour être cohérent avec la politique du bloc précédent
-       // on stocke la paire (dataId,données interpolées ).
-       // CALCIUM ne stockait pas les données interpolées. 
-       // Cependant  comme les données sont censées être produites
-       // par ordre croissant de DataId, de nouvelles données ne devrait pas améliorer
-       // l'interpolation.
-#ifdef MYDEBUG
-       std::cout << "-------- Get : MARK 8 ------------------" << std::endl;
-#endif
-
-       typedef typename COUPLING_POLICY::template BoundedDataIdProcessor<DataManipulator> BDI;
-       BDI processBoundedDataId(*this);
-       //      typename COUPLING_POLICY::template BoundedDataIdProcessor<DataManipulator> processBoundedDataId(*this);
-       //si static BDIP::apply(dataToTransmit,expectedDataId,wDataIt1);
-       //ancienne version template processBoundedDataId<DataManipulator>(dataToTransmit,expectedDataId,wDataIt1);
-       //BDIP processBoundedDataId;
-       processBoundedDataId.apply(dataToTransmit,expectedDataId,wDataIt1);
+        // Pour être cohérent avec la politique du bloc précédent
+        // on stocke la paire (dataId,données interpolées ).
+        // CALCIUM ne stockait pas les données interpolées. 
+        // Cependant  comme les données sont censées être produites
+        // par ordre croissant de DataId, de nouvelles données ne devrait pas améliorer
+        // l'interpolation.
+#ifdef MYDEBUG
+        std::cout << "-------- Get : MARK 8 ------------------" << std::endl;
+#endif
+
+        typedef typename COUPLING_POLICY::template BoundedDataIdProcessor<DataManipulator> BDI;
+        BDI processBoundedDataId(*this);
+        //        typename COUPLING_POLICY::template BoundedDataIdProcessor<DataManipulator> processBoundedDataId(*this);
+        //si static BDIP::apply(dataToTransmit,expectedDataId,wDataIt1);
+        //ancienne version template processBoundedDataId<DataManipulator>(dataToTransmit,expectedDataId,wDataIt1);
+        //BDIP processBoundedDataId;
+        processBoundedDataId.apply(dataToTransmit,expectedDataId,wDataIt1);
   
-       // Il ne peut pas y avoir déjà une clé expectedDataId dans storedDatas (utilisation de la notation [] )
-       // La nouvelle donnée produite est stockée, ce n'était pas le cas dans CALCIUM
-       // Cette opération n'a peut être pas un caractère générique.
-       // A déplacer en paramètre de la méthode précédente ? ou déléguer ce choix au mode de couplage ?
-       storedDatas[expectedDataId]=dataToTransmit;
+        // Il ne peut pas y avoir déjà une clé expectedDataId dans storedDatas (utilisation de la notation [] )
+        // La nouvelle donnée produite est stockée, ce n'était pas le cas dans CALCIUM
+        // Cette opération n'a peut être pas un caractère générique.
+        // A déplacer en paramètre de la méthode précédente ? ou déléguer ce choix au mode de couplage ?
+        storedDatas[expectedDataId]=dataToTransmit;
 
 #ifdef MYDEBUG
-       std::cout << "-------- Get : Données calculées à t : " << std::endl;
-       typename DataManipulator::InnerType const * const InIt1 = DataManipulator::getPointer(dataToTransmit);
-       size_t   N = DataManipulator::size(dataToTransmit);
+        std::cout << "-------- Get : Données calculées à t : " << std::endl;
+        typename DataManipulator::InnerType const * const InIt1 = DataManipulator::getPointer(dataToTransmit);
+        size_t   N = DataManipulator::size(dataToTransmit);
  
-       std::copy(InIt1,        InIt1 + N,
-                 std::ostream_iterator< InnerType > (std::cout," "));
-       std::cout << std::endl;
-       std::cout << "-------- Get : MARK 9 ------------------" << std::endl;
+        std::copy(InIt1,        InIt1 + N,
+                  std::ostream_iterator< InnerType > (std::cout," "));
+        std::cout << std::endl;
+        std::cout << "-------- Get : MARK 9 ------------------" << std::endl;
 #endif
 
-       typename COUPLING_POLICY::template EraseDataIdProcessor<DataManipulator> processEraseDataId(*this);
-       processEraseDataId.apply(storedDatas,wDataIt1);
+        typename COUPLING_POLICY::template EraseDataIdProcessor<DataManipulator> processEraseDataId(*this);
+        processEraseDataId.apply(storedDatas,wDataIt1);
    
-       break;
+        break;
       }
   
       // Délègue au mode de couplage la gestion d'une demande de donnée non disponible 
@@ -487,7 +489,23 @@ GenericPort<DataManipulator, COUPLING_POLICY>::get(TimeType time,
       std::cout << "-------- Get : waiting datas ------------------" << std::endl;
 #endif
       fflush(stdout);fflush(stderr);
-      cond_instance.wait();
+      unsigned long ts, tns,rs=Superv_Component_i::dscTimeOut;
+      if(rs==0)
+        cond_instance.wait();
+      else
+        {
+          //Timed wait on omni condition
+          omni_thread::get_time(&ts,&tns, rs,0);
+          int success=cond_instance.timedwait(ts,tns);
+          if(!success)
+            {
+              // Waiting too long probably blocking
+              std::stringstream msg;
+              msg<<"Timeout ("<<rs<<" s) exceeded";
+              throw DSC_Exception(msg.str());
+            }
+        }
+
 
 #ifdef MYDEBUG
       std::cout << "-------- Get : MARK 12 ------------------" << std::endl;
@@ -518,8 +536,8 @@ template < typename DataManipulator, typename COUPLING_POLICY >
 template < typename TimeType,typename TagType>
 typename DataManipulator::Type 
 GenericPort<DataManipulator, COUPLING_POLICY>::get(TimeType& ti,
-                                                  TimeType tf, 
-                                                  TagType  tag ) {
+                                                   TimeType tf, 
+                                                   TagType  tag ) {
   ti = COUPLING_POLICY::getEffectiveTime(ti,tf);
   return get(ti,tag);
 }
@@ -531,7 +549,7 @@ template < typename DataManipulator, typename COUPLING_POLICY >
 template < typename TimeType,typename TagType>
 typename DataManipulator::Type 
 GenericPort<DataManipulator, COUPLING_POLICY>::next(TimeType &t,
-                                                   TagType  &tag ) {
+                                                    TagType  &tag ) {
  
   typedef  typename COUPLING_POLICY::DataId DataId;
 
@@ -571,7 +589,7 @@ GenericPort<DataManipulator, COUPLING_POLICY>::next(TimeType &t,
       // Délègue au mode de couplage la gestion d'une demande de donnée non disponible 
       // si le port est deconnecté
       if ( processDisconnect.apply(storedDatas, lastDataId, wDataIt1) )  {
-       waitingForAnyDataId = false; break;
+        waitingForAnyDataId = false; break;
       }
   
 #ifdef MYDEBUG
@@ -585,19 +603,34 @@ GenericPort<DataManipulator, COUPLING_POLICY>::next(TimeType &t,
       std::cout << "-------- Next : waiting datas ------------------" << std::endl;
 #endif
       fflush(stdout);fflush(stderr);
-      cond_instance.wait();
+      unsigned long ts, tns,rs=Superv_Component_i::dscTimeOut;
+      if(rs==0)
+        cond_instance.wait();
+      else
+        {
+          //Timed wait on omni condition
+          omni_thread::get_time(&ts,&tns, rs,0);
+          int success=cond_instance.timedwait(ts,tns);
+          if(!success)
+            {
+              // Waiting too long probably blocking
+              std::stringstream msg;
+              msg<<"Timeout ("<<rs<<" s) exceeded";
+              throw DSC_Exception(msg.str());
+            }
+        }
 
       if (lastDataIdSet) {
 #ifdef MYDEBUG
-       std::cout << "-------- Next : MARK 4 ------------------" << std::endl;
+        std::cout << "-------- Next : MARK 4 ------------------" << std::endl;
 #endif
-       wDataIt1 = storedDatas.upper_bound(lastDataId);
+        wDataIt1 = storedDatas.upper_bound(lastDataId);
       } else  {
 #ifdef MYDEBUG
-       std::cout << "-------- Next : MARK 5 ------------------" << std::endl;
+        std::cout << "-------- Next : MARK 5 ------------------" << std::endl;
 #endif
-       lastDataIdSet = true;
-       wDataIt1      = storedDatas.begin();
+        lastDataIdSet = true;
+        wDataIt1      = storedDatas.begin();
       }
     }
 
index 0eede3e6432139cb2cb3b7cf513c4c509a7f91b7..c35017d3db7cb0a40b6b13580f8a5c129966ebff 100644 (file)
@@ -36,6 +36,8 @@ DSC_EXCEPTION_CXX(Superv_Component_i,NilPort);
 DSC_EXCEPTION_CXX(Superv_Component_i,BadProperty);
 
 std::map<std::string, port_factory*> Superv_Component_i::_factory_map;
+long Superv_Component_i::dscTimeOut=0;
+
 
 Superv_Component_i::Superv_Component_i(CORBA::ORB_ptr orb,
                                       PortableServer::POA_ptr poa,
@@ -48,6 +50,7 @@ Superv_Component_i::Superv_Component_i(CORBA::ORB_ptr orb,
 #ifdef MYDEBUG
   std::cerr << "--Superv_Component_i : MARK 1 ----  " << instanceName << "----" << std::endl;
 #endif
+  setTimeOut();
 }
 Superv_Component_i::Superv_Component_i(CORBA::ORB_ptr orb,
                                       PortableServer::POA_ptr poa,
@@ -61,6 +64,7 @@ Superv_Component_i::Superv_Component_i(CORBA::ORB_ptr orb,
 #ifdef MYDEBUG
   std::cerr << "--Superv_Component_i : MARK 1 ----  " << instanceName << "----" << std::endl;
 #endif
+  setTimeOut();
 }
 
   
@@ -318,3 +322,22 @@ Superv_Component_i::get_uses_port_names(std::vector<std::string> & port_names,
   for (it=my_superv_ports.begin(); it!=my_superv_ports.end();++it)
     if( (*it).second->p_ref == NULL ) port_names.push_back((*it).first);
 }
+
+void Superv_Component_i::setTimeOut()
+{
+  char* valenv=getenv("DSC_TIMEOUT");
+  if(valenv)
+    {
+      std::istringstream iss(valenv);
+      long temp;
+      if (iss >> temp)
+        if(temp >=0)
+          Superv_Component_i::dscTimeOut=temp;
+    }
+}
+
+void Superv_Component_i::beginService(const char *serviceName)
+{
+  Engines_DSC_i::beginService(serviceName);
+  setTimeOut();
+}
index 6c7b1590ec2d0c9301d76428121ae867f9eff7bb..246118160e2db9cb1d7583a7f9cd2141c6588719 100644 (file)
@@ -44,7 +44,7 @@
  *  a programming level for service's developpers who want to use DSC ports.
  *
  *  This class has two level for using and declare ports. The higher level proposes
- *  operations to add ports that are provided by default by Salomé like Calcium ports.
+ *  operations to add ports that are provided by default by SALOME like Calcium ports.
  *  It provides too some methods to add their own DSC_User ports.
  *
  *  \note This class doesn't implement the init_service CORBA operation.
@@ -256,6 +256,12 @@ public:
    */
   virtual port_factory * get_factory(const std::string & factory_name);
 
+  /*!
+   */
+  static long dscTimeOut;
+  static void setTimeOut();
+  void beginService(const char *serviceName);
+
 private:   
   // Factory map
   typedef std::map<std::string, port_factory*> factory_map_t;
@@ -384,8 +390,7 @@ Superv_Component_i::get_port( const char * port_name)
   
   retPort = dynamic_cast<SpecificPortType *>(port);
   if ( retPort == NULL ) {
-    delete port; 
-    throw BadCast( LOC("Can't cast to asked port type " ));
+    throw BadCast( LOC("Can't cast to required port type " ));
   }
 
   return retPort;