// 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 2 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, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "config.h" #include #include #include #include "concrete_history.hh" // Include full template definition only in implementation files: #include #include #include #include using std::vector; using std::map; using std::find; using std::runtime_error; using namespace sgpem; // Explicit template instantiation to allow to export symbols from the DSO. template class SG_DLLEXPORT Singleton; typedef vector::iterator ManagerIterator; typedef map::iterator ActiveIterator; vector CPUPoliciesGatekeeper::get_registered() const { return _registered; } void CPUPoliciesGatekeeper::register_manager(CPUPolicyManager* manager) { assert(manager != NULL); ManagerIterator end = _registered.end(); if (find(_registered.begin(), end, manager) == end) _registered.push_back(manager); } void CPUPoliciesGatekeeper::unregister_manager(CPUPolicyManager* manager) { assert(manager != NULL); 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) throw(runtime_error) { assert(history != NULL); 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) throw(UserInterruptException, MalformedPolicyException) { assert(history != NULL); 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 NULL, simply erase the entry and return, since we are sure the policy is // not active due to the previous lines if(policy == NULL) { // 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. dynamic_cast(history)->reset(true); } 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) }