- "Beautify" debug printout from Python policy manager
- Added support for resource policies in textual frontend git-svn-id: svn://svn.gna.org/svn/sgpemv2/trunk@1064 3ecf2c5c-341e-0410-92b4-d18e462d057c
This commit is contained in:
parent
f7b440d53a
commit
0c02a29f8b
|
@ -122,7 +122,7 @@ PythonCPUPolicyManager::collect_policies()
|
|||
if (dot_py.match(*file_it))
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
std::clog << "\t" << *file_it << " is a valid Python script. Attempting to load... ";
|
||||
std::clog << *file_it << " appears to be a Python script. Attempting to load..." << std::endl;
|
||||
#endif
|
||||
//strip extension
|
||||
std::string policy_name = (*file_it).substr(0, (*file_it).size() - 3);
|
||||
|
@ -132,10 +132,6 @@ PythonCPUPolicyManager::collect_policies()
|
|||
PythonCPUPolicy *pypolicy = new PythonCPUPolicy(policy_name.c_str());
|
||||
|
||||
_policies.push_back(pypolicy);
|
||||
|
||||
#ifndef NDEBUG
|
||||
std::clog << "OK\n";
|
||||
#endif
|
||||
}
|
||||
catch (const MalformedPolicyException& e)
|
||||
{
|
||||
|
|
|
@ -52,7 +52,10 @@ namespace sgpem
|
|||
friend class Singleton<CPUPoliciesGatekeeper>;
|
||||
|
||||
public:
|
||||
std::vector<CPUPolicyManager*> get_registered() const;
|
||||
typedef CPUPolicyManager Manager;
|
||||
typedef std::vector<Manager*> Managers;
|
||||
|
||||
Managers get_registered() const;
|
||||
|
||||
void register_manager(CPUPolicyManager* manager);
|
||||
|
||||
|
@ -74,7 +77,7 @@ namespace sgpem
|
|||
// Deactivates active policies managed by the specified manager.
|
||||
void deactivate_policies(CPUPolicyManager* manager);
|
||||
|
||||
std::vector<CPUPolicyManager*> _registered;
|
||||
Managers _registered;
|
||||
std::map<History*, CPUPolicy*> _active_policies;
|
||||
};
|
||||
|
||||
|
|
|
@ -38,6 +38,8 @@ namespace sgpem
|
|||
class SG_DLLEXPORT CPUPolicyManager
|
||||
{
|
||||
public:
|
||||
typedef CPUPolicy Policy;
|
||||
typedef std::vector<Policy*> Policies;
|
||||
/** \brief CPUPolicyManager constructor
|
||||
*
|
||||
* Saves ``this'' pointer into the _registered attribute, so it can access
|
||||
|
@ -51,7 +53,7 @@ namespace sgpem
|
|||
|
||||
virtual ~CPUPolicyManager() = 0;
|
||||
|
||||
virtual const std::vector<CPUPolicy*>& get_avail_policies() = 0;
|
||||
virtual const Policies& get_avail_policies() = 0;
|
||||
|
||||
protected:
|
||||
virtual void collect_policies() = 0;
|
||||
|
|
|
@ -50,7 +50,8 @@ namespace sgpem
|
|||
friend class Singleton<ResourcePoliciesGatekeeper>;
|
||||
|
||||
public:
|
||||
typedef std::vector<ResourcePolicyManager*> Managers;
|
||||
typedef ResourcePolicyManager Manager;
|
||||
typedef std::vector<Manager*> Managers;
|
||||
|
||||
const Managers& get_registered() const;
|
||||
|
||||
|
@ -69,7 +70,7 @@ namespace sgpem
|
|||
|
||||
void deactivate_policies(const ResourcePolicyManager& manager);
|
||||
|
||||
std::vector<ResourcePolicyManager*> _registered;
|
||||
Managers _registered;
|
||||
std::map<History*, ResourcePolicy*> _active_policies;
|
||||
};
|
||||
|
||||
|
|
|
@ -41,6 +41,8 @@ namespace sgpem
|
|||
class SG_DLLEXPORT ResourcePolicyManager
|
||||
{
|
||||
public:
|
||||
typedef ResourcePolicy Policy;
|
||||
typedef std::vector<Policy*> Policies;
|
||||
/** \brief ResourcePolicyManager constructor
|
||||
*
|
||||
* Registers itself to the ResourcePoliciesGatekeeper singleton.
|
||||
|
@ -49,7 +51,7 @@ namespace sgpem
|
|||
|
||||
virtual ~ResourcePolicyManager();
|
||||
|
||||
virtual const std::vector<ResourcePolicy*>& get_avail_policies() const = 0;
|
||||
virtual const Policies& get_avail_policies() const = 0;
|
||||
};
|
||||
|
||||
} //~ namespace sgpem
|
||||
|
|
|
@ -39,6 +39,8 @@
|
|||
#include <sgpemv2/sub_request.hh>
|
||||
#include <sgpemv2/ready_queue.hh>
|
||||
|
||||
#include <sgpemv2/templates/sequences.tcc>
|
||||
|
||||
#include "text_simulation.hh"
|
||||
|
||||
#include <glibmm/timer.h>
|
||||
|
@ -58,7 +60,6 @@ using Glib::ustring;
|
|||
|
||||
namespace sgpem
|
||||
{
|
||||
//TODO move this class to another file... (?)
|
||||
template <typename T>
|
||||
class CommandParameter
|
||||
{
|
||||
|
@ -652,10 +653,12 @@ TextSimulation::on_help(const Tokens& arguments)
|
|||
"continue it.\n"));
|
||||
else if (command == "JUMPTO")
|
||||
p_stdout(_("-- JUMPTO COMMAND --\nPauses the simulation and jumps to the specified instant.\n"));
|
||||
else if (command == "CONFIGURE-CPU-POLICY")
|
||||
p_stdout(_("-- CONFIGURE-CPU-POLICY COMMAND --\nConfigure parameters exposed by "
|
||||
"the cpu policy.\n\nThis is currently the only way to control the behaviour of "
|
||||
"cpu policies without modifying their source code.\n"));
|
||||
else if (command == "CONFIGURE")
|
||||
p_stdout(_("-- CONFIGURE COMMAND --\nConfigures a configurable entity.\n\n"
|
||||
"Syntax: CONFIGURE <entity>\n"
|
||||
"\twhere <entity> may be cpu-policy or resource-policy.\n"
|
||||
"This is currently the only way to control the behaviour of "
|
||||
"policies without modifying their source code.\n"));
|
||||
else if (command == "HELP")
|
||||
p_stdout(_("-- HELP COMMAND --\nThe help you're reading.\n"));
|
||||
else if (command == "GET")
|
||||
|
@ -663,7 +666,7 @@ TextSimulation::on_help(const Tokens& arguments)
|
|||
"\twhere <attr_name> may be simulation-tick or continuous.\n"));
|
||||
else if (command == "SET")
|
||||
p_stdout(_("-- SET COMMAND --\nSyntax: SET <attr_name> [=] <value>\n"
|
||||
"\twhere <attr_name> may be simulation-tick, continuous or cpu-policy.\n"));
|
||||
"\twhere <attr_name> may be simulation-tick, continuous, cpu-policy or resource-policy.\n"));
|
||||
else if (command == "SHOW")
|
||||
p_stderr(_("-- SHOW COMMAND --\nDisplays the name of the entities (if available) "
|
||||
"and other informations prefixed by its numeric identifier.\n\n"
|
||||
|
@ -745,6 +748,36 @@ TextSimulation::on_get(const Tokens& arguments)
|
|||
p_stderr(_("ERROR: invalid attribute name.\n"));
|
||||
}
|
||||
|
||||
template <typename GatekeeperType>
|
||||
typename GatekeeperType::Manager::Policy&
|
||||
policy_from_index(const Glib::ustring& value) throw(domain_error)
|
||||
{
|
||||
int index = string_to<int>(value) - 1;
|
||||
|
||||
if (index < 0)
|
||||
throw domain_error("");
|
||||
|
||||
typedef typename GatekeeperType::Managers ManagerVec;
|
||||
typedef typename GatekeeperType::Manager::Policies PolicyVec;
|
||||
typedef typename PolicyVec::iterator CPUPolicyIt;
|
||||
|
||||
ManagerVec managers = GatekeeperType::get_instance().get_registered();
|
||||
|
||||
for (typename ManagerVec::iterator mit = managers.begin(); mit != managers.end(); ++mit)
|
||||
{
|
||||
PolicyVec policies = (*mit)->get_avail_policies();
|
||||
for (CPUPolicyIt pit = policies.begin(); pit != policies.end(); ++pit)
|
||||
{
|
||||
if (index == 0)
|
||||
return *(*pit);
|
||||
|
||||
--index;
|
||||
}
|
||||
}
|
||||
|
||||
throw domain_error("");
|
||||
}
|
||||
|
||||
void
|
||||
TextSimulation::on_set(const Tokens& arguments)
|
||||
{
|
||||
|
@ -783,49 +816,20 @@ TextSimulation::on_set(const Tokens& arguments)
|
|||
}
|
||||
else if (attr == "CPU-POLICY")
|
||||
{
|
||||
int policy;
|
||||
|
||||
try
|
||||
{
|
||||
policy = string_to<int>(value) - 1;
|
||||
CPUPolicy& p = policy_from_index<CPUPoliciesGatekeeper>(value);
|
||||
|
||||
if (policy < 0)
|
||||
throw domain_error("");
|
||||
Simulation::get_instance().set_policy(&p);
|
||||
p_stdout("\n");
|
||||
p_stdout(p.get_name() + _(" scheduling policy selected.\n"));
|
||||
|
||||
typedef vector<CPUPolicyManager*> ManagerVec;
|
||||
typedef vector<CPUPolicy*>::iterator CPUPolicyIt;
|
||||
|
||||
CPUPoliciesGatekeeper& gatekeeper = CPUPoliciesGatekeeper::get_instance();
|
||||
|
||||
ManagerVec managers = gatekeeper.get_registered();
|
||||
|
||||
for (ManagerVec::iterator it = managers.begin(); it != managers.end(); ++it)
|
||||
{
|
||||
vector<CPUPolicy*> policies = (*it)->get_avail_policies();
|
||||
for (CPUPolicyIt it = policies.begin(); it != policies.end(); ++it)
|
||||
{
|
||||
if (policy == 0)
|
||||
{
|
||||
Simulation::get_instance().set_policy(*it);
|
||||
cout << endl << (*it)->get_name() << " scheduling policy selected." << endl;
|
||||
|
||||
// FIXME: dedicate a function to set resource policy
|
||||
// which includes the following default one
|
||||
ResourcePolicyManager & rpm = *ResourcePoliciesGatekeeper::get_instance().get_registered().at(0);
|
||||
Simulation::get_instance().set_resource_policy(rpm.get_avail_policies().at(0));
|
||||
// end of include
|
||||
}
|
||||
|
||||
--policy;
|
||||
}
|
||||
}
|
||||
|
||||
if (policy >= 0)
|
||||
throw domain_error("");
|
||||
//ResourcePolicyManager & rpm = *ResourcePoliciesGatekeeper::get_instance().get_registered().at(0);
|
||||
//Simulation::get_instance().set_resource_policy(rpm.get_avail_policies().at(0));
|
||||
}
|
||||
catch (domain_error e)
|
||||
{
|
||||
p_stderr(_("ERROR: invalid unsigned integer or not a valid policy index\n"));
|
||||
p_stderr(_("ERROR: invalid unsigned integer or not a valid scheduling policy index\n"));
|
||||
}
|
||||
catch (const CPUPolicyException& e)
|
||||
{
|
||||
|
@ -835,6 +839,27 @@ TextSimulation::on_set(const Tokens& arguments)
|
|||
}
|
||||
|
||||
}
|
||||
else if (attr == "RESOURCE-POLICY")
|
||||
{
|
||||
try
|
||||
{
|
||||
ResourcePolicy& p = policy_from_index<ResourcePoliciesGatekeeper>(value);
|
||||
|
||||
Simulation::get_instance().set_resource_policy(&p);
|
||||
p_stdout("\n");
|
||||
p_stdout(p.get_name() + _(" resource policy selected.\n"));
|
||||
}
|
||||
catch (domain_error e)
|
||||
{
|
||||
p_stderr(_("ERROR: invalid unsigned integer or not a valid resource policy index\n"));
|
||||
}
|
||||
catch (const CPUPolicyException& e)
|
||||
{
|
||||
p_stderr(_("ERROR: "));
|
||||
p_stderr(e.what());
|
||||
p_stderr("\n");
|
||||
}
|
||||
}
|
||||
else if (attr == "CONTINUOUS")
|
||||
{
|
||||
try
|
||||
|
@ -1014,27 +1039,27 @@ TextSimulation::on_show_subrequests(const Tokens& arguments)
|
|||
show(subrequests);
|
||||
}
|
||||
|
||||
template <typename GatekeeperType>
|
||||
void
|
||||
TextSimulation::on_show_cpu_policies(const Tokens& arguments)
|
||||
TextSimulation::show_policies(const Tokens& arguments)
|
||||
{
|
||||
typedef vector<CPUPolicyManager*> ManagerVec;
|
||||
typedef vector<CPUPolicy*>::iterator CPUPolicyIt;
|
||||
typedef typename GatekeeperType::Managers ManagerVec;
|
||||
typedef typename GatekeeperType::Manager::Policies PolicyVec;
|
||||
typedef typename PolicyVec::iterator PolicyIt;
|
||||
|
||||
check_arguments_num(arguments, 0);
|
||||
|
||||
CPUPoliciesGatekeeper& gatekeeper = CPUPoliciesGatekeeper::get_instance();
|
||||
|
||||
ManagerVec managers = gatekeeper.get_registered();
|
||||
ManagerVec managers = GatekeeperType::get_instance().get_registered();
|
||||
|
||||
unsigned int index = 1;
|
||||
for (ManagerVec::iterator it = managers.begin(); it != managers.end(); ++it)
|
||||
for (typename ManagerVec::iterator mit = managers.begin(); mit != managers.end(); ++mit)
|
||||
{
|
||||
vector<CPUPolicy*> policies = (*it)->get_avail_policies();
|
||||
for (CPUPolicyIt it = policies.begin(); it != policies.end(); ++it)
|
||||
PolicyVec policies = (*mit)->get_avail_policies();
|
||||
for (PolicyIt pit = policies.begin(); pit != policies.end(); ++pit)
|
||||
{
|
||||
ostringstream oss;
|
||||
oss << endl << index << ". " << (*it)->get_name() << endl;
|
||||
oss << "\t" << (*it)->get_description() << endl;
|
||||
oss << endl << index << ". " << (*pit)->get_name() << endl;
|
||||
oss << "\t" << (*pit)->get_description() << endl;
|
||||
|
||||
p_stdout(oss.str());
|
||||
++index;
|
||||
|
@ -1042,12 +1067,16 @@ TextSimulation::on_show_cpu_policies(const Tokens& arguments)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
TextSimulation::on_show_cpu_policies(const Tokens& arguments)
|
||||
{
|
||||
show_policies<CPUPoliciesGatekeeper>(arguments);
|
||||
}
|
||||
|
||||
void
|
||||
TextSimulation::on_show_resource_policies(const Tokens& arguments)
|
||||
{
|
||||
// Waiting for the coder to implementat resource policies
|
||||
// But wait a moment, the coder is me!!!
|
||||
p_stderr(_("FIXME: Not implemented\n"));
|
||||
show_policies<ResourcePoliciesGatekeeper>(arguments);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -77,6 +77,8 @@ namespace sgpem
|
|||
void get_parameter(CommandParameter<T>& parameter);
|
||||
template <typename PolicyType>
|
||||
void configure_policy(PolicyType& policy);
|
||||
template <typename GatekeeperType>
|
||||
void show_policies(const Tokens& arguments);
|
||||
|
||||
void on_run(const Tokens& arguments);
|
||||
void on_pause(const Tokens& arguments);
|
||||
|
|
Loading…
Reference in New Issue