-/* Copyright (c) 2009-2017. The SimGrid Team.
+/* Copyright (c) 2009-2018. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "simdag_private.hpp"
+#include "simgrid/s4u/Engine.hpp"
#include "simgrid/simdag.h"
#include "src/internal_config.h"
-#include "xbt/file.h"
-#include <string.h>
+#include "xbt/file.hpp"
+#include <cstring>
#include <unordered_map>
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_dotparse, sd, "Parsing DOT files");
SD_task_t root;
SD_task_t end;
SD_task_t task;
- xbt_dynar_t computer = nullptr;
- xbt_dict_cursor_t dict_cursor;
+ std::vector<SD_task_t>* computer;
+ std::unordered_map<std::string, std::vector<SD_task_t>*> computers;
bool schedule_success = true;
std::unordered_map<std::string, SD_task_t> jobs;
Agraph_t * dag_dot = agread(in_file, NIL(Agdisc_t *));
- xbt_dict_t computers = xbt_dict_new_homogeneous(nullptr);
-
/* Create all the nodes */
Agnode_t *node = nullptr;
for (node = agfstnode(dag_dot); node; node = agnxtnode(dag_dot, node)) {
if ((performer != -1 && order != -1) && performer < static_cast<int>(sg_host_count())) {
/* required parameters are given and less performers than hosts are required */
XBT_DEBUG ("Task '%s' is scheduled on workstation '%d' in position '%d'", task->name, performer, order);
- computer = static_cast<xbt_dynar_t> (xbt_dict_get_or_null(computers, char_performer));
- if(computer == nullptr){
- computer = xbt_dynar_new(sizeof(SD_task_t), nullptr);
- xbt_dict_set(computers, char_performer, computer, nullptr);
+ auto comp = computers.find(char_performer);
+ if (comp != computers.end()) {
+ computer = comp->second;
+ } else {
+ computer = new std::vector<SD_task_t>;
+ computers.insert({char_performer, computer});
}
-
- if(static_cast<unsigned int>(order) < xbt_dynar_length(computer)){
- SD_task_t *task_test = (SD_task_t *)xbt_dynar_get_ptr(computer,order);
- if(*task_test && *task_test != task){
+ if (static_cast<unsigned int>(order) < computer->size()) {
+ SD_task_t task_test = computer->at(order);
+ if (task_test && task_test != task) {
/* the user gave the same order to several tasks */
schedule_success = false;
XBT_VERB("Task '%s' wants to start on performer '%s' at the same position '%s' as task '%s'",
- (*task_test)->name, char_performer, char_order, task->name);
+ task_test->name, char_performer, char_order, task->name);
continue;
}
- }
- /* the parameter seems to be ok */
- xbt_dynar_set_as(computer, order, SD_task_t, task);
+ } else
+ computer->resize(order);
+
+ computer->insert(computer->begin() + order, task);
} else {
/* one of required parameters is not given */
schedule_success = false;
task = SD_task_create_comm_e2e(name.c_str(), nullptr, size);
else
task = SD_task_create_comm_par_mxn_1d_block(name.c_str(), nullptr, size);
- SD_task_dependency_add(nullptr, nullptr, src, task);
- SD_task_dependency_add(nullptr, nullptr, task, dst);
+ SD_task_dependency_add(src, task);
+ SD_task_dependency_add(task, dst);
jobs.insert({name, task});
xbt_dynar_push(result, &task);
} else {
XBT_WARN("Task '%s' is defined more than once", name.c_str());
}
} else {
- SD_task_dependency_add(nullptr, nullptr, src, dst);
+ SD_task_dependency_add(src, dst);
}
}
}
xbt_dynar_foreach (result, i, task){
if (task->predecessors->empty() && task->inputs->empty() && task != root) {
XBT_DEBUG("Task '%s' has no source. Add dependency from 'root'", task->name);
- SD_task_dependency_add(nullptr, nullptr, root, task);
+ SD_task_dependency_add(root, task);
}
if (task->successors->empty() && task->outputs->empty() && task != end) {
XBT_DEBUG("Task '%s' has no destination. Add dependency to 'end'", task->name);
- SD_task_dependency_add(nullptr, nullptr, task, end);
+ SD_task_dependency_add(task, end);
}
}
fclose(in_file);
if(schedule){
- char *computer_name;
if (schedule_success) {
- const sg_host_t *workstations = sg_host_list ();
- xbt_dict_foreach(computers,dict_cursor,computer_name,computer){
+ std::vector<simgrid::s4u::Host*> hosts = simgrid::s4u::Engine::getInstance()->getAllHosts();
+
+ for (auto const& elm : computers) {
SD_task_t previous_task = nullptr;
- xbt_dynar_foreach(computer, i, task){
+ for (auto const& task : *elm.second) {
/* add dependency between the previous and the task to avoid parallel execution */
if(task){
if (previous_task && not SD_task_dependency_exists(previous_task, task))
- SD_task_dependency_add(nullptr, nullptr, previous_task, task);
+ SD_task_dependency_add(previous_task, task);
- SD_task_schedulel(task, 1, workstations[atoi(computer_name)]);
+ SD_task_schedulel(task, 1, hosts[atoi(elm.first.c_str())]);
previous_task = task;
}
}
- xbt_dynar_free(&computer);
+ delete elm.second;
}
} else {
XBT_WARN("The scheduling is ignored");
- xbt_dict_foreach(computers,dict_cursor,computer_name,computer)
- xbt_dynar_free(&computer);
+ for (auto const& elm : computers)
+ delete elm.second;
xbt_dynar_free(&result);
result = nullptr;
}
}
- xbt_dict_free(&computers);
-
if (result && not acyclic_graph_detail(result)) {
- char* base = xbt_basename(filename);
- XBT_ERROR("The DOT described in %s is not a DAG. It contains a cycle.", base);
- free(base);
+ std::string base = simgrid::xbt::Path(filename).getBasename();
+ XBT_ERROR("The DOT described in %s is not a DAG. It contains a cycle.", base.c_str());
xbt_dynar_free(&result);
result = nullptr;
}