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()
}
}
+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);
{
public:
virtual void notifyObserver(Node* object,const std::string& event);
+ virtual void notifyObserver2(Node* object,const std::string& event, void *something);
virtual ~Observer();
};
{
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();
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
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
*/
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; }
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;
#include "LinkInfo.hxx"
#include "TypeCode.hxx"
#include "Proc.hxx"
+#include "Dispatcher.hxx"
#include "PythonPorts.hxx"
#include "ForEachLoop.hxx"
{
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 ;
+ }
}
/////////////////////
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