Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 31, 2015, 10:54:39 AM (9 years ago)
Author:
landauf
Message:

activating a scopelistener right after registering may not be the best idea after all because some other stuff (e.g. an identifier) may not yet be registered if this happens during static initialization. added helper function instead (not yet used, but this will soon happen)

Location:
code/branches/core7/src/libraries/core/singleton
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/branches/core7/src/libraries/core/singleton/ScopeManager.cc

    r10516 r10517  
    6464    {
    6565        this->listeners_[scope].insert(listener);
    66         if (this->isActive(scope))
    67             this->activateListener(listener);
    6866    }
    6967
    7068    void ScopeManager::removeListener(ScopeListener* listener, ScopeID::Value scope)
    7169    {
    72         if (this->isActive(scope))
    73             this->deactivateListener(listener);
    7470        this->listeners_[scope].erase(listener);
    7571    }
     
    8480    {
    8581        for (std::set<ScopeListener*>::iterator it = this->listeners_[scope].begin(); it != this->listeners_[scope].end(); ++it)
    86             this->deactivateListener(*it);
     82            if ((*it)->bActivated_)
     83                this->deactivateListener(*it);
    8784    }
    8885
     
    9592    void ScopeManager::deactivateListener(ScopeListener* listener)
    9693    {
    97         if (listener->bActivated_)
     94        try
     95            { listener->deactivated(); }
     96        catch (...)
     97            { orxout(internal_warning) << "ScopeListener::deactivated() failed! This MUST NOT happen, fix it!" << endl; }
     98        listener->bActivated_ = false;
     99    }
     100
     101    void ScopeManager::updateListeners()
     102    {
     103        std::map<ScopeID::Value, std::set<ScopeListener*> >::iterator it1;
     104        for (it1 = this->listeners_.begin(); it1 != this->listeners_.end(); ++it1)
    98105        {
    99             try
    100                 { listener->deactivated(); }
    101             catch (...)
    102                 { orxout(internal_warning) << "ScopeListener::deactivated() failed! This MUST NOT happen, fix it!" << endl; }
    103             listener->bActivated_ = false;
     106            const ScopeID::Value& scope = it1->first;
     107            const std::set<ScopeListener*>& listeners = it1->second;
     108
     109            bool scopeIsActive = this->isActive(scope);
     110            for (std::set<ScopeListener*>::const_iterator it2 = listeners.begin(); it2 != listeners.end(); ++it2)
     111            {
     112                ScopeListener* listener = (*it2);
     113
     114                if (scopeIsActive && !listener->bActivated_)
     115                    this->activateListener(listener);
     116                else if (!scopeIsActive && listener->bActivated_)
     117                    this->deactivateListener(listener);
     118            }
    104119        }
    105120    }
  • code/branches/core7/src/libraries/core/singleton/ScopeManager.h

    r10515 r10517  
    6464            bool isActive(ScopeID::Value scope);
    6565
    66             /** Registers a listener for the given scope. If the scope is already active, the listener is activate immediately. */
     66            /** Registers a listener for the given scope. */
    6767            void addListener(ScopeListener* listener, ScopeID::Value scope);
    68             /** Unregisters a listener for the given scope. If the scope is still active, the listener is deactivated before removal. */
     68            /** Unregisters a listener for the given scope. */
    6969            void removeListener(ScopeListener* listener, ScopeID::Value scope);
     70
     71            /**
     72             * Checks for all listeners if their activity matches the activity of the scope.
     73             * If not, listeners are activated or deactivated depending on their state.
     74             */
     75            void updateListeners();
    7076
    7177        private:
Note: See TracChangeset for help on using the changeset viewer.