Ignore:
Timestamp:
Mar 18, 2013, 6:29:41 PM (13 years ago)
Author:
Frederik Heber <heber@…>
Children:
3f30cc
Parents:
b9273a
git-author:
Frederik Heber <heber@…> (03/18/13 18:22:47)
git-committer:
Frederik Heber <heber@…> (03/18/13 18:29:41)
Message:

Channels and Notifications pass on subjectKilled().

  • if we only sign on to a single notification channel, we miss on subjectKilled() completely. Hence, we have to chance of properly signing off again or, at least, to know that we must not anymore.
  • Hence, Observable's dstor now calls subjectKilled() on its Channels which passes the call on to all its Notifications that in turn use the subjectKilled() slot of their targets along with the passed-through Observable instance.
  • also added observerLog verbosity when signing on/off to channels.
  • explained this in header documentation of Observable, Channels, and Notification.
  • TESTFIX: ObserverUnitTest did not properly signOff() before deleting instances in relayNotificationTest().
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Observer/Observable.cpp

    rb9273a r1c291d  
    276276{
    277277  Notification_ptr notification = getChannel(channelno);
     278#ifdef LOG_OBSERVER
     279  observerLog().addMessage() << "@@ Signing on " << observerLog().getName(target)
     280      << " to " << observerLog().getName(const_cast<Observable *>(this))
     281      << "'s channel no." << channelno << ".";
     282#endif
    278283  notification->addObserver(target);
    279284}
     
    282287{
    283288  Notification_ptr notification = getChannel(channelno);
     289#ifdef LOG_OBSERVER
     290  observerLog().addMessage() << "** Signing off " << observerLog().getName(target)
     291      << " from " << observerLog().getName(const_cast<Observable *>(this))
     292      << "'s channel no." << channelno << ".";
     293#endif
    284294  notification->removeObserver(target);
    285295}
     
    315325#ifdef LOG_OBSERVER
    316326  observerLog().addName(this,name);
    317   observerLog().addMessage() << "++ Creating Observable " << observerLog().getName(this);
     327  observerLog().addMessage() << "++ Creating Observable "
     328      << observerLog().getName(static_cast<Observable *>(this));
    318329#endif
    319330}
     
    325336{
    326337#ifdef LOG_OBSERVER
    327   observerLog().addMessage() << "-- Destroying Observable " << observerLog().getName(this);
     338  observerLog().addMessage() << "-- Destroying Observable "
     339      << observerLog().getName(static_cast<Observable *>(this));
    328340#endif
    329341  if(callTable.count(this)) {
     
    331343    callees_t callees = callTable[this];
    332344    callees_t::iterator iter;
    333     for(iter=callees.begin();iter!=callees.end();++iter){
     345    for(iter=callees.begin();iter!=callees.end();++iter)
    334346      (*iter).second->subjectKilled(this);
    335     }
    336347    callTable.erase(this);
    337348  }
    338349
    339350  // also kill instance in static Channels map if present
    340   ChannelMap::iterator iter = NotificationChannels.find(this);
     351  ChannelMap::iterator iter = NotificationChannels.find(static_cast<Observable *>(this));
    341352  if (iter != NotificationChannels.end()) {
     353    iter->second->subjectKilled(static_cast<Observable *>(this));
    342354    delete iter->second;
    343355    NotificationChannels.erase(iter);
Note: See TracChangeset for help on using the changeset viewer.