Skip to content
Snippets Groups Projects

Better memory management and float rounding issues

Merged Ghost User requested to merge issue12 into master
6 files
+ 37
40
Compare changes
  • Side-by-side
  • Inline
Files
6
+ 34
14
@@ -8,6 +8,7 @@
#include "../pempek_assert.hpp"
#include "rapidjson/rapidjson.h"
#include <loguru.hpp>
#include <memory>
using namespace rapidjson;
Broker::Broker(rapidjson::Document *user_description_file)
@@ -15,6 +16,16 @@ Broker::Broker(rapidjson::Document *user_description_file)
/* Parse description file and call constructor for each user */
if (!user_description_file->ObjectEmpty())
{
if (user_description_file->HasMember("core_limit_per_user"))
{
PPK_ASSERT_ERROR(
(*user_description_file)["core_limit_per_user"].IsInt(),
"Invalid user_description file: field "
"'core_limit_per_user' should be an int.");
core_limit_per_user
= (*user_description_file)["core_limit_per_user"].GetInt();
// otherwise, initialized at std::numeric_limits<int>::max()
}
if (user_description_file->HasMember("dm_window"))
{
const Value &dm_param = (*user_description_file)["dm_window"];
@@ -143,8 +154,7 @@ Broker::~Broker()
{
delete it.second;
}
for (auto itr = dynamic_jobs.begin(); itr != dynamic_jobs.end(); itr++)
delete itr->second;
dynamic_jobs.clear();
users_to_wake.clear();
}
@@ -155,10 +165,10 @@ double Broker::next_submission(double date) const
}
void Broker::jobs_to_submit(
double date, list<Job *> &jobs, list<Profile *> &profiles)
double date, list<Job> &jobs, list<const Profile *> &profiles)
{
jobs = list<Job *>();
profiles = list<Profile *>();
jobs = list<Job>();
profiles = list<const Profile *>();
User *user = user_queue.front();
double planned_date_submission = user->next_submission();
@@ -171,15 +181,25 @@ void Broker::jobs_to_submit(
while (planned_date_submission == user->next_submission())
{
user_queue.pop_front();
list<Job *> user_jobs;
list<Profile *> user_profiles;
unsigned int nb_core_requested = 0;
list<shared_ptr<Job>> user_jobs;
list<const Profile *> user_profiles;
user->jobs_to_submit(date, user_jobs, user_profiles);
for (Job *job : user_jobs)
for (shared_ptr<Job> job : user_jobs)
{
jobs.push_back(job);
dynamic_jobs[job->id] = job;
job->status = WAITING;
nb_core_requested = nb_core_requested + job->nb_requested_resources;
if (nb_core_requested > core_limit_per_user)
{
job->status = KILLED;
}
else
{
jobs.push_back(*job);
dynamic_jobs[job->id] = job;
job->status = WAITING;
}
}
profiles.splice(profiles.end(), user_profiles);
@@ -231,7 +251,7 @@ void Broker::update_status_if_dyn_job(
{
string user_name = job_id.substr(0, job_id.find('!'));
User *user = users[user_name];
Job *current_job = it->second;
shared_ptr<Job> current_job = it->second;
switch (status)
{
@@ -250,7 +270,7 @@ void Broker::update_status_if_dyn_job(
/* Add potentially interested user to the map of users to wake up */
if (users_to_wake.find(user) == users_to_wake.end())
users_to_wake.emplace(user, list<Job *>());
users_to_wake.emplace(user, list<shared_ptr<Job>>());
/* ..and keep track of its recently ended jobs */
users_to_wake[user].push_back(current_job);
@@ -265,7 +285,7 @@ void Broker::update_status_if_dyn_job(
/* Add potentially interested user to the map of users to wake up */
if (users_to_wake.find(user) == users_to_wake.end())
users_to_wake.emplace(user, list<Job *>());
users_to_wake.emplace(user, list<shared_ptr<Job>>());
/* ..and keep track of its recently ended jobs */
users_to_wake[user].push_back(current_job);
Loading