-/* Copyright (c) 2009-2018. The SimGrid Team.
+/* Copyright (c) 2009-2019. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "simgrid/simdag.h"
#include "src/internal_config.h"
#include "xbt/file.hpp"
+#include <algorithm>
#include <cstring>
#include <unordered_map>
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_dotparse, sd, "Parsing DOT files");
+#include <vector>
#if HAVE_GRAPHVIZ
#include <graphviz/cgraph.h>
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_dotparse, sd, "Parsing DOT files");
+
xbt_dynar_t SD_dotload_generic(const char* filename, bool sequential, bool schedule);
static void dot_task_p_free(void *task) {
return SD_dotload_generic(filename, true, true);
}
-static int edge_compare(const void *a, const void *b)
-{
- unsigned va = AGSEQ(*(Agedge_t **)a);
- unsigned vb = AGSEQ(*(Agedge_t **)b);
- if (va == vb)
- return 0;
- else
- return (va < vb ? -1 : 1);
-}
-
xbt_dynar_t SD_dotload_generic(const char* filename, bool sequential, bool schedule)
{
xbt_assert(filename, "Unable to use a null file descriptor\n");
FILE *in_file = fopen(filename, "r");
xbt_assert(in_file != nullptr, "Failed to open file: %s", filename);
- unsigned int i;
SD_task_t root;
SD_task_t end;
SD_task_t task;
end = jobs.at("end");
/* Create edges */
- xbt_dynar_t edges = xbt_dynar_new(sizeof(Agedge_t*), nullptr);
+ std::vector<Agedge_t*> edges;
for (node = agfstnode(dag_dot); node; node = agnxtnode(dag_dot, node)) {
- Agedge_t * edge;
- xbt_dynar_reset(edges);
- for (edge = agfstout(dag_dot, node); edge; edge = agnxtout(dag_dot, edge))
- xbt_dynar_push_as(edges, Agedge_t *, edge);
+ edges.clear();
+ for (Agedge_t* edge = agfstout(dag_dot, node); edge; edge = agnxtout(dag_dot, edge))
+ edges.push_back(edge);
/* Be sure edges are sorted */
- xbt_dynar_sort(edges, edge_compare);
+ std::sort(edges.begin(), edges.end(), [](const Agedge_t* a, const Agedge_t* b) { return AGSEQ(a) < AGSEQ(b); });
- xbt_dynar_foreach(edges, i, edge) {
+ for (Agedge_t* edge : edges) {
char *src_name=agnameof(agtail(edge));
char *dst_name=agnameof(aghead(edge));
double size = atof(agget(edge, (char *) "size"));
}
}
}
- xbt_dynar_free(&edges);
XBT_DEBUG("All tasks have been created, put %s at the end of the dynar", end->name);
xbt_dynar_push(result, &end);
/* Connect entry tasks to 'root', and exit tasks to 'end'*/
+ unsigned i;
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);
if(schedule){
if (schedule_success) {
- std::vector<simgrid::s4u::Host*> hosts;
- simgrid::s4u::Engine::getInstance()->getHostList(&hosts);
+ std::vector<simgrid::s4u::Host*> hosts = simgrid::s4u::Engine::get_instance()->get_all_hosts();
for (auto const& elm : computers) {
SD_task_t previous_task = nullptr;
- for (auto const& task : *elm.second) {
+ for (auto const& cur_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(previous_task, task);
+ if (cur_task) {
+ if (previous_task && not SD_task_dependency_exists(previous_task, cur_task))
+ SD_task_dependency_add(previous_task, cur_task);
- SD_task_schedulel(task, 1, hosts[atoi(elm.first.c_str())]);
- previous_task = task;
+ SD_task_schedulel(cur_task, 1, hosts[std::stod(elm.first)]);
+ previous_task = cur_task;
}
}
delete elm.second;
}
if (result && not acyclic_graph_detail(result)) {
- std::string base = simgrid::xbt::Path(filename).getBasename();
+ std::string base = simgrid::xbt::Path(filename).get_base_name();
XBT_ERROR("The DOT described in %s is not a DAG. It contains a cycle.", base.c_str());
xbt_dynar_free(&result);
result = nullptr;