// src/backend/cpu_policies_gatekeeper.cc - Copyright 2005, 2006, University // of Padova, dept. of Pure and Applied // Mathematics // // This file is part of SGPEMv2. // // This is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // SGPEMv2 is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with SGPEMv2. If not, see http://www.gnu.org/licenses/. #include "concrete_history.hh" #include #include #include // Include full template definition only in implementation files: #include #include #include #include #include using std::find; using std::map; using std::runtime_error; using std::vector; using namespace sgpem; // Explicit template instantiation to allow to export symbols from the DSO. template class sgpem::Singleton; typedef vector::iterator ManagerIterator; typedef map::iterator ActiveIterator; vector CPUPoliciesGatekeeper::get_registered () const { return _registered; } void CPUPoliciesGatekeeper::register_manager (CPUPolicyManager *manager) { assert (manager != nullptr); ManagerIterator end = _registered.end (); if (find (_registered.begin (), end, manager) == end) _registered.push_back (manager); } void CPUPoliciesGatekeeper::unregister_manager (CPUPolicyManager *manager) { assert (manager != nullptr); ManagerIterator end = _registered.end (); ManagerIterator pos = find (_registered.begin (), end, manager); if (pos != end) { deactivate_policies (*pos); _registered.erase (pos); } } CPUPolicy * CPUPoliciesGatekeeper::get_current_policy (History *history) { assert (history != nullptr); ActiveIterator policy = _active_policies.find (history); if (policy == _active_policies.end ()) throw runtime_error ( "No active policy associated with this " "history is available."); return policy->second; } void CPUPoliciesGatekeeper::activate_policy (History *history, CPUPolicy *policy) { assert (history != nullptr); ActiveIterator end = _active_policies.end (); ActiveIterator pos = _active_policies.find (history); // deactivate the policy, if necessary if (pos != end) { // nothing to do in this case if (pos->second == policy) return; pos->second->deactivate (); } // if policy is nullptr, simply erase the entry and return, since we are sure the policy is // not active due to the previous lines if (policy == nullptr) { // this is a no-op if history is not a key used in the map _active_policies.erase (history); return; } try { policy->activate (); _active_policies[history] = policy; // the content of history (if any) is not vaild any more. down_cast (history)->reset (); } catch (const CPUPolicyException &e) { // the caller need to know if it failed throw; } } CPUPoliciesGatekeeper::CPUPoliciesGatekeeper () { } void CPUPoliciesGatekeeper::deactivate_policies (CPUPolicyManager *manager) { typedef vector::iterator CPUPolicyIterator; vector avail_policies = manager->get_avail_policies (); CPUPolicyIterator avail_it = avail_policies.begin (); CPUPolicyIterator avail_end = avail_policies.end (); for (; avail_it != avail_end; ++avail_it) { ActiveIterator act_it = _active_policies.begin (); while (act_it != _active_policies.end ()) { if (act_it->second == *avail_it) { act_it->second->deactivate (); // Please note the postfix increment // (operating on the old, now invalidated by // erase, iterator object): _active_policies.erase (act_it++); } else ++act_it; } } //~ for(avail_it) }