Salome HOME
Signal emission for precise track of ForEachLoop
authorAnthony Geay <anthony.geay@edf.fr>
Tue, 19 Jul 2016 17:17:33 +0000 (19:17 +0200)
committerAnthony Geay <anthony.geay@edf.fr>
Tue, 19 Jul 2016 17:17:33 +0000 (19:17 +0200)
src/engine/Dispatcher.cxx
src/engine/Dispatcher.hxx
src/engine/ForEachLoop.cxx
src/engine/Node.cxx
src/engine/Node.hxx
src/evalyfx/YACSEvalObserver.hxx
src/evalyfx/YACSEvalYFXPattern.cxx

index c9165ba91c641f17d0e860d0d85d0abda26f7945..8ca796b751824cff41ebac4c01b29a5a84002246 100644 (file)
@@ -35,6 +35,11 @@ void Observer::notifyObserver(Node* object, const std::string& event)
   DEBTRACE("notifyObserver " << event << object );
 }
 
+void Observer::notifyObserver2(Node* object,const std::string& event, void *something)
+{
+  DEBTRACE("notifyObserver2 " << event << object );
+}
+
 Dispatcher* Dispatcher::_singleton = 0;
 
 Dispatcher::~Dispatcher()
@@ -86,6 +91,19 @@ void Dispatcher::dispatch(Node* object, const std::string& event)
     }
 }
 
