- updated PoliciesGatekeeper to reflect change in design, it is still not usable at this time
git-svn-id: svn://svn.gna.org/svn/sgpemv2/trunk@616 3ecf2c5c-341e-0410-92b4-d18e462d057c
This commit is contained in:
parent
1e75fe91f1
commit
c5d78f3547
7 changed files with 103 additions and 24 deletions
|
@ -19,12 +19,21 @@
|
|||
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
#include "policies_gatekeeper.hh"
|
||||
#include "policy_manager.hh"
|
||||
#include "policy.hh"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
|
||||
using std::vector;
|
||||
using std::map;
|
||||
using std::find;
|
||||
using std::runtime_error;
|
||||
using namespace sgpem;
|
||||
|
||||
typedef vector<PolicyManager*>::iterator ManagerIterator;
|
||||
typedef map<History*, Policy*>::iterator ActiveIterator;
|
||||
|
||||
PoliciesGatekeeper* PoliciesGatekeeper::_instance = NULL;
|
||||
|
||||
PoliciesGatekeeper&
|
||||
|
@ -44,11 +53,9 @@ PoliciesGatekeeper::get_registered() const
|
|||
void
|
||||
PoliciesGatekeeper::register_manager(PolicyManager* manager)
|
||||
{
|
||||
using std::find;
|
||||
|
||||
assert(manager != NULL);
|
||||
|
||||
end = _registered.end();
|
||||
ManagerIterator end = _registered.end();
|
||||
|
||||
if(find(_registered.begin(), end, manager) != end)
|
||||
_registered.push_back(manager);
|
||||
|
@ -57,31 +64,78 @@ PoliciesGatekeeper::register_manager(PolicyManager* manager)
|
|||
void
|
||||
PoliciesGatekeeper::unregister_manager(PolicyManager* manager)
|
||||
{
|
||||
using std::find;
|
||||
|
||||
assert(manager != NULL);
|
||||
|
||||
end = _registered.end();
|
||||
pos = find(_registered.begin(), end, manager);
|
||||
ManagerIterator end = _registered.end();
|
||||
ManagerIterator pos = find(_registered.begin(), end, manager);
|
||||
|
||||
if(pos != end)
|
||||
{
|
||||
deactivate_policies(*pos);
|
||||
_registered.erase(pos);
|
||||
}
|
||||
}
|
||||
|
||||
Policy*
|
||||
PoliciesGatekeeper::get_current_policy()
|
||||
PoliciesGatekeeper::get_current_policy(History* history) throw(runtime_error)
|
||||
{
|
||||
return _cur_policy;
|
||||
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
|
||||
PoliciesGatekeeper::activate_policy(Policy* policy)
|
||||
PoliciesGatekeeper::activate_policy(History *history, Policy* policy)
|
||||
{
|
||||
_cur_policy = policy;
|
||||
assert(history != NULL && policy != NULL);
|
||||
|
||||
ActiveIterator end = _active_policies.end();
|
||||
ActiveIterator pos = _active_policies.find(history);
|
||||
|
||||
if(pos != end && pos->second != policy)
|
||||
_active_policies[history]->deactivate();
|
||||
|
||||
if(pos == end || pos->second != policy)
|
||||
{
|
||||
_active_policies[history] = policy;
|
||||
_active_policies[history]->activate();
|
||||
}
|
||||
}
|
||||
|
||||
PoliciesGatekeeper::PoliciesGatekeeper() :
|
||||
_cur_policy(NULL)
|
||||
PoliciesGatekeeper::PoliciesGatekeeper()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
PoliciesGatekeeper::deactivate_policies(PolicyManager* manager)
|
||||
{
|
||||
typedef vector<Policy*>::iterator PolicyIterator;
|
||||
|
||||
vector<Policy*> avail_policies = manager->get_avail_policies();
|
||||
|
||||
PolicyIterator avail_it = avail_policies.begin();
|
||||
PolicyIterator avail_end = avail_policies.end();
|
||||
|
||||
for(; avail_it != avail_end; ++avail_it)
|
||||
{
|
||||
// TODO isn't there a way to write more compact code by using
|
||||
// library utilities?
|
||||
ActiveIterator act_it = _active_policies.begin();
|
||||
|
||||
for(; act_it != _active_policies.end(); ++act_it)
|
||||
{
|
||||
if(act_it->second == *avail_it)
|
||||
{
|
||||
act_it->second->deactivate();
|
||||
_active_policies.erase(act_it);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -25,11 +25,14 @@ namespace sgpem
|
|||
{
|
||||
class PolicyManager;
|
||||
class Policy;
|
||||
class History;
|
||||
}
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace sgpem
|
||||
{
|
||||
|
@ -51,25 +54,23 @@ namespace sgpem
|
|||
|
||||
std::vector<PolicyManager*> get_registered() const;
|
||||
|
||||
/** FIXME what to do when the manager was already registered? should we throw an exception?
|
||||
*
|
||||
*/
|
||||
void register_manager(PolicyManager* manager);
|
||||
|
||||
/** FIXME what to do when the manager wasn't already registered? should we throw an exception?
|
||||
*
|
||||
*/
|
||||
void unregister_manager(PolicyManager* manager);
|
||||
|
||||
Policy* get_current_policy();
|
||||
Policy* get_current_policy(History* history) throw(std::runtime_error);
|
||||
|
||||
void activate_policy(Policy* policy);
|
||||
void activate_policy(History* history, Policy* policy);
|
||||
|
||||
private:
|
||||
PoliciesGatekeeper(); //private constructor.
|
||||
PoliciesGatekeeper(); //private constructor.
|
||||
|
||||
// Deactivates active policies managed by the specified manager.
|
||||
void deactivate_policies(PolicyManager* manager);
|
||||
|
||||
static PoliciesGatekeeper* _instance;
|
||||
std::vector<PolicyManager*> _registered;
|
||||
Policy* _cur_policy;
|
||||
std::map<History*, Policy*> _active_policies;
|
||||
};
|
||||
|
||||
}//~ namespace sgpem
|
||||
|
|
|
@ -112,6 +112,10 @@ namespace sgpem
|
|||
composing the queue passed to the sort_queue method.
|
||||
*/
|
||||
virtual policy_sorts_type wants() const throw(UserInterruptException) = 0;
|
||||
|
||||
virtual void activate() = 0;
|
||||
|
||||
virtual void deactivate() = 0;
|
||||
|
||||
/**
|
||||
Gets the parameters related with this policy.
|
||||
|
@ -121,7 +125,7 @@ namespace sgpem
|
|||
\return The policy parameters.
|
||||
*/
|
||||
PolicyParameters& get_parameters();
|
||||
|
||||
|
||||
protected:
|
||||
PolicyParameters _parameters;
|
||||
int _id;
|
||||
|
|
|
@ -61,6 +61,8 @@ namespace sgpem
|
|||
*/
|
||||
virtual void init() = 0;
|
||||
|
||||
virtual std::vector<Policy*> get_avail_policies() = 0;
|
||||
|
||||
/** \brief Get the registered manager instance
|
||||
*
|
||||
* \return The registered policy manager instance.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue