From: Frederic Suter Date: Thu, 30 Mar 2017 12:17:10 +0000 (+0200) Subject: attempt to plug all leaks for simdag. X-Git-Tag: v3.16~410 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/8bbfe13824ddf0cc95d518ade3fdde07d64054f8?ds=inline attempt to plug all leaks for simdag. only fill a dynar if you need it, and in this case allocate and free it yourself --- diff --git a/ChangeLog b/ChangeLog index b3604d0f64..f08586e526 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,11 @@ SimGrid (3.16) UNRELEASED - +SimDag + - New and Backwards Compatibility break: + SD_simulate_with_update (double how_long, xbt_dynar_t changed_tasks_dynar) + When one wants to get the list of tasks whose states have changed during a + simulation round, s/he has to allocate and free a dynar and use it as argument + to this function. The former SD_simulate (double how_long) now returns void. -- Release target: June 21 2017 -- Da SimGrid team diff --git a/examples/simdag/availability/sd_availability.c b/examples/simdag/availability/sd_availability.c index 083c5d9617..b85738c095 100644 --- a/examples/simdag/availability/sd_availability.c +++ b/examples/simdag/availability/sd_availability.c @@ -74,9 +74,9 @@ int main(int argc, char **argv) SD_task_watch(t3, SD_DONE); SD_task_watch(c3, SD_DONE); SD_task_watch(t4, SD_DONE); - + xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL); while (1) { - xbt_dynar_t changed_tasks = SD_simulate(-1.0); + SD_simulate_with_update(-1.0, changed_tasks); if (xbt_dynar_is_empty(changed_tasks)) break; XBT_INFO("link1: bw=%.0f, lat=%f", sg_host_route_bandwidth(hosts[0], hosts[1]), @@ -92,9 +92,10 @@ int main(int argc, char **argv) if (SD_task_get_state(task)==SD_DONE) SD_task_destroy(task); } - xbt_dynar_free(&changed_tasks); + xbt_dynar_reset(changed_tasks); } SD_exit(); xbt_free(hosts); + xbt_dynar_free(&changed_tasks); return 0; } diff --git a/examples/simdag/dag-dotload/sd_dag-dotload.c b/examples/simdag/dag-dotload/sd_dag-dotload.c index 24d94fee17..11260d929d 100644 --- a/examples/simdag/dag-dotload/sd_dag-dotload.c +++ b/examples/simdag/dag-dotload/sd_dag-dotload.c @@ -73,8 +73,7 @@ int main(int argc, char **argv) xbt_free(hosts); XBT_INFO("------------------- Run the schedule ---------------------------"); - xbt_dynar_t changed_tasks = SD_simulate(-1); - xbt_dynar_free(&changed_tasks); + SD_simulate(-1); XBT_INFO("------------------- Produce the trace file---------------------------"); XBT_INFO("Producing the trace of the run into %s", basename(tracefilename)); diff --git a/examples/simdag/fail/sd_fail.c b/examples/simdag/fail/sd_fail.c index 995932aded..1cc34e7032 100644 --- a/examples/simdag/fail/sd_fail.c +++ b/examples/simdag/fail/sd_fail.c @@ -30,8 +30,7 @@ int main(int argc, char **argv) SD_task_schedulel(task, 1, sg_host_by_name("Faulty Host")); - xbt_dynar_t tasks = SD_simulate(-1.0); - xbt_dynar_free(&tasks); + SD_simulate(-1.0); SD_task_dump(task); @@ -43,8 +42,7 @@ int main(int argc, char **argv) SD_task_schedulel(task, 1, sg_host_by_name("Safe Host")); XBT_INFO("Run the simulation again"); - tasks = SD_simulate(-1.0); - xbt_dynar_free(&tasks); + SD_simulate(-1.0); SD_task_dump(task); XBT_INFO("Task '%s' start time: %f, finish time: %f", SD_task_get_name(task), SD_task_get_start_time(task), @@ -65,8 +63,7 @@ int main(int argc, char **argv) hosts[0] = sg_host_by_name("Faulty Host"); SD_task_schedule(task, 1, hosts, computation_amount, communication_amount,-1); - tasks = SD_simulate(-1.0); - xbt_dynar_free(&tasks); + SD_simulate(-1.0); SD_task_dump(task); @@ -81,8 +78,7 @@ int main(int argc, char **argv) SD_task_schedule(task, 1, hosts, computation_amount, communication_amount,-1); XBT_INFO("Run the simulation again"); - tasks = SD_simulate(-1.0); - xbt_dynar_free(&tasks); + SD_simulate(-1.0); SD_task_dump(task); XBT_INFO("Task '%s' start time: %f, finish time: %f", SD_task_get_name(task), SD_task_get_start_time(task), diff --git a/examples/simdag/goal/goal_test.c b/examples/simdag/goal/goal_test.c index a44b6ec05c..290e5f3b55 100644 --- a/examples/simdag/goal/goal_test.c +++ b/examples/simdag/goal/goal_test.c @@ -65,12 +65,12 @@ int main(int argc, char **argv) { ws_list = sg_host_list(); reclaimed = xbt_dynar_new(sizeof(bcast_task_t),xbt_free_ref); - xbt_dynar_t done = NULL; + xbt_dynar_t done = xbt_dynar_new(sizeof(SD_task_t), NULL); xbt_os_cputimer_start(timer); send_one(0,sg_host_count()); do { - if (done != NULL && !xbt_dynar_is_empty(done)) { + if (!xbt_dynar_is_empty(done)) { unsigned int cursor; SD_task_t task; @@ -89,9 +89,9 @@ int main(int argc, char **argv) { } SD_task_destroy(task); } - xbt_dynar_free(&done); + xbt_dynar_free_container(&done); } - done=SD_simulate(-1); + SD_simulate_with_update(-1, done); } while(!xbt_dynar_is_empty(done)); xbt_os_cputimer_stop(timer); printf("exec_time:%f\n", xbt_os_timer_elapsed(timer) ); diff --git a/examples/simdag/scheduling/sd_scheduling.c b/examples/simdag/scheduling/sd_scheduling.c index 726c701d33..0dcf2877be 100644 --- a/examples/simdag/scheduling/sd_scheduling.c +++ b/examples/simdag/scheduling/sd_scheduling.c @@ -171,13 +171,18 @@ int main(int argc, char **argv) xbt_dynar_get_cpy(dax, 0, &task); sg_host_t host = SD_task_get_best_host(task); SD_task_schedulel(task, 1, host); + xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL); + SD_simulate_with_update(-1.0, changed_tasks); - while (!xbt_dynar_is_empty(SD_simulate(-1.0))) { + while (!xbt_dynar_is_empty(changed_tasks)) { /* Get the set of ready tasks */ ready_tasks = get_ready_tasks(dax); + xbt_dynar_reset(changed_tasks); + if (xbt_dynar_is_empty(ready_tasks)) { xbt_dynar_free_container(&ready_tasks); /* there is no ready task, let advance the simulation */ + SD_simulate_with_update(-1.0, changed_tasks); continue; } /* For each ready task: @@ -219,6 +224,8 @@ int main(int argc, char **argv) xbt_dynar_free_container(&ready_tasks); /* reset the min_finish_time for the next set of ready tasks */ min_finish_time = -1.; + xbt_dynar_reset(changed_tasks); + SD_simulate_with_update(-1.0, changed_tasks); } XBT_INFO("Simulation Time: %f", SD_get_clock()); @@ -230,6 +237,7 @@ int main(int argc, char **argv) free(tracefilename); xbt_dynar_free_container(&ready_tasks); + xbt_dynar_free(&changed_tasks); xbt_dynar_foreach(dax, cursor, task) { SD_task_destroy(task); diff --git a/examples/simdag/throttling/sd_throttling.c b/examples/simdag/throttling/sd_throttling.c index 58b210b805..cbef569998 100644 --- a/examples/simdag/throttling/sd_throttling.c +++ b/examples/simdag/throttling/sd_throttling.c @@ -12,7 +12,7 @@ int main(int argc, char **argv) { unsigned int ctr; SD_task_t task; - xbt_dynar_t changed_tasks; + xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL); SD_init(&argc, argv); xbt_assert(argc > 1, "Usage: %s platform_file\n\nExample: %s two_clusters.xml", argv[0], argv[0]); @@ -44,13 +44,15 @@ int main(int argc, char **argv) SD_task_schedulel(taskA, 1, hosts[0]); SD_task_schedulel(taskC, 1, hosts[1]); SD_task_schedulel(taskE, 1, hosts[0]); - while (!xbt_dynar_is_empty((changed_tasks = SD_simulate(-1.0)))) { + + SD_simulate_with_update(-1.0, changed_tasks); + while (!xbt_dynar_is_empty(changed_tasks)) { XBT_INFO("Simulation stopped after %.4f seconds", SD_get_clock()); xbt_dynar_foreach(changed_tasks, ctr, task) { XBT_INFO("Task '%s' start time: %f, finish time: %f", SD_task_get_name(task), SD_task_get_start_time(task), SD_task_get_finish_time(task)); } - xbt_dynar_free(&changed_tasks); + xbt_dynar_reset(changed_tasks); /* let throttle the communication for taskD if its parent is SD_DONE */ /* the bandwidth is 1.25e8, the data size is 1e7, and we want to throttle the bandwidth by a factor 2. @@ -59,8 +61,11 @@ int main(int argc, char **argv) */ if (SD_task_get_state(taskC) == SD_DONE && SD_task_get_state(taskD) < SD_RUNNING) SD_task_set_rate(taskD, 6.25); + SD_simulate_with_update(-1.0, changed_tasks); } + xbt_dynar_free(&changed_tasks); + XBT_DEBUG("Destroying tasks..."); SD_task_destroy(taskA); SD_task_destroy(taskB); diff --git a/examples/simdag/typed_tasks/sd_typed_tasks.c b/examples/simdag/typed_tasks/sd_typed_tasks.c index b78092e491..f74df77ece 100644 --- a/examples/simdag/typed_tasks/sd_typed_tasks.c +++ b/examples/simdag/typed_tasks/sd_typed_tasks.c @@ -62,7 +62,8 @@ int main(int argc, char **argv) SD_task_schedule(par_comp3, 4, host_list, computation_amount, communication_amount, -1); - xbt_dynar_t changed_tasks = SD_simulate(-1.0); + xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL); + SD_simulate_with_update(-1.0, changed_tasks); xbt_dynar_foreach(changed_tasks, ctr, task) { XBT_INFO("Task '%s' start time: %f, finish time: %f", SD_task_get_name(task), SD_task_get_start_time(task), SD_task_get_finish_time(task)); diff --git a/include/simgrid/simdag.h b/include/simgrid/simdag.h index 144677d571..25d8009348 100644 --- a/include/simgrid/simdag.h +++ b/include/simgrid/simdag.h @@ -143,7 +143,8 @@ XBT_PUBLIC(int) SD_task_dependency_exists(SD_task_t src, SD_task_t dst); XBT_PUBLIC(void) SD_init(int *argc, char **argv); XBT_PUBLIC(void) SD_config(const char *key, const char *value); XBT_PUBLIC(void) SD_create_environment(const char *platform_file); -XBT_PUBLIC(xbt_dynar_t) SD_simulate(double how_long); +XBT_PUBLIC(void) SD_simulate(double how_long); +XBT_PUBLIC(void) SD_simulate_with_update(double how_long, xbt_dynar_t changed_tasks_dynar); XBT_PUBLIC(double) SD_get_clock(); XBT_PUBLIC(void) SD_exit(); XBT_PUBLIC(xbt_dynar_t) SD_daxload(const char *filename); diff --git a/src/simdag/sd_global.cpp b/src/simdag/sd_global.cpp index b0f93dbfe1..a8e4ddd50a 100644 --- a/src/simdag/sd_global.cpp +++ b/src/simdag/sd_global.cpp @@ -224,13 +224,16 @@ void SD_create_environment(const char *platform_file) * \return a dynar of \ref SD_task_t whose state has changed. * \see SD_task_schedule(), SD_task_watch() */ +void SD_simulate(double how_long) +{ + simgrid::sd::simulate(how_long); +} -xbt_dynar_t SD_simulate(double how_long) { +void SD_simulate_with_update(double how_long, xbt_dynar_t changed_tasks_dynar) +{ std::set *changed_tasks = simgrid::sd::simulate(how_long); - xbt_dynar_t changed_tasks_dynar = xbt_dynar_new(sizeof(SD_task_t), nullptr); for (const auto& task : *changed_tasks) xbt_dynar_push(changed_tasks_dynar, &task); - return changed_tasks_dynar; } /** @brief Returns the current clock, in seconds */ diff --git a/teshsuite/simdag/availability/availability.c b/teshsuite/simdag/availability/availability.c index 9bcd4ce110..ed79a9327a 100644 --- a/teshsuite/simdag/availability/availability.c +++ b/teshsuite/simdag/availability/availability.c @@ -50,8 +50,7 @@ int main(int argc, char *argv[]) XBT_INFO("Scheduling DAX..."); scheduleDAX(dax); XBT_INFO("DAX scheduled"); - xbt_dynar_t changed_tasks = SD_simulate(-1); - xbt_dynar_free(&changed_tasks); + SD_simulate(-1); XBT_INFO("Simulation done."); diff --git a/teshsuite/simdag/basic6/basic6.c b/teshsuite/simdag/basic6/basic6.c index 204e55af21..bfb19985e5 100644 --- a/teshsuite/simdag/basic6/basic6.c +++ b/teshsuite/simdag/basic6/basic6.c @@ -24,7 +24,7 @@ int main(int argc, char **argv) { double comm_cost[] = { 0.0, 0.0, 0.0, 0.0 }; double comp_cost[] = { 1.0 }; - xbt_dynar_t ret; + xbt_dynar_t ret = xbt_dynar_new(sizeof(SD_task_t), NULL); SD_init(&argc, argv); SD_create_environment(argv[1]); @@ -37,7 +37,7 @@ int main(int argc, char **argv) SD_task_schedule(taskB, 1, hosts, comp_cost, comm_cost, -1.0); xbt_free(hosts); - ret = SD_simulate(-1.0); + SD_simulate_with_update(-1.0, ret); xbt_assert(xbt_dynar_length(ret) == 2, "I was expecting the completion of 2 tasks, but I got %lu instead", xbt_dynar_length(ret)); SD_task_destroy(taskA);