+void Dispatcher::dispatch2(Node* object,const std::string& event, void *something)
+{
+  typedef std::set<Observer*>::iterator jt;
+  std::pair<Node*,std::string> key(object,event);
+  if(_observers.count(key) != 0)
+    {
+      for(jt iter=_observers[key].begin();iter!=_observers[key].end();iter++)
+        {
+          (*iter)->notifyObserver2(object,event,something);
+        }
+    }
+}
+
 void Dispatcher::addObserver(Observer* observer,Node* object, const std::string& event)
 {
   _observers[std::pair<Node*,std::string>(object,event)].insert(observer);
index 574bc19def0b0ca9fc0ff64b6efc63bb70d4d528..26e46e2941ebed18c73a29b951121457bf0d74c9 100644 (file)
@@ -46,6 +46,7 @@ namespace YACS
     {
     public:
       virtual void notifyObserver(Node* object,const std::string& event);
+      virtual void notifyObserver2(Node* object,const std::string& event, void *something);
       virtual ~Observer();
     };
 
@@ -72,6 +73,7 @@ namespace YACS
     {
     public:
       virtual void dispatch(Node* object,const std::string& event);
+      virtual void dispatch2(Node* object,const std::string& event, void *something);
       virtual void addObserver(Observer* observer,Node* object,const std::string& event);
       virtual void removeObserver(Observer* observer,Node* object,const std::string& event);
       virtual void printObservers();
index 67aa186631f98b24d85185131e1b2234b6e13ca6..94d54b95f2fdf4d2e768d76c059cc1d8ff955181 100644 (file)
@@ -761,8 +761,16 @@ YACS::Event ForEachLoop::updateStateForWorkNodeOnFinishedEventFrom(Node *node, u
       int globalId(_execIds[id]);
       if(_passedData)
         globalId=_passedData->toAbsId(globalId);
+      sendEvent2("progress_ok",&globalId);
       storeOutValsInSeqForOutOfScopeUse(globalId,id);
     }
+  else
+    {
+      int globalId(_execIds[id]);
+      if(_passedData)
+        globalId=_passedData->toAbsId(globalId);
+      sendEvent2("progress_ko",&id);
+    }
   //
   if(_execCurrentId==getFinishedId())
     {//No more elements of _dataPortToDispatch to treat
index 15fd814f5a9373b29ad8dcdba21a0f148a178868..0c633c86e549b1c87703e0362cd851d45e0eee85 100644 (file)
@@ -660,6 +660,16 @@ void Node::sendEvent(const std::string& event)
   disp->dispatch(this,event);
 }
 
+//! emit notification to all observers registered with  the dispatcher 
+/*!
+ * The dispatcher is unique and can be obtained by getDispatcher()
+ */
+void Node::sendEvent2(const std::string& event, void *something)
+{
+  Dispatcher* disp=Dispatcher::getDispatcher();
+  disp->dispatch2(this,event,something);
+}
+
 /*!
  *  For use only when loading a previously saved execution
  */
index 0abcd951633b133df7618439f7a8ef217ce1c32c..f7d4623940dc2f0449b62939f69bdb5bbde0a36a 100644 (file)
@@ -177,6 +177,7 @@ namespace YACS
       std::vector<std::pair<std::string,int> > getDPLScopeInfo(ComposedNode *gfn);
       virtual void applyDPLScope(ComposedNode *gfn);
       virtual void sendEvent(const std::string& event);
+      virtual void sendEvent2(const std::string& event, void *something);
       static std::map<int,Node *> idMap;
       virtual std::string typeName() { return "YACS__ENGINE__Node"; }
       virtual std::string getErrorDetails() const { return _errorDetails; }
index c63b10725cc7fef031d5e28b9c6cba3165559094..58a82806042661ed946c10cf0c49a2ea514e61e4 100644 (file)
@@ -35,11 +35,12 @@ public:
   YACSEVALYFX_EXPORT void incrRef() const;
   YACSEVALYFX_EXPORT bool decrRef() const;
   YACSEVALYFX_EXPORT int getCnt() const { return _cnt; }
-  YACSEVALYFX_EXPORT virtual void notifyNumberOfSamplesToEval(YACSEvalYFX *sender, int nbOfSamples) = 0;
-  YACSEVALYFX_EXPORT virtual void notifyNewNumberOfPassedItems(YACSEvalYFX *sender, int sampleId) = 0;
+  YACSEVALYFX_EXPORT virtual void startComputation(YACSEvalYFX *sender) = 0;
+  YACSEVALYFX_EXPORT virtual void notifySampleOK(YACSEvalYFX *sender, int sampleId) = 0;
+  YACSEVALYFX_EXPORT virtual void notifySampleKO(YACSEvalYFX *sender, int sampleId) = 0;
   //YACSEVALYFX_EXPORT virtual void warningHappen(const std::string& warnDetails) = 0;
   //YACSEVALYFX_EXPORT virtual void errorHappen(const std::string& errorDetails) = 0;
-private:
+protected:
   virtual ~YACSEvalObserver() { }
 private:
   mutable int _cnt;
index 6de18f31fc5dff0696a7cd6131cf0f49dd55b495..8da34b14f8653e48292cead5ed4e36b9bc576c43 100644 (file)
@@ -34,6 +34,7 @@
 #include "LinkInfo.hxx"
 #include "TypeCode.hxx"
 #include "Proc.hxx"
+#include "Dispatcher.hxx"
 
 #include "PythonPorts.hxx"
 #include "ForEachLoop.hxx"
@@ -297,21 +298,29 @@ class YACSEvalYFXRunOnlyPatternInternalObserver : public YACS::ENGINE::Observer
 {
 public:
   YACSEvalYFXRunOnlyPatternInternalObserver(YACSEvalYFXRunOnlyPattern *boss):_boss(boss) { if(!_boss) throw YACS::Exception("YACSEvalYFXRunOnlyPatternInternalObserver constructor : null boss not supported :)"); }
-  void notifyObserver(YACS::ENGINE::Node *object, const std::string& event);
+  void notifyObserver2(YACS::ENGINE::Node *object, const std::string& event, void *something);
 private:
   YACSEvalYFXRunOnlyPattern *_boss;
 };
 
-void YACSEvalYFXRunOnlyPatternInternalObserver::notifyObserver(YACS::ENGINE::Node *object, const std::string& event)
+void YACSEvalYFXRunOnlyPatternInternalObserver::notifyObserver2(YACS::ENGINE::Node *object, const std::string& event, void *something)
 {
-  YACS::ENGINE::ForEachLoop *object2(dynamic_cast<YACS::ENGINE::ForEachLoop *>(object));
-  if(!object2)
-    return ;
+  YACS::ENGINE::ForEachLoop *object2(_boss->getUndergroundForEach());
   YACSEvalObserver *obs(_boss->getObserver());
   if(!obs)
     return ;
-  if(event=="progress")
-    obs->notifyNewNumberOfPassedItems(_boss->getBoss(),object2->getCurrentIndex());
+  if(event=="progress_ok" && object2==object)
+    {
+      int *casted(reinterpret_cast<int *>(something));
+      obs->notifySampleOK(_boss->getBoss(),*casted);
+      return ;
+    }
+  if(event=="progress_ko" && object2==object)
+    {
+      int *casted(reinterpret_cast<int *>(something));
+      obs->notifySampleKO(_boss->getBoss(),*casted);
+      return ;
+    }
 }
 
 /////////////////////
@@ -547,13 +556,19 @@ void YACSEvalYFXRunOnlyPattern::emitStart() const
   YACSEvalObserver *obs(getObserver());
   if(!obs)
     return ;
-  obs->notifyNumberOfSamplesToEval(getBoss(),getUndergroundForEach()->getNbOfElementsToBeProcessed());
+  obs->startComputation(getBoss());
 }
 
 bool YACSEvalYFXRunOnlyPattern::go(bool stopASAP, YACSEvalSession *session) const
 {
   emitStart();
-  return getGenerator()->go(stopASAP,session);
+  YACS::ENGINE::Dispatcher *disp(YACS::ENGINE::Dispatcher::getDispatcher());
+  disp->addObserver(_obs,getUndergroundForEach(),"progress_ok");
+  disp->addObserver(_obs,getUndergroundForEach(),"progress_ko");
+  bool ret(getGenerator()->go(stopASAP,session));
+  disp->removeObserver(_obs,getUndergroundForEach(),"progress_ok");
+  disp->removeObserver(_obs,getUndergroundForEach(),"progress_ko");
+  return ret;
 }
 
 YACS::ENGINE::ForEachLoop *YACSEvalYFXRunOnlyPattern::getUndergroundForEach() const