00001 #include "EventRouter.h"
00002 #include "Shared/Profiler.h"
00003 #include "Behaviors/BehaviorBase.h"
00004 #include "Shared/ProjectInterface.h"
00005 #include <algorithm>
00006 #include "Events/TimerEvent.h"
00007 #include "EventTranslator.h"
00008 #include "Shared/string_util.h"
00009 #include "Shared/debuget.h"
00010
00011 #ifndef TGT_IS_DYNAMIC
00012 # include "Events/RemoteRouter.h"
00013 # include "Events/EventProxy.h"
00014 #endif
00015
00016 #include <sstream>
00017
00018 #ifndef PLATFORM_APERIOS
00019 # include "IPC/Thread.h"
00020 # include "Shared/MarkScope.h"
00021 # include "IPC/ThreadedMessageQueue.h"
00022 #endif
00023
00024 EventRouter * erouter=NULL;
00025
00026 EventRouter::EventRouter() :
00027 #ifndef TGT_IS_DYNAMIC
00028 proxies(), rrouters(), sck(NULL), nextProxyPort(defaultPort+1),
00029 #endif
00030 timers(), trappers(), listeners(), postings()
00031 #ifndef PLATFORM_APERIOS
00032 , eventQueue(new ThreadedMessageQueue<EventBase*>)
00033 #endif
00034 {
00035 for(unsigned int i=0; i<ProcessID::NumProcesses; ++i) {
00036 forwards[i]=NULL;
00037 }
00038 }
00039
00040 EventRouter::~EventRouter() {
00041 #ifndef PLATFORM_APERIOS
00042 delete eventQueue;
00043 eventQueue=NULL;
00044 #endif
00045 reset();
00046 removeAllTimers();
00047 for(unsigned int i=0; i<ProcessID::NumProcesses; ++i) {
00048 delete forwards[i];
00049 forwards[i]=NULL;
00050 }
00051
00052 #ifndef TGT_IS_DYNAMIC
00053
00054
00055 for (std::list<EventProxy *>::iterator pi = proxies.begin(); pi != proxies.end(); pi++)
00056 delete *pi;
00057
00058
00059 for (std::map<int, RemoteRouter *>::iterator mi = rrouters.begin(); mi != rrouters.end(); mi++)
00060 delete (*mi).second;
00061 #endif
00062
00063 }
00064
00065 #ifndef PLATFORM_APERIOS
00066 void EventRouter::queueEvent(EventBase* e) { eventQueue->send(e); }
00067
00068 void EventRouter::requeueEvent(EventBase* e) { eventQueue->remove(SameID(e)); queueEvent(e); }
00069 #endif
00070
00071
00072
00073 void EventRouter::processTimers() {
00074
00075 unsigned int curtime=get_time();
00076 TimerEntry curTimer(curtime);
00077 timer_it_t last_it=upper_bound(timers.begin(),timers.end(),&curTimer,TimerEntryPtrCmp());
00078 std::vector<TimerEntry*> process(timers.begin(),last_it);
00079 for(timer_it_t it=process.begin(); it!=process.end(); it++)
00080 if(!(*it)->repeat)
00081 (*it)->next=(unsigned int)-1;
00082 else if((*it)->delay==0)
00083 (*it)->next=curtime+1;
00084 else while((*it)->next<=curtime)
00085 (*it)->next+=(*it)->delay;
00086 sort(timers.begin(),last_it,TimerEntryPtrCmp());
00087 inplace_merge(timers.begin(),last_it,timers.end(),TimerEntryPtrCmp());
00088
00089 for(timer_it_t it=process.begin(); it!=process.end(); it++) {
00090 if(find(timers.begin(),timers.end(),*it)==timers.end())
00091 continue;
00092 TimerEvent e((*it)->el,EventBase::timerEGID,(*it)->sid,EventBase::statusETID,(*it)->next-(*it)->delay);
00093 try {
00094 (*it)->el->processEvent(e);
00095 } catch(const std::exception& ex) {
00096 std::string msg="Occurred while processing event "+e.getName()+" by ";
00097 if(BehaviorBase * beh=dynamic_cast<BehaviorBase*>((*it)->el))
00098 msg+="listener "+beh->getName();
00099 else
00100 msg+="unnamed EventListener";
00101 if(!ProjectInterface::uncaughtException(__FILE__,__LINE__,msg.c_str(),&ex))
00102 throw;
00103 } catch(...) {
00104 std::string msg="Occurred while processing event "+e.getName()+" by ";
00105 if(BehaviorBase * beh=dynamic_cast<BehaviorBase*>((*it)->el))
00106 msg+="listener "+beh->getName();
00107 else
00108 msg+="unnamed EventListener";
00109 if(!ProjectInterface::uncaughtException(__FILE__,__LINE__,msg.c_str(),NULL))
00110 throw;
00111 }
00112 postEvent(e);
00113 }
00114
00115 static const TimerEntry deadTimer((unsigned int)-1);
00116 last_it=lower_bound(timers.begin(),timers.end(),&deadTimer,TimerEntryPtrCmp());
00117 for(timer_it_t it=last_it; it!=timers.end(); it++)
00118 delete *it;
00119 timers.erase(last_it,timers.end());
00120
00121
00122 }
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 void EventRouter::addTimer(EventListener* el, size_t sid, unsigned int delay, bool repeat) {
00133 if(delay==-1U) {
00134 removeTimer(el,sid);
00135 return;
00136 }
00137 for(timer_it_t it=timers.begin(); it!=timers.end(); it++)
00138 if((*it)->el==el && (*it)->sid==sid) {
00139 (*it)->Set(delay,repeat);
00140
00141 if(it!=timers.begin() && (*it)->next<(*(it-1))->next)
00142 rotate(upper_bound(timers.begin(),it,*it,TimerEntryPtrCmp()),it,it+1);
00143 else if(it+1!=timers.end() && (*it)->next>(*(it+1))->next)
00144 rotate(it,it+1,lower_bound(it+1,timers.end(),*it,TimerEntryPtrCmp()));
00145 return;
00146 }
00147
00148 TimerEntry * add=new TimerEntry(el,sid,delay,repeat);
00149 timers.insert(lower_bound(timers.begin(),timers.end(),add,TimerEntryPtrCmp()),add);
00150
00151 }
00152
00153 void EventRouter::removeTimer(const EventListener* el) {
00154 for(timer_it_t it=timers.begin(); it!=timers.end(); it++)
00155 if((*it)->el==el) {
00156 delete *it;
00157 *it=NULL;
00158 }
00159 timers.erase(std::remove(timers.begin(),timers.end(),(const TimerEntry*)NULL),timers.end());
00160 }
00161
00162 void EventRouter::removeTimer(const EventListener* el, size_t sid) {
00163 for(timer_it_t it=timers.begin(); it!=timers.end(); it++)
00164 if((*it)->el==el && (*it)->sid==sid) {
00165 delete *it;
00166 timers.erase(it);
00167 return;
00168 }
00169 }
00170
00171 void EventRouter::removeAllTimers() {
00172 for(timer_it_t it=timers.begin(); it!=timers.end(); it++)
00173 delete *it;
00174 timers.erase(timers.begin(),timers.end());
00175 }
00176
00177 const EventRouter::TimerEntry* EventRouter::getNextTimerInfo(const EventListener* el) {
00178 for(timer_it_t it=timers.begin(); it!=timers.end(); it++)
00179 if((*it)->el==el)
00180 return *it;
00181 return NULL;
00182 }
00183
00184 const EventRouter::TimerEntry* EventRouter::getNextTimerInfo(const EventListener* el, size_t sid) {
00185 for(timer_it_t it=timers.begin(); it!=timers.end(); it++)
00186 if((*it)->el==el && (*it)->sid==sid)
00187 return *it;
00188 return NULL;
00189 }
00190
00191 void EventRouter::addListener(EventListener* el, EventBase::EventGeneratorID_t egid) {
00192 bool hadListener=hasListeners(egid);
00193 listeners.addMapping(el,egid);
00194 if(!hadListener)
00195 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::activateETID,0,EventBase::EventGeneratorNames[egid],1));
00196 else
00197 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00198 }
00199 void EventRouter::addListener(EventListener* el, EventBase::EventGeneratorID_t egid, size_t sid) {
00200 bool hadListener=hasListeners(egid);
00201 for(unsigned int et=0; et<EventBase::numETIDs; et++)
00202 listeners.addMapping(el,egid,sid,(EventBase::EventTypeID_t)et);
00203 if(!hadListener)
00204 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::activateETID,0,EventBase::EventGeneratorNames[egid],1));
00205 else
00206 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00207 }
00208 void EventRouter::addListener(EventListener* el, EventBase::EventGeneratorID_t egid, size_t sid, EventBase::EventTypeID_t etid) {
00209 bool hadListener=hasListeners(egid);
00210 listeners.addMapping(el,egid,sid,etid);
00211 if(!hadListener)
00212 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::activateETID,0,EventBase::EventGeneratorNames[egid],1));
00213 else
00214 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00215 }
00216 void EventRouter::addListener(EventListener* el, const EventBase& e) {
00217 bool hadListener=hasListeners(e.getGeneratorID());
00218 listeners.addMapping(el,e.getGeneratorID(),e.getSourceID(),e.getTypeID());
00219 if(!hadListener)
00220 postEvent(EventBase(EventBase::erouterEGID,e.getGeneratorID(),EventBase::activateETID,0,EventBase::EventGeneratorNames[e.getGeneratorID()],1));
00221 else
00222 postEvent(EventBase(EventBase::erouterEGID,e.getGeneratorID(),EventBase::statusETID,0,EventBase::EventGeneratorNames[e.getGeneratorID()],1));
00223 }
00224
00225 #ifndef TGT_IS_DYNAMIC
00226
00227 void EventRouter::addRemoteListener(EventListener* el, int host,
00228 EventBase::EventGeneratorID_t egid) {
00229 RemoteRouter &rr = remoteRouterForHost(host);
00230 addListener(el, egid);
00231 rr.addListener(egid);
00232 }
00233
00234 void EventRouter::addRemoteListener(EventListener* el, int host,
00235 EventBase::EventGeneratorID_t egid, size_t sid) {
00236 RemoteRouter &rr = remoteRouterForHost(host);
00237 addListener(el, egid, sid);
00238 rr.addListener(egid, sid);
00239 }
00240
00241 void EventRouter::addRemoteListener(EventListener* el, int host, const EventBase& e){
00242 addRemoteListener(el, host, e.getGeneratorID(), e.getSourceID(), e.getTypeID());
00243 }
00244
00245 void EventRouter::addRemoteListener(EventListener* el, int host,
00246 EventBase::EventGeneratorID_t egid, size_t sid,
00247 EventBase::EventTypeID_t etid) {
00248 RemoteRouter &rr = remoteRouterForHost(host);
00249 addListener(el, egid, sid, etid);
00250 rr.addListener(egid, sid, etid);
00251 }
00252
00253
00254 void EventRouter::removeRemoteListener(const EventListener* el, int host,
00255 EventBase::EventGeneratorID_t egid) {
00256 RemoteRouter &rr = remoteRouterForHost(host);
00257 removeListener(el, egid);
00258 rr.removeListener(egid);
00259 }
00260
00261 void EventRouter::removeRemoteListener(const EventListener* el, int host,
00262 EventBase::EventGeneratorID_t egid, size_t sid) {
00263 RemoteRouter &rr = remoteRouterForHost(host);
00264 removeListener(el, egid, sid);
00265 rr.removeListener(egid, sid);
00266 }
00267
00268 void EventRouter::removeRemoteListener(const EventListener* el, int host,
00269 const EventBase& e) {
00270 removeRemoteListener(el, host, e.getGeneratorID(), e.getSourceID(), e.getTypeID());
00271 }
00272
00273 void EventRouter::removeRemoteListener(const EventListener* el, int host,
00274 EventBase::EventGeneratorID_t egid, size_t sid,
00275 EventBase::EventTypeID_t etid) {
00276 RemoteRouter &rr = remoteRouterForHost(host);
00277 removeListener(el, egid, sid, etid);
00278 rr.removeListener(egid, sid, etid);
00279 }
00280
00281
00282 void EventRouter::requestRemoteStateUpdates(int host, RemoteState::StateType type,
00283 unsigned int interval) {
00284 RemoteRouter &rr = remoteRouterForHost(host);
00285 rr.requestStateUpdates(type, interval);
00286 }
00287
00288 void EventRouter::stopRemoteStateUpdates(int host, RemoteState::StateType type) {
00289 RemoteRouter &rr = remoteRouterForHost(host);
00290 rr.stopStateUpdates(type);
00291 }
00292
00293 RemoteRouter &EventRouter::remoteRouterForHost(int host) {
00294 RemoteRouter *rr = rrouters[host];
00295 if (rr) {
00296 printf("Returning existing remote router for host %s\n", string_util::intToStringIP(host).c_str());
00297 return *rr;
00298 } else {
00299 rrouters[host] = rr = new RemoteRouter(host);
00300 printf("Returning new remote router for host %s\n", string_util::intToStringIP(host).c_str());
00301 return *rr;
00302 }
00303 }
00304
00305
00306 bool EventRouter::serveRemoteEventRequests() {
00307 if (sck)
00308 return false;
00309 sck = wireless->socket(Socket::SOCK_STREAM);
00310 wireless->setReceiver(sck, this);
00311 wireless->setDaemon(sck, true);
00312 wireless->listen(sck, EventRouter::defaultPort);
00313 return true;
00314 }
00315
00316 int EventRouter::processData(char* , int bytes) {
00317 if (bytes != sizeof(int)) {
00318 std::cerr << "Unknown data received" << std::endl;
00319 return -1;
00320 }
00321
00322 int nextPort = nextProxyPort++;
00323 std::cout << "Starting EventProxy on port " << nextPort
00324 << " for host " << string_util::intToStringIP(sck->getPeerAddress()) << std::endl;
00325 proxies.push_back(new EventProxy(nextPort));
00326
00327
00328 sck->write((byte *)&nextPort, sizeof(int));
00329
00330
00331 wireless->close(sck);
00332
00333 return 0;
00334 }
00335
00336
00337 #endif
00338
00339 void EventRouter::removeListener(const EventListener* el) {
00340 for(unsigned int eg=0; eg<EventBase::numEGIDs; eg++) {
00341 EventBase::EventGeneratorID_t egid=(EventBase::EventGeneratorID_t)eg;
00342 if(!listeners.removeMapping(el,egid))
00343 continue;
00344 listeners.clean(egid);
00345 if(!hasListeners(egid))
00346 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::deactivateETID,0,EventBase::EventGeneratorNames[egid],0));
00347 else
00348 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00349 }
00350 }
00351 void EventRouter::removeListener(const EventListener* el, EventBase::EventGeneratorID_t egid) {
00352 if(!listeners.removeMapping(el,egid))
00353 return;
00354 listeners.clean(egid);
00355 if(!hasListeners(egid))
00356 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::deactivateETID,0,EventBase::EventGeneratorNames[egid],0));
00357 else
00358 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00359 }
00360 void EventRouter::removeListener(const EventListener* el, EventBase::EventGeneratorID_t egid, size_t sid) {
00361 unsigned int removed=0;
00362 for(unsigned int et=0; et<EventBase::numETIDs; et++)
00363 removed+=listeners.removeMapping(el,egid,sid,(EventBase::EventTypeID_t)et);
00364 if(!removed)
00365 return;
00366 listeners.clean(egid);
00367 if(!hasListeners(egid))
00368 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::deactivateETID,0,EventBase::EventGeneratorNames[egid],0));
00369 else
00370 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00371 }
00372 void EventRouter::removeListener(const EventListener* el, EventBase::EventGeneratorID_t egid, size_t sid, EventBase::EventTypeID_t etid) {
00373 if(!listeners.removeMapping(el,egid,sid,etid))
00374 return;
00375 listeners.clean(egid);
00376 if(!hasListeners(egid))
00377 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::deactivateETID,0,EventBase::EventGeneratorNames[egid],0));
00378 else
00379 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00380 }
00381 void EventRouter::removeListener(const EventListener* el, const EventBase& e) {
00382 if(!listeners.removeMapping(el,e.getGeneratorID(),e.getSourceID(),e.getTypeID()))
00383 return;
00384 listeners.clean(e.getGeneratorID());
00385 if(!hasListeners(e.getGeneratorID()))
00386 postEvent(EventBase(EventBase::erouterEGID,e.getGeneratorID(),EventBase::deactivateETID,0,EventBase::EventGeneratorNames[e.getGeneratorID()],0));
00387 else
00388 postEvent(EventBase(EventBase::erouterEGID,e.getGeneratorID(),EventBase::statusETID,0,EventBase::EventGeneratorNames[e.getGeneratorID()],1));
00389 }
00390
00391 void EventRouter::addTrapper(EventTrapper* el, const EventBase& e) {
00392 bool hadListener=hasListeners(e.getGeneratorID());
00393 trappers.addMapping(el,e.getGeneratorID(),e.getSourceID(),e.getTypeID());
00394 if(!hadListener)
00395 postEvent(EventBase(EventBase::erouterEGID,e.getGeneratorID(),EventBase::activateETID,0,EventBase::EventGeneratorNames[e.getGeneratorID()],1));
00396 else
00397 postEvent(EventBase(EventBase::erouterEGID,e.getGeneratorID(),EventBase::statusETID,0,EventBase::EventGeneratorNames[e.getGeneratorID()],1));
00398 }
00399
00400 void EventRouter::addTrapper(EventTrapper* el, EventBase::EventGeneratorID_t egid) {
00401 bool hadListener=hasListeners(egid);
00402 trappers.addMapping(el,egid);
00403 if(!hadListener)
00404 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::activateETID,0,EventBase::EventGeneratorNames[egid],1));
00405 else
00406 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00407 }
00408
00409 void EventRouter::addTrapper(EventTrapper* el, EventBase::EventGeneratorID_t egid, size_t sid) {
00410 bool hadListener=hasListeners(egid);
00411 for(unsigned int et=0; et<EventBase::numETIDs; et++)
00412 trappers.addMapping(el,egid,sid,(EventBase::EventTypeID_t)et);
00413 if(!hadListener)
00414 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::activateETID,0,EventBase::EventGeneratorNames[egid],1));
00415 else
00416 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00417 }
00418
00419 void EventRouter::addTrapper(EventTrapper* el, EventBase::EventGeneratorID_t egid, size_t sid, EventBase::EventTypeID_t etid) {
00420 bool hadListener=hasListeners(egid);
00421 trappers.addMapping(el,egid,sid,etid);
00422 if(!hadListener)
00423 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::activateETID,0,EventBase::EventGeneratorNames[egid],1));
00424 else
00425 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00426 }
00427
00428
00429 void EventRouter::addTrapper(EventTrapper* el) {
00430 for(unsigned int eg=0; eg<EventBase::numEGIDs; eg++)
00431 addTrapper(el,(EventBase::EventGeneratorID_t)eg);
00432 }
00433
00434
00435 void EventRouter::removeTrapper(const EventTrapper* el, const EventBase& e) {
00436 if(!trappers.removeMapping(el,e.getGeneratorID(),e.getSourceID(),e.getTypeID()))
00437 return;
00438 trappers.clean(e.getGeneratorID());
00439 if(!hasListeners(e.getGeneratorID()))
00440 postEvent(EventBase(EventBase::erouterEGID,e.getGeneratorID(),EventBase::deactivateETID,0,EventBase::EventGeneratorNames[e.getGeneratorID()],0));
00441 else
00442 postEvent(EventBase(EventBase::erouterEGID,e.getGeneratorID(),EventBase::statusETID,0,EventBase::EventGeneratorNames[e.getGeneratorID()],1));
00443 }
00444 void EventRouter::removeTrapper(const EventTrapper* el, EventBase::EventGeneratorID_t egid) {
00445 if(!trappers.removeMapping(el,egid))
00446 return;
00447 trappers.clean(egid);
00448 if(!hasListeners(egid))
00449 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::deactivateETID,0,EventBase::EventGeneratorNames[egid],0));
00450 else
00451 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00452 }
00453 void EventRouter::removeTrapper(const EventTrapper* el, EventBase::EventGeneratorID_t egid, size_t sid) {
00454 int removed=0;
00455 for(unsigned int et=0; et<EventBase::numETIDs; et++)
00456 removed+=trappers.removeMapping(el,egid,sid,(EventBase::EventTypeID_t)et);
00457 if(!removed)
00458 return;
00459 trappers.clean(egid);
00460 if(!hasListeners(egid))
00461 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::deactivateETID,0,EventBase::EventGeneratorNames[egid],0));
00462 else
00463 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00464 }
00465 void EventRouter::removeTrapper(const EventTrapper* el, EventBase::EventGeneratorID_t egid, size_t sid, EventBase::EventTypeID_t etid) {
00466 if(!trappers.removeMapping(el,egid,sid,etid))
00467 return;
00468 trappers.clean(egid);
00469 if(!hasListeners(egid))
00470 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::deactivateETID,0,EventBase::EventGeneratorNames[egid],0));
00471 else
00472 postEvent(EventBase(EventBase::erouterEGID,egid,EventBase::statusETID,0,EventBase::EventGeneratorNames[egid],1));
00473 }
00474
00475 void EventRouter::removeTrapper(const EventTrapper* el) {
00476 for(unsigned int eg=0; eg<EventBase::numEGIDs; eg++)
00477 removeTrapper(el,(EventBase::EventGeneratorID_t)eg);
00478 }
00479
00480 void EventRouter::chkTimers() {
00481 unsigned int last=0;
00482 for(timer_it_t it=timers.begin(); it!=timers.end(); it++) {
00483 if(last>(*it)->next) {
00484 std::cout << "Out of order ";
00485 dispTimers();
00486 return;
00487 }
00488 last=(*it)->next;
00489 }
00490 }
00491
00492
00493 void EventRouter::dispTimers() {
00494 std::cout << "timers at " << get_time() << " :\t";
00495 unsigned int last=0;
00496 for(timer_it_t it=timers.begin(); it!=timers.end(); it++) {
00497 if(last>(*it)->next)
00498 std::cout << "##";
00499 BehaviorBase* beh = dynamic_cast<BehaviorBase*>((*it)->el);
00500 if ( beh != NULL )
00501 std::cout << beh->getName() << "@";
00502 std::cout << (last=(*it)->next) << '\t';
00503 }
00504 std::cout << std::endl;
00505 }
00506
00507
00508 void EventRouter::setForwardingAgent(ProcessID::ProcessID_t proc, EventTranslator* trans) {
00509 delete forwards[proc];
00510 forwards[proc]=trans;
00511 }
00512
00513 void EventRouter::processEvent(const EventBase& e) {
00514
00515 ProcessID::ProcessID_t pid=ProcessID::getID();
00516 if(pid!=ProcessID::NumProcesses && forwards[pid]!=NULL) {
00517 if(forwards[pid]->trapEvent(e))
00518 return;
00519 }
00520
00521 #ifndef PLATFORM_APERIOS
00522 static Thread::Lock lk;
00523 MarkScope autolock(lk);
00524 #endif
00525 PostingStatus ps(trappers,listeners,e);
00526 postings.push(&ps);
00527 while(postings.size()>0) {
00528 #ifdef DEBUG
00529 size_t presize=postings.size();
00530 postings.front()->process();
00531 ASSERT(postings.size()==0 || postings.size()==presize,"partial queue completion?");
00532 #else
00533 postings.front()->process();
00534 #endif
00535 if(postings.size()>0)
00536 postings.pop();
00537 }
00538 }
00539
00540 void EventRouter::PostingStatus::process() {
00541 while(tit!=t.end()) {
00542
00543 EventTrapper * et=*tit++;
00544 if(!trappers.verifyMapping(et,e))
00545 continue;
00546 try {
00547 if(et->trapEvent(e))
00548 return;
00549 } catch(const std::exception& ex) {
00550 std::string msg="Occurred while processing event "+e.getName()+" by ";
00551 if(BehaviorBase * beh=dynamic_cast<BehaviorBase*>(et))
00552 msg+="trapper "+beh->getName();
00553 else
00554 msg+="unnamed EventTrapper";
00555 if(!ProjectInterface::uncaughtException(__FILE__,__LINE__,msg.c_str(),&ex))
00556 throw;
00557 } catch(...) {
00558 std::string msg="Occurred while processing event "+e.getName()+" by ";
00559 if(BehaviorBase * beh=dynamic_cast<BehaviorBase*>(et))
00560 msg+="trapper "+beh->getName();
00561 else
00562 msg+="unnamed EventTrapper";
00563 if(!ProjectInterface::uncaughtException(__FILE__,__LINE__,msg.c_str(),NULL))
00564 throw;
00565 }
00566 }
00567 while(lit!=l.end()) {
00568
00569 EventListener * el=*lit++;
00570 if(!listeners.verifyMapping(el,e))
00571 continue;
00572 try {
00573 el->processEvent(e);
00574 } catch(const std::exception& ex) {
00575 std::string msg="Occurred while processing event "+e.getName()+" by ";
00576 if(BehaviorBase * beh=dynamic_cast<BehaviorBase*>(el))
00577 msg+="listener "+beh->getName();
00578 else
00579 msg+="unnamed EventListener";
00580 if(!ProjectInterface::uncaughtException(__FILE__,__LINE__,msg.c_str(),&ex))
00581 throw;
00582 } catch(...) {
00583 std::string msg="Occurred while processing event "+e.getName()+" by ";
00584 if(BehaviorBase * beh=dynamic_cast<BehaviorBase*>(el))
00585 msg+="listener "+beh->getName();
00586 else
00587 msg+="unnamed EventListener";
00588 if(!ProjectInterface::uncaughtException(__FILE__,__LINE__,msg.c_str(),NULL))
00589 throw;
00590 }
00591 }
00592 }
00593
00594 EventRouter::EventMapper::EventMapper() {
00595 for(unsigned int eg=0; eg<EventBase::numEGIDs; eg++)
00596 for(unsigned int et=0; et<EventBase::numETIDs; et++)
00597 filteredevents[eg][et]=NULL;
00598 }
00599
00600 void EventRouter::EventMapper::addMapping(void* el, EventBase::EventGeneratorID_t egid, size_t sid, EventBase::EventTypeID_t etid) {
00601 if(filteredevents[egid][etid]==NULL)
00602 filteredevents[egid][etid]=new SIDtoListenerVectorMap_t();
00603 SIDtoListenerVectorMap_t::iterator it=filteredevents[egid][etid]->find(sid);
00604 std::vector<void*>* elv=NULL;
00605 if(it==filteredevents[egid][etid]->end()) {
00606 std::pair<const size_t,std::vector<void*> > p(sid,std::vector<void*>());
00607
00608 filteredevents[egid][etid]->insert(p);
00609 elv=&(*filteredevents[egid][etid]->find(sid)).second;
00610 } else {
00611 elv=&(*it).second;
00612 }
00613 elv->push_back(el);
00614 }
00615
00616 bool EventRouter::EventMapper::removeMapping(const void* el, EventBase::EventGeneratorID_t egid) {
00617
00618 size_t numlist=allevents[egid].size();
00619 allevents[egid].erase(std::remove(allevents[egid].begin(),allevents[egid].end(),el),allevents[egid].end());
00620 bool hadListener=allevents[egid].size()!=numlist;
00621
00622
00623 for(unsigned int et=0; et<EventBase::numETIDs; et++) {
00624 SIDtoListenerVectorMap_t* mapping=filteredevents[egid][et];
00625 if(mapping!=NULL) {
00626 SIDtoListenerVectorMap_t::iterator mapit=mapping->begin();
00627 for(mapit=mapping->begin(); mapit!=mapping->end(); mapit++) {
00628 std::vector<void*> * v=&(*mapit).second;
00629 std::vector<void*>::iterator last=std::remove(v->begin(),v->end(),el);
00630 if(last!=v->end()) {
00631 hadListener=true;
00632 v->erase(last,v->end());
00633 }
00634 }
00635 }
00636 }
00637 return hadListener;
00638 }
00639
00640 bool EventRouter::EventMapper::removeMapping(const void* el, EventBase::EventGeneratorID_t egid, size_t sid, EventBase::EventTypeID_t etid) {
00641 bool hadListener=false;
00642 SIDtoListenerVectorMap_t* mapping=filteredevents[egid][etid];
00643 if(mapping!=NULL) {
00644 SIDtoListenerVectorMap_t::iterator mapit=mapping->find(sid);
00645 if(mapit!=mapping->end()) {
00646 std::vector<void*> * v=&(*mapit).second;
00647 std::vector<void*>::iterator last=std::remove(v->begin(),v->end(),el);
00648 if(last!=v->end()) {
00649 hadListener=true;
00650 v->erase(last,v->end());
00651 }
00652 }
00653 }
00654 return hadListener;
00655 }
00656
00657 void EventRouter::EventMapper::clean() {
00658 for(unsigned int eg=0; eg<EventBase::numEGIDs; eg++)
00659 clean((EventBase::EventGeneratorID_t)eg);
00660 }
00661 void EventRouter::EventMapper::clean(EventBase::EventGeneratorID_t egid) {
00662
00663 for(unsigned int et=0; et<EventBase::numETIDs; et++) {
00664 SIDtoListenerVectorMap_t* mapping=filteredevents[egid][et];
00665 if(mapping!=NULL) {
00666 SIDtoListenerVectorMap_t::iterator mapit=mapping->begin();
00667 bool done=false;
00668 while(!done) {
00669 done=true;
00670 for(mapit=mapping->begin(); mapit!=mapping->end(); mapit++) {
00671 if((*mapit).second.size()==0) {
00672 mapping->erase(mapit);
00673 done=false;
00674 break;
00675 }
00676 }
00677 }
00678 }
00679 }
00680
00681 for(unsigned int et=0; et<EventBase::numETIDs; et++) {
00682 SIDtoListenerVectorMap_t* mapping=filteredevents[egid][et];
00683 if(mapping!=NULL) {
00684 if(mapping->size()==0) {
00685 delete mapping;
00686 filteredevents[egid][et]=NULL;
00687 }
00688 }
00689 }
00690 }
00691
00692 void EventRouter::EventMapper::clear() {
00693 for(unsigned int eg=0; eg<EventBase::numEGIDs; eg++) {
00694 for(unsigned int et=0; et<EventBase::numETIDs; et++) {
00695 SIDtoListenerVectorMap_t* mapping=filteredevents[eg][et];
00696 if(mapping!=NULL) {
00697 mapping->erase(mapping->begin(),mapping->end());
00698 delete mapping;
00699 filteredevents[eg][et]=NULL;
00700 }
00701 }
00702 }
00703 }
00704
00705 bool EventRouter::EventMapper::hasMapping(EventBase::EventGeneratorID_t egid) const {
00706 if(allevents[egid].size()>0)
00707 return true;
00708 for(unsigned int et=0; et<EventBase::numETIDs; et++) {
00709 const SIDtoListenerVectorMap_t* mapping=filteredevents[egid][et];
00710 if(mapping!=NULL) {
00711 SIDtoListenerVectorMap_t::const_iterator mapit=mapping->begin();
00712 for(mapit=mapping->begin(); mapit!=mapping->end(); mapit++)
00713 if((*mapit).second.size()>0)
00714 return true;
00715 }
00716 }
00717 return false;
00718 }
00719
00720 bool EventRouter::EventMapper::hasMapping(EventBase::EventGeneratorID_t egid, size_t sid) const {
00721 if(allevents[egid].size()>0)
00722 return true;
00723 for(unsigned int et=0; et<EventBase::numETIDs; et++) {
00724 const SIDtoListenerVectorMap_t* mapping=filteredevents[egid][et];
00725 if(mapping!=NULL) {
00726 SIDtoListenerVectorMap_t::const_iterator mapit=mapping->find(sid);
00727 if(mapit!=mapping->end() && (*mapit).second.size()>0)
00728 return true;
00729 }
00730 }
00731 return false;
00732 }
00733
00734 bool EventRouter::EventMapper::hasMapping(EventBase::EventGeneratorID_t egid, size_t sid, EventBase::EventTypeID_t etid) const {
00735 if(allevents[egid].size()>0)
00736 return true;
00737 const SIDtoListenerVectorMap_t* mapping=filteredevents[egid][etid];
00738 if(mapping!=NULL) {
00739 SIDtoListenerVectorMap_t::const_iterator mapit=mapping->find(sid);
00740 if(mapit!=mapping->end())
00741 return ((*mapit).second.size()>0);
00742 }
00743 return false;
00744 }
00745
00746 template<class T>
00747 void EventRouter::EventMapper::getMapping(const EventBase& e, std::vector<T*>& ls) const {
00748
00749 const std::vector<void*>* elv=NULL;
00750 const SIDtoListenerVectorMap_t* sidtovm=filteredevents[e.getGeneratorID()][e.getTypeID()];
00751 if(sidtovm!=NULL) {
00752 SIDtoListenerVectorMap_t::const_iterator mapit=sidtovm->find(e.getSourceID());
00753 if(mapit!=sidtovm->end()) {
00754 elv=&(*mapit).second;
00755 for(std::vector<void*>::const_iterator elit=elv->begin(); elit!=elv->end(); elit++)
00756 ls.push_back(static_cast<T*>(*elit));
00757 }
00758 }
00759
00760 elv=&allevents[e.getGeneratorID()];
00761 for(std::vector<void*>::const_iterator elit=elv->begin(); elit!=elv->end(); elit++)
00762 ls.push_back(static_cast<T*>(*elit));
00763 }
00764
00765 bool EventRouter::EventMapper::verifyMapping(const void * listener, EventBase::EventGeneratorID_t egid, size_t sid, EventBase::EventTypeID_t etid) const {
00766
00767 const std::vector<void*>* elv=&allevents[egid];
00768 for(std::vector<void*>::const_iterator elit=elv->begin(); elit!=elv->end(); elit++)
00769 if(*elit==listener)
00770 return true;
00771
00772
00773 const SIDtoListenerVectorMap_t* sidtovm=filteredevents[egid][etid];
00774 if(sidtovm!=NULL) {
00775 const SIDtoListenerVectorMap_t::const_iterator mapit=sidtovm->find(sid);
00776 if(mapit!=sidtovm->end()) {
00777 elv=&(*mapit).second;
00778 for(std::vector<void*>::const_iterator elit=elv->begin(); elit!=elv->end(); elit++)
00779 if(*elit==listener)
00780 return true;
00781 }
00782 }
00783
00784
00785 return false;
00786 }
00787
00788 bool EventRouter::EventMapper::verifyMappingAll(const void* listener, EventBase::EventGeneratorID_t egid) const {
00789 const std::vector<void*>* elv=&allevents[egid];
00790 for(std::vector<void*>::const_iterator elit=elv->begin(); elit!=elv->end(); elit++)
00791 if(*elit==listener)
00792 return true;
00793
00794 return false;
00795 }
00796
00797 bool EventRouter::EventMapper::verifyMappingAny(const void* listener, EventBase::EventGeneratorID_t egid) const {
00798
00799 const std::vector<void*>* elv=&allevents[egid];
00800 for(std::vector<void*>::const_iterator elit=elv->begin(); elit!=elv->end(); elit++)
00801 if(*elit==listener)
00802 return true;
00803
00804
00805 for(unsigned int et=0; et<EventBase::numETIDs; et++) {
00806 const SIDtoListenerVectorMap_t* sidtovm=filteredevents[egid][et];
00807 if(sidtovm!=NULL) {
00808 SIDtoListenerVectorMap_t::const_iterator mapit=sidtovm->begin();
00809 for(;mapit!=sidtovm->end();mapit++) {
00810 elv=&(*mapit).second;
00811 for(std::vector<void*>::const_iterator elit=elv->begin(); elit!=elv->end(); elit++)
00812 if(*elit==listener)
00813 return true;
00814 }
00815 }
00816 }
00817
00818
00819 return false;
00820 }
00821
00822 bool EventRouter::EventMapper::verifyMappingAll(const void* listener, EventBase::EventGeneratorID_t egid, size_t sid) const {
00823
00824 const std::vector<void*>* elv=&allevents[egid];
00825 for(std::vector<void*>::const_iterator elit=elv->begin(); elit!=elv->end(); elit++)
00826 if(*elit==listener)
00827 return true;
00828
00829
00830
00831 for(unsigned int et=0; et<EventBase::numETIDs; et++) {
00832 const SIDtoListenerVectorMap_t* sidtovm=filteredevents[egid][et];
00833 if(sidtovm==NULL)
00834 return false;
00835
00836 const SIDtoListenerVectorMap_t::const_iterator mapit=sidtovm->find(sid);
00837 if(mapit==sidtovm->end())
00838 return false;
00839
00840 elv=&(*mapit).second;
00841 std::vector<void*>::const_iterator elit=elv->begin();
00842 while(elit!=elv->end() && *elit!=listener)
00843 elit++;
00844 if(elit==elv->end())
00845 return false;
00846
00847 }
00848
00849
00850 return true;
00851 }
00852
00853 bool EventRouter::EventMapper::verifyMappingAny(const void* listener, EventBase::EventGeneratorID_t egid, size_t sid) const {
00854
00855 const std::vector<void*>* elv=&allevents[egid];
00856 for(std::vector<void*>::const_iterator elit=elv->begin(); elit!=elv->end(); elit++)
00857 if(*elit==listener)
00858 return true;
00859
00860
00861 for(unsigned int et=0; et<EventBase::numETIDs; et++) {
00862 const SIDtoListenerVectorMap_t* sidtovm=filteredevents[egid][et];
00863 if(sidtovm!=NULL) {
00864 SIDtoListenerVectorMap_t::const_iterator mapit=sidtovm->find(sid);
00865 if(mapit!=sidtovm->end()) {
00866 elv=&(*mapit).second;
00867 for(std::vector<void*>::const_iterator elit=elv->begin(); elit!=elv->end(); elit++)
00868 if(*elit==listener)
00869 return true;
00870 }
00871 }
00872 }
00873
00874
00875 return false;
00876 }
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927