Changes in src/Patterns/Observer.cpp [033a05:112b09]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Patterns/Observer.cpp
r033a05 r112b09 6 6 */ 7 7 8 #include "Helpers/MemDebug.hpp" 9 8 10 #include "Observer.hpp" 9 11 … … 12 14 13 15 #include "Helpers/Assert.hpp" 16 #include "Helpers/MemDebug.hpp" 14 17 15 18 using namespace std; … … 43 46 // if no entry for this observable is found, an new one is created 44 47 // by the STL and initialized to 0 (see STL documentation) 48 #ifdef LOG_OBSERVER 49 observerLog().addMessage(depth[publisher]) << ">> Locking " << observerLog().getName(publisher) << endl; 50 #endif 45 51 depth[publisher]++; 46 52 } … … 60 66 // if zero is reached all observed blocks are done and we can 61 67 // start to notify our observers 62 if(--(depth[publisher])){} 68 --depth[publisher]; 69 #ifdef LOG_OBSERVER 70 observerLog().addMessage(depth[publisher]) << "<< Unlocking " << observerLog().getName(publisher) << endl; 71 #endif 72 if(depth[publisher]){} 63 73 else{ 64 74 publisher->notifyAll(); … … 82 92 Observable::_Observable_protector::_Observable_protector(Observable *_protege) : 83 93 protege(_protege) 94 { 95 start_observer_internal(protege); 96 } 97 98 Observable::_Observable_protector::_Observable_protector(const _Observable_protector &dest) : 99 protege(dest.protege) 84 100 { 85 101 start_observer_internal(protege); … … 117 133 callees_t::iterator iter; 118 134 for(iter=callees.begin();iter!=callees.end();++iter){ 135 #ifdef LOG_OBSERVER 136 observerLog().addMessage() << "-> Sending update from " << observerLog().getName(this) 137 << " to " << observerLog().getName((*iter).second) 138 << " (priority=" << (*iter).first << ")"<< endl; 139 #endif 119 140 (*iter).second->update(this); 120 141 } … … 159 180 // we do not need to publish all the changes at each time we are called 160 181 if(depth.find(this)==depth.end()) { 182 #ifdef LOG_OBSERVER 183 observerLog().addMessage() << "-* Update from " << observerLog().getName(publisher) 184 << " propagated by " << observerLog().getName(this) << endl; 185 #endif 161 186 notifyAll(); 187 } 188 else{ 189 #ifdef LOG_OBSERVER 190 observerLog().addMessage() << "-| Update from " << observerLog().getName(publisher) 191 << " not propagated by " << observerLog().getName(this) << endl; 192 #endif 162 193 } 163 194 } … … 171 202 void Observable::signOn(Observer *target,int priority) { 172 203 ASSERT(priority>=-20 && priority<=+20, "Priority out of range [-20:+20] when signing on Observer"); 204 #ifdef LOG_OBSERVER 205 observerLog().addMessage() << "@@ Signing on " << observerLog().getName(target) << " to " << observerLog().getName(this) << endl; 206 #endif 173 207 bool res = false; 174 208 callees_t &callees = callTable[this]; … … 188 222 void Observable::signOff(Observer *target) { 189 223 ASSERT(callTable.count(this),"SignOff called for an Observable without Observers."); 224 #ifdef LOG_OBSERVER 225 observerLog().addMessage() << "** Signing off " << observerLog().getName(target) << " from " << observerLog().getName(this) << endl; 226 #endif 190 227 callees_t &callees = callTable[this]; 228 191 229 callees_t::iterator iter; 192 230 callees_t::iterator deliter; … … 231 269 /** Constructor for class Observable. 232 270 */ 233 Observable::Observable() 234 {} 271 Observable::Observable(string name) : 272 Observer(Observer::BaseConstructor()) 273 { 274 #ifdef LOG_OBSERVER 275 observerLog().addName(this,name); 276 observerLog().addMessage() << "++ Creating Observable " << observerLog().getName(this) << endl; 277 #endif 278 } 235 279 236 280 /** Destructor for class Observable. … … 239 283 Observable::~Observable() 240 284 { 285 #ifdef LOG_OBSERVER 286 observerLog().addMessage() << "-- Destroying Observable " << observerLog().getName(this) << endl; 287 #endif 241 288 if(callTable.count(this)) { 242 289 // delete all entries for this observable … … 252 299 /** Constructor for class Observer. 253 300 */ 254 Observer::Observer() 255 {} 301 Observer::Observer(string name) 302 { 303 #ifdef LOG_OBSERVER 304 observerLog().addName(this,name); 305 observerLog().addMessage() << "++ Creating Observer " << observerLog().getName(this) << endl; 306 #endif 307 } 308 309 /** 310 * Base Constructor for class Observer 311 * 312 * only called from Observable Constructor 313 */ 314 Observer::Observer(Observer::BaseConstructor){ 315 #ifdef LOG_OBSERVER 316 observerLog().addObservable(this); 317 #endif 318 } 256 319 257 320 /** Destructor for class Observer. 258 321 */ 259 322 Observer::~Observer() 260 {} 323 { 324 #ifdef LOG_OBSERVER 325 if(!observerLog().isObservable(this)){ 326 observerLog().addMessage() << "-- Destroying Observer " << observerLog().getName(this) << endl; 327 } 328 #endif 329 } 261 330 262 331 /** … … 289 358 } 290 359 } 360 361 #ifdef LOG_OBSERVER 362 363 /************************* Methods to do logging of the Observer Mechanism *********/ 364 365 // The log needs to exist fairly early, so we make it construct on first use, 366 // and never destroy it 367 ObserverLog &observerLog(){ 368 // yes, this memory is never freed... we need it around for the whole programm, 369 // so no freeing is possible 370 static ObserverLog *theLog = Memory::ignore(new ObserverLog()); 371 return *theLog; 372 } 373 374 375 ObserverLog::ObserverLog() : 376 count (0) 377 {} 378 379 ObserverLog::~ObserverLog(){} 380 381 string ObserverLog::getLog(){return log.str();} 382 383 std::string ObserverLog::getName(void* obj){ 384 return names[obj]; 385 } 386 387 bool ObserverLog::isObservable(void* obj){ 388 return observables.count(obj); 389 } 390 391 void ObserverLog::addName(void* obj , string name){ 392 stringstream sstr; 393 sstr << name << "_" << count++; 394 names[obj] = sstr.str(); 395 } 396 397 void ObserverLog::addObservable(void* obj){ 398 observables.insert(obj); 399 } 400 401 void ObserverLog::deleteName(void* obj){ 402 names.erase(obj); 403 } 404 405 void ObserverLog::deleteObservable(void* obj){ 406 observables.erase(obj); 407 } 408 409 stringstream &ObserverLog::addMessage(int depth){ 410 for(int i=depth;i--;) 411 log << " "; 412 return log; 413 } 414 415 #endif
Note:
See TracChangeset
for help on using the changeset viewer.