// src/backend/resource_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 "resource_policies_gatekeeper.hh" #include "resource_policy_manager.hh" #include "resource_policy.hh" // Include full template definition only in implementation files: #include "singleton.tcc" #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 PolicyIterator; const vector& ResourcePoliciesGatekeeper::get_registered() const { return _registered; } void ResourcePoliciesGatekeeper::register_manager(ResourcePolicyManager* manager) { assert(manager != NULL); ManagerIterator end = _registered.end(); if (find(_registered.begin(), end, manager) == end) _registered.push_back(manager); } void ResourcePoliciesGatekeeper::unregister_manager(ResourcePolicyManager* manager) { assert(manager != NULL); ManagerIterator end = _registered.end(); ManagerIterator pos = find(_registered.begin(), end, manager); if (pos != end) { deactivate_policies(**pos); _registered.erase(pos); } } ResourcePolicy& ResourcePoliciesGatekeeper::get_current_policy(History* history) throw(runtime_error) { assert(history != NULL); PolicyIterator 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 ResourcePoliciesGatekeeper::activate_policy(History *history, ResourcePolicy* policy) { assert(history != NULL && policy != NULL); _active_policies[history] = policy; } ResourcePoliciesGatekeeper::ResourcePoliciesGatekeeper() {} void ResourcePoliciesGatekeeper::deactivate_policies(const ResourcePolicyManager& manager) { typedef vector::const_iterator AvailableIt; const vector& policies = manager.get_avail_policies(); for (AvailableIt avail_it = policies.begin(); avail_it != policies.end(); ++avail_it) { for (PolicyIterator it = _active_policies.begin(); it != _active_policies.end();) if (it->second == *avail_it) // Please note the postfix increment (operating // on the old iterator, now invalidated by erase) _active_policies.erase(it++); else ++it; } //~ for(avail_it) }