From 501fb5e916d7be268df8d0024837eb5965e66390 Mon Sep 17 00:00:00 2001 From: Anthony Geay Date: Tue, 19 Jul 2016 19:17:33 +0200 Subject: [PATCH] Signal emission for precise track of ForEachLoop --- src/engine/Dispatcher.cxx | 18 ++++++++++++++++ src/engine/Dispatcher.hxx | 2 ++ src/engine/ForEachLoop.cxx | 8 ++++++++ src/engine/Node.cxx | 10 +++++++++ src/engine/Node.hxx | 1 + src/evalyfx/YACSEvalObserver.hxx | 7 ++++--- src/evalyfx/YACSEvalYFXPattern.cxx | 33 ++++++++++++++++++++++-------- 7 files changed, 67 insertions(+), 12 deletions(-) diff --git a/src/engine/Dispatcher.cxx b/src/engine/Dispatcher.cxx index c9165ba91..8ca796b75 100644 --- a/src/engine/Dispatcher.cxx +++ b/src/engine/Dispatcher.cxx @@ -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::iterator jt; + std::pair 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(object,event)].insert(observer); diff --git a/src/engine/Dispatcher.hxx b/src/engine/Dispatcher.hxx index 574bc19de..26e46e294 100644 --- a/src/engine/Dispatcher.hxx +++ b/src/engine/Dispatcher.hxx @@ -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(); diff --git a/src/engine/ForEachLoop.cxx b/src/engine/ForEachLoop.cxx index 67aa18663..94d54b95f 100644 --- a/src/engine/ForEachLoop.cxx +++ b/src/engine/ForEachLoop.cxx @@ -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 diff --git a/src/engine/Node.cxx b/src/engine/Node.cxx index 15fd814f5..0c633c86e 100644 --- a/src/engine/Node.cxx +++ b/src/engine/Node.cxx @@ -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 */ diff --git a/src/engine/Node.hxx b/src/engine/Node.hxx index 0abcd9516..f7d462394 100644 --- a/src/engine/Node.hxx +++ b/src/engine/Node.hxx @@ -177,6 +177,7 @@ namespace YACS std::vector > 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 idMap; virtual std::string typeName() { return "YACS__ENGINE__Node"; } virtual std::string getErrorDetails() const { return _errorDetails; } diff --git a/src/evalyfx/YACSEvalObserver.hxx b/src/evalyfx/YACSEvalObserver.hxx index c63b10725..58a828060 100644 --- a/src/evalyfx/YACSEvalObserver.hxx +++ b/src/evalyfx/YACSEvalObserver.hxx @@ -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; diff --git a/src/evalyfx/YACSEvalYFXPattern.cxx b/src/evalyfx/YACSEvalYFXPattern.cxx index 6de18f31f..8da34b14f 100644 --- a/src/evalyfx/YACSEvalYFXPattern.cxx +++ b/src/evalyfx/YACSEvalYFXPattern.cxx @@ -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(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(something)); + obs->notifySampleOK(_boss->getBoss(),*casted); + return ; + } + if(event=="progress_ko" && object2==object) + { + int *casted(reinterpret_cast(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 -- 2.30.2