examples/s4u/actions-comm/s4u_actions-comm
examples/s4u/actions-storage/s4u_actions-storage
examples/s4u/actor-create/s4u_actor-create
+examples/s4u/actor-daemon/s4u_actor-daemon
examples/s4u/actor-kill/s4u_actor-kill
examples/s4u/actor-migration/s4u_actor-migration
examples/s4u/actor-suspend/s4u_actor-suspend
teshsuite/smpi/type-vector/type-vector
teshsuite/s4u/actor/actor
teshsuite/s4u/comm-pt2pt/comm-pt2pt
+teshsuite/s4u/comm-waitany/comm-waitany
teshsuite/s4u/concurrent_rw/concurrent_rw
teshsuite/s4u/host_on_off_wait/host_on_off_wait
teshsuite/s4u/listen_async/listen_async
# C examples
-foreach(x actions-comm actions-storage app-masterworker app-pingpong app-token-ring async-wait async-waitall
+foreach(x app-masterworker app-pingpong app-token-ring async-wait async-waitall
async-waitany cloud-capping cloud-masterworker cloud-migration cloud-simple cloud-two-tasks
dht-pastry energy-consumption energy-onoff energy-pstate energy-ptask energy-vm platform-failures
io-file io-remote io-storage task-priority
set(examples_src ${examples_src} ${CMAKE_CURRENT_SOURCE_DIR}/dht-kademlia/${file}.c ${CMAKE_CURRENT_SOURCE_DIR}/dht-kademlia/${file}.h)
endforeach()
-foreach (file actions-comm actions-storage app-bittorrent app-chainsend app-masterworker app-pingpong async-wait
+foreach (file app-bittorrent app-chainsend app-masterworker app-pingpong async-wait
async-waitall async-waitany dht-kademlia dht-pastry io-remote platform-properties process-yield
task-priority)
set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/${file}/${file}_d.xml)
endforeach()
-set(txt_files ${txt_files} ${CMAKE_CURRENT_SOURCE_DIR}/README.doc
- ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/actions-comm.txt
- ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/actions-comm_split_p0.txt
- ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/actions-comm_split_p1.txt
- ${CMAKE_CURRENT_SOURCE_DIR}/actions-storage/actions-storage.txt PARENT_SCOPE)
+set(txt_files ${txt_files} ${CMAKE_CURRENT_SOURCE_DIR}/README.doc PARENT_SCOPE)
set(bin_files ${bin_files} ${CMAKE_CURRENT_SOURCE_DIR}/app-bittorrent/generate.py
${CMAKE_CURRENT_SOURCE_DIR}/dht-kademlia/generate.py
${CMAKE_CURRENT_SOURCE_DIR}/dht-pastry/generate.py PARENT_SCOPE)
${CMAKE_CURRENT_SOURCE_DIR}/app-masterworker/app-masterworker-multicore.tesh
${CMAKE_CURRENT_SOURCE_DIR}/app-masterworker/app-masterworker-vivaldi.tesh
${CMAKE_CURRENT_SOURCE_DIR}/network-ns3/network-ns3.tesh PARENT_SCOPE)
-set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/actions-comm_split_d.xml
- ${CMAKE_CURRENT_SOURCE_DIR}/app-masterworker/app-masterworker-multicore_d.xml
+set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/app-masterworker/app-masterworker-multicore_d.xml
${CMAKE_CURRENT_SOURCE_DIR}/app-masterworker/app-masterworker-vivaldi_d.xml
${CMAKE_CURRENT_SOURCE_DIR}/async-wait/async-wait2_d.xml
${CMAKE_CURRENT_SOURCE_DIR}/async-wait/async-wait3_d.xml
${CMAKE_CURRENT_SOURCE_DIR}/process-startkilltime/start_d.xml
${CMAKE_CURRENT_SOURCE_DIR}/process-startkilltime/start_kill_d.xml PARENT_SCOPE)
-foreach(x actions-comm actions-storage app-bittorrent app-chainsend app-masterworker app-pingpong app-token-ring
+foreach(x app-bittorrent app-chainsend app-masterworker app-pingpong app-token-ring
async-wait async-waitall async-waitany cloud-capping cloud-masterworker cloud-migration cloud-simple
cloud-two-tasks dht-pastry dht-kademlia platform-failures io-file io-remote io-storage task-priority
process-create process-daemon process-join process-kill process-migration process-startkilltime process-suspend process-yield
#include "simgrid/msg.h"
-XBT_LOG_NEW_DEFAULT_CATEGORY(mag_app_pingpong,"Messages specific for this msg example");
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_app_pingpong, "Messages specific for this msg example");
static int pinger(int argc, char *argv[])
{
msg_host_t host = MSG_host_by_name("MyHost1");
XBT_INFO("Initial peak speed: %.0E flop/s; number of flops computed so far: %.0E (should be 0)",
- MSG_host_get_current_power_peak(host), MSG_host_get_computed_flops(host));
+ MSG_host_get_speed(host), sg_host_get_computed_flops(host));
double start = MSG_get_clock();
XBT_INFO("Sleep for 10 seconds");
XBT_INFO("Done sleeping %.2fs; peak speed: %.0E flop/s; number of flops computed so far: %.0E (nothing should have "
"changed)",
- MSG_get_clock() - start, MSG_host_get_current_power_peak(host), MSG_host_get_computed_flops(host));
+ MSG_get_clock() - start, MSG_host_get_speed(host), sg_host_get_computed_flops(host));
// Run a task
start = MSG_get_clock();
XBT_INFO("Done working on my task; this took %.2fs; current peak speed: %.0E flop/s; number of flops computed so "
"far: %.0E",
- MSG_get_clock() - start, MSG_host_get_current_power_peak(host), MSG_host_get_computed_flops(host));
+ MSG_get_clock() - start, MSG_host_get_speed(host), sg_host_get_computed_flops(host));
// ========= Change power peak =========
int pstate = 2;
- MSG_host_set_pstate(host, pstate);
+ sg_host_set_pstate(host, pstate);
XBT_INFO("========= Requesting pstate %d (speed should be of %.0E flop/s and is of %.0E flop/s)", pstate,
- MSG_host_get_power_peak_at(host, pstate), MSG_host_get_current_power_peak(host));
+ MSG_host_get_power_peak_at(host, pstate), MSG_host_get_speed(host));
// Run a second task
start = MSG_get_clock();
MSG_task_destroy(task1);
XBT_INFO("Done working on my task; this took %.2fs; current peak speed: %.0E flop/s; number of flops computed so "
"far: %.0E",
- MSG_get_clock() - start, MSG_host_get_current_power_peak(host), MSG_host_get_computed_flops(host));
+ MSG_get_clock() - start, MSG_host_get_speed(host), sg_host_get_computed_flops(host));
start = MSG_get_clock();
XBT_INFO("========= Requesting a reset of the computation counter");
XBT_INFO("Sleep for 4 seconds");
MSG_process_sleep(4);
XBT_INFO("Done sleeping %.2f s; peak speed: %.0E flop/s; number of flops computed so far: %.0E",
- MSG_get_clock() - start, MSG_host_get_current_power_peak(host), MSG_host_get_computed_flops(host));
+ MSG_get_clock() - start, MSG_host_get_speed(host), sg_host_get_computed_flops(host));
// =========== Turn the other host off ==========
XBT_INFO("Turning MyHost2 off, and sleeping another 10 seconds. MyHost2 computed %.0f flops so far.",
start = MSG_get_clock();
MSG_process_sleep(10);
XBT_INFO("Done sleeping %.2f s; peak speed: %.0E flop/s; number of flops computed so far: %.0E",
- MSG_get_clock() - start, MSG_host_get_current_power_peak(host), MSG_host_get_computed_flops(host));
+ MSG_get_clock() - start, MSG_host_get_speed(host), sg_host_get_computed_flops(host));
return 0;
}
foreach (example actions-comm actions-storage actor-create actor-daemon actor-kill actor-migration actor-suspend
- app-masterworker app-token-ring io mutex )
+ app-masterworker app-pingpong app-token-ring plugin-hostload io mutex )
add_executable (s4u_${example} ${example}/s4u_${example}.cpp)
target_link_libraries(s4u_${example} simgrid)
set_target_properties(s4u_${example} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${example})
${CMAKE_CURRENT_SOURCE_DIR}/README.doc PARENT_SCOPE)
foreach(example actions-comm actions-storage actor-create actor-daemon actor-kill actor-migration actor-suspend
- app-masterworker app-token-ring dht-chord io mutex )
+ app-masterworker app-pingpong app-token-ring dht-chord plugin-hostload io mutex )
ADD_TESH_FACTORIES(s4u-${example} "thread;ucontext;raw;boost" --setenv bindir=${CMAKE_CURRENT_BINARY_DIR}/${example} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_HOME_DIRECTORY}/examples/s4u/${example} s4u_${example}.tesh)
endforeach()
--- /dev/null
+/* Copyright (c) 2007-2017. 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 "simgrid/s4u.hpp"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_app_pingpong, "Messages specific for this s4u example");
+
+static void pinger(std::vector<std::string> args)
+{
+ xbt_assert(args.size() == 1, "The pinger function one argument from the XML deployment file");
+ XBT_INFO("Ping -> %s", args[0].c_str());
+ xbt_assert(simgrid::s4u::Host::by_name_or_null(args[0]) != nullptr, "Unknown host %s. Stopping Now! ",
+ args[0].c_str());
+
+ /* - Do the ping with a 1-Byte task (latency bound) ... */
+ double* payload = new double();
+ *payload = simgrid::s4u::Engine::getClock();
+
+ simgrid::s4u::Mailbox::byName(args[0])->put(payload, 1);
+ /* - ... then wait for the (large) pong */
+ double sender_time =
+ *(static_cast<double*>(simgrid::s4u::Mailbox::byName(simgrid::s4u::this_actor::getHost()->getName())->get()));
+
+ double communication_time = simgrid::s4u::Engine::getClock() - sender_time;
+ XBT_INFO("Task received : large communication (bandwidth bound)");
+ XBT_INFO("Pong time (bandwidth bound): %.3f", communication_time);
+}
+
+static void ponger(std::vector<std::string> args)
+{
+ xbt_assert(args.size() == 1, "The ponger function one argument from the XML deployment file");
+ XBT_INFO("Pong -> %s", args[0].c_str());
+ xbt_assert(simgrid::s4u::Host::by_name_or_null(args[0]) != nullptr, "Unknown host %s. Stopping Now! ",
+ args[0].c_str());
+
+ /* - Receive the (small) ping first ....*/
+ double* sender_time =
+ (static_cast<double*>(simgrid::s4u::Mailbox::byName(simgrid::s4u::this_actor::getHost()->getName())->get()));
+ double communication_time = simgrid::s4u::Engine::getClock() - *sender_time;
+ XBT_INFO("Task received : small communication (latency bound)");
+ XBT_INFO(" Ping time (latency bound) %f", communication_time);
+
+ /* - ... Then send a 1GB pong back (bandwidth bound) */
+ double* payload = new double();
+ *payload = simgrid::s4u::Engine::getClock();
+ XBT_INFO("task_bw->data = %.3f", *payload);
+
+ simgrid::s4u::Mailbox::byName(args[0])->put(payload, 1e9);
+}
+
+int main(int argc, char* argv[])
+{
+ simgrid::s4u::Engine* e = new simgrid::s4u::Engine(&argc, argv);
+
+ e->loadPlatform(argv[1]);
+ std::vector<std::string> args;
+ args.push_back("Jupiter");
+ simgrid::s4u::Actor::createActor("pinger", simgrid::s4u::Host::by_name("Tremblay"), pinger, args);
+
+ args.pop_back();
+ args.push_back("Tremblay");
+
+ simgrid::s4u::Actor::createActor("ponger", simgrid::s4u::Host::by_name("Jupiter"), ponger, args);
+
+ e->run();
+
+ XBT_INFO("Total simulation time: %.3f", e->getClock());
+ delete e;
+
+ return 0;
+}
--- /dev/null
+#! ./tesh
+
+p Testing with default compound
+
+$ $SG_TEST_EXENV ${bindir:=.}/s4u_app-pingpong$EXEEXT ${srcdir:=.}/small_platform.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [ 0.000000] (1:pinger@Tremblay) Ping -> Jupiter
+> [ 0.000000] (2:ponger@Jupiter) Pong -> Tremblay
+> [ 0.019014] (2:ponger@Jupiter) Task received : small communication (latency bound)
+> [ 0.019014] (2:ponger@Jupiter) Ping time (latency bound) 0.019014
+> [ 0.019014] (2:ponger@Jupiter) task_bw->data = 0.019
+> [150.178356] (1:pinger@Tremblay) Task received : large communication (bandwidth bound)
+> [150.178356] (1:pinger@Tremblay) Pong time (bandwidth bound): 150.159
+> [150.178356] (0:maestro@) Total simulation time: 150.178
+
+p Testing the deprecated CM02 network model
+
+$ $SG_TEST_EXENV ${bindir:=.}/s4u_app-pingpong$EXEEXT ${srcdir:=.}/small_platform.xml --cfg=cpu/model:Cas01 --cfg=network/model:CM02 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [ 0.000000] (0:maestro@) Configuration change: Set 'cpu/model' to 'Cas01'
+> [ 0.000000] (0:maestro@) Configuration change: Set 'network/model' to 'CM02'
+> [ 0.000000] (1:pinger@Tremblay) Ping -> Jupiter
+> [ 0.000000] (2:ponger@Jupiter) Pong -> Tremblay
+> [ 0.001462] (2:ponger@Jupiter) Task received : small communication (latency bound)
+> [ 0.001462] (2:ponger@Jupiter) Ping time (latency bound) 0.001462
+> [ 0.001462] (2:ponger@Jupiter) task_bw->data = 0.001
+> [145.639041] (1:pinger@Tremblay) Task received : large communication (bandwidth bound)
+> [145.639041] (1:pinger@Tremblay) Pong time (bandwidth bound): 145.638
+> [145.639041] (0:maestro@) Total simulation time: 145.639
+
+p Testing the surf network Reno fairness model using lagrangian approach
+
+$ $SG_TEST_EXENV ${bindir:=.}/s4u_app-pingpong$EXEEXT ${srcdir:=.}/small_platform.xml "--cfg=host/model:compound cpu/model:Cas01 network/model:Reno" --log=surf_lagrange.thres=critical "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [ 0.000000] (0:maestro@) Configuration change: Set 'host/model' to 'compound'
+> [ 0.000000] (0:maestro@) Configuration change: Set 'cpu/model' to 'Cas01'
+> [ 0.000000] (0:maestro@) Configuration change: Set 'network/model' to 'Reno'
+> [ 0.000000] (1:pinger@Tremblay) Ping -> Jupiter
+> [ 0.000000] (2:ponger@Jupiter) Pong -> Tremblay
+> [ 0.019014] (2:ponger@Jupiter) Task received : small communication (latency bound)
+> [ 0.019014] (2:ponger@Jupiter) Ping time (latency bound) 0.019014
+> [ 0.019014] (2:ponger@Jupiter) task_bw->data = 0.019
+> [150.178356] (1:pinger@Tremblay) Task received : large communication (bandwidth bound)
+> [150.178356] (1:pinger@Tremblay) Pong time (bandwidth bound): 150.159
+> [150.178356] (0:maestro@) Total simulation time: 150.178
+
+p Testing the surf network Vegas fairness model using lagrangian approach
+
+$ $SG_TEST_EXENV ${bindir:=.}/s4u_app-pingpong$EXEEXT ${srcdir:=.}/small_platform.xml "--cfg=host/model:compound cpu/model:Cas01 network/model:Vegas" "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [ 0.000000] (0:maestro@) Configuration change: Set 'host/model' to 'compound'
+> [ 0.000000] (0:maestro@) Configuration change: Set 'cpu/model' to 'Cas01'
+> [ 0.000000] (0:maestro@) Configuration change: Set 'network/model' to 'Vegas'
+> [ 0.000000] (1:pinger@Tremblay) Ping -> Jupiter
+> [ 0.000000] (2:ponger@Jupiter) Pong -> Tremblay
+> [ 0.019014] (2:ponger@Jupiter) Task received : small communication (latency bound)
+> [ 0.019014] (2:ponger@Jupiter) Ping time (latency bound) 0.019014
+> [ 0.019014] (2:ponger@Jupiter) task_bw->data = 0.019
+> [150.178356] (1:pinger@Tremblay) Task received : large communication (bandwidth bound)
+> [150.178356] (1:pinger@Tremblay) Pong time (bandwidth bound): 150.159
+> [150.178356] (0:maestro@) Total simulation time: 150.178
--- /dev/null
+/* Copyright (c) 2007-2010, 2013-2015. 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 "simgrid/s4u.hpp"
+#include "simgrid/plugins/load.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
+
+static void execute_load_test()
+{
+ s4u_Host* host = simgrid::s4u::Host::by_name("MyHost1");
+
+ XBT_INFO("Initial peak speed: %.0E flop/s; number of flops computed so far: %.0E (should be 0)", host->getSpeed(),
+ sg_host_get_computed_flops(host));
+
+ double start = simgrid::s4u::Engine::getClock();
+ XBT_INFO("Sleep for 10 seconds");
+ simgrid::s4u::this_actor::sleep_for(10);
+
+ XBT_INFO("Done sleeping %.2fs; peak speed: %.0E flop/s; number of flops computed so far: %.0E (nothing should have "
+ "changed)",
+ simgrid::s4u::Engine::getClock() - start, host->getSpeed(), sg_host_get_computed_flops(host));
+
+ // Run a task
+ start = simgrid::s4u::Engine::getClock();
+ XBT_INFO("Run a task of %.0E flops", 100E6);
+ simgrid::s4u::this_actor::execute(100E6);
+
+ XBT_INFO("Done working on my task; this took %.2fs; current peak speed: %.0E flop/s; number of flops computed so "
+ "far: %.0E",
+ simgrid::s4u::Engine::getClock() - start, host->getSpeed(), sg_host_get_computed_flops(host));
+
+ // ========= Change power peak =========
+ int pstate = 2;
+ host->setPstate(pstate);
+ XBT_INFO("========= Requesting pstate %d (speed should be of %.0E flop/s and is of %.0E flop/s)", pstate,
+ host->getPstateSpeed(pstate), host->getSpeed());
+
+ // Run a second task
+ start = simgrid::s4u::Engine::getClock();
+ XBT_INFO("Run a task of %.0E flops", 100E6);
+ simgrid::s4u::this_actor::execute(100E6);
+ XBT_INFO("Done working on my task; this took %.2fs; current peak speed: %.0E flop/s; number of flops computed so "
+ "far: %.0E",
+ simgrid::s4u::Engine::getClock() - start, host->getSpeed(), sg_host_get_computed_flops(host));
+
+ start = simgrid::s4u::Engine::getClock();
+ XBT_INFO("========= Requesting a reset of the computation counter");
+ sg_host_load_reset(host);
+ XBT_INFO("Sleep for 4 seconds");
+ simgrid::s4u::this_actor::sleep_for(4);
+ XBT_INFO("Done sleeping %.2f s; peak speed: %.0E flop/s; number of flops computed so far: %.0E",
+ simgrid::s4u::Engine::getClock() - start, host->getSpeed(), sg_host_get_computed_flops(host));
+
+ // =========== Turn the other host off ==========
+ s4u_Host* host2 = simgrid::s4u::Host::by_name("MyHost2");
+ XBT_INFO("Turning MyHost2 off, and sleeping another 10 seconds. MyHost2 computed %.0f flops so far.",
+ sg_host_get_computed_flops(host2));
+ host2->turnOff();
+ start = simgrid::s4u::Engine::getClock();
+ simgrid::s4u::this_actor::sleep_for(10);
+ XBT_INFO("Done sleeping %.2f s; peak speed: %.0E flop/s; number of flops computed so far: %.0E",
+ simgrid::s4u::Engine::getClock() - start, host->getSpeed(), sg_host_get_computed_flops(host));
+}
+
+int main(int argc, char* argv[])
+{
+ sg_host_load_plugin_init();
+ simgrid::s4u::Engine* e = new simgrid::s4u::Engine(&argc, argv);
+
+ xbt_assert(argc == 2, "Usage: %s platform_file\n\tExample: %s msg_platform.xml\n", argv[0], argv[0]);
+ e->loadPlatform(argv[1]);
+
+ simgrid::s4u::Actor::createActor("load_test", simgrid::s4u::Host::by_name("MyHost1"), execute_load_test);
+
+ e->run();
+
+ XBT_INFO("Total simulation time: %.2f", simgrid::s4u::Engine::getClock());
+
+ delete e;
+ return 0;
+}
--- /dev/null
+#! ./tesh
+
+p This tests the HostLoad plugin (this allows the user to get the current load of a host and the computed flops)
+
+$ ${bindir:=.}/s4u_plugin-hostload$EXEEXT ${srcdir:=.}/../platforms/energy_platform.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [ 0.000000] (1:load_test@MyHost1) Initial peak speed: 1E+08 flop/s; number of flops computed so far: 0E+00 (should be 0)
+> [ 0.000000] (1:load_test@MyHost1) Sleep for 10 seconds
+> [ 10.000000] (1:load_test@MyHost1) Done sleeping 10.00s; peak speed: 1E+08 flop/s; number of flops computed so far: 0E+00 (nothing should have changed)
+> [ 10.000000] (1:load_test@MyHost1) Run a task of 1E+08 flops
+> [ 11.000000] (1:load_test@MyHost1) Done working on my task; this took 1.00s; current peak speed: 1E+08 flop/s; number of flops computed so far: 1E+08
+> [ 11.000000] (1:load_test@MyHost1) ========= Requesting pstate 2 (speed should be of 2E+07 flop/s and is of 2E+07 flop/s)
+> [ 11.000000] (1:load_test@MyHost1) Run a task of 1E+08 flops
+> [ 16.000000] (1:load_test@MyHost1) Done working on my task; this took 5.00s; current peak speed: 2E+07 flop/s; number of flops computed so far: 2E+08
+> [ 16.000000] (1:load_test@MyHost1) ========= Requesting a reset of the computation counter
+> [ 16.000000] (1:load_test@MyHost1) Sleep for 4 seconds
+> [ 20.000000] (1:load_test@MyHost1) Done sleeping 4.00 s; peak speed: 2E+07 flop/s; number of flops computed so far: 0E+00
+> [ 20.000000] (1:load_test@MyHost1) Turning MyHost2 off, and sleeping another 10 seconds. MyHost2 computed 0 flops so far.
+> [ 30.000000] (1:load_test@MyHost1) Done sleeping 10.00 s; peak speed: 2E+07 flop/s; number of flops computed so far: 0E+00
+> [ 30.000000] (0:maestro@) Total simulation time: 30.00
typedef void *(*pvoid_f_pvoid_t) (void *);
typedef void (*void_f_void_t) (void);
-typedef int (*int_f_void_t) (void);
typedef int (*int_f_pvoid_t) (void*);
typedef int (*int_f_pvoid_pvoid_t) (void *, void *);
static void start_dirty_page_tracking(msg_vm_t vm)
{
vm->pimpl_vm_->dp_enabled = 1;
- if (not vm->pimpl_vm_->dp_objs)
+ if (vm->pimpl_vm_->dp_objs.empty())
return;
- char *key = nullptr;
- xbt_dict_cursor_t cursor = nullptr;
- dirty_page_t dp = nullptr;
- xbt_dict_foreach (vm->pimpl_vm_->dp_objs, cursor, key, dp) {
+ for (auto elm : vm->pimpl_vm_->dp_objs) {
+ dirty_page_t dp = elm.second;
double remaining = MSG_task_get_flops_amount(dp->task);
dp->prev_clock = MSG_get_clock();
dp->prev_remaining = remaining;
-
- // XBT_INFO("%s@%s remaining %f", key, sg_host_name(vm), remaining);
+ XBT_DEBUG("%s@%s remaining %f", elm.first.c_str(), vm->getCname(), remaining);
}
}
vm->pimpl_vm_->dp_enabled = 0;
}
-static double get_computed(char *key, msg_vm_t vm, dirty_page_t dp, double remaining, double clock)
+static double get_computed(const char* key, msg_vm_t vm, dirty_page_t dp, double remaining, double clock)
{
double computed = dp->prev_remaining - remaining;
double duration = clock - dp->prev_clock;
{
double total = 0;
- char *key = nullptr;
- xbt_dict_cursor_t cursor = nullptr;
- dirty_page_t dp = nullptr;
- xbt_dict_foreach (vm->pimpl_vm_->dp_objs, cursor, key, dp) {
+ for (auto elm : vm->pimpl_vm_->dp_objs) {
+ const char* key = elm.first.c_str();
+ dirty_page_t dp = elm.second;
double remaining = MSG_task_get_flops_amount(dp->task);
double clock = MSG_get_clock();
dp->prev_clock = MSG_get_clock();
dp->prev_remaining = remaining;
}
- if (not vm->pimpl_vm_->dp_objs)
- vm->pimpl_vm_->dp_objs = xbt_dict_new_homogeneous(nullptr);
- xbt_assert(xbt_dict_get_or_null(vm->pimpl_vm_->dp_objs, key) == nullptr);
- xbt_dict_set(vm->pimpl_vm_->dp_objs, key, dp, nullptr);
+ vm->pimpl_vm_->dp_objs.insert({key, dp});
XBT_DEBUG("add %s on %s (remaining %f, dp_enabled %d)", key, host->getCname(), remaining, vm->pimpl_vm_->dp_enabled);
xbt_free(key);
return;
char *key = bprintf("%s-%p", task->name, task);
- dirty_page_t dp = (dirty_page_t)(vm->pimpl_vm_->dp_objs ? xbt_dict_get_or_null(vm->pimpl_vm_->dp_objs, key) : NULL);
- xbt_assert(dp->task == task);
+ dirty_page_t dp = nullptr;
+ if (vm->pimpl_vm_->dp_objs.find(key) != vm->pimpl_vm_->dp_objs.end())
+ dp = vm->pimpl_vm_->dp_objs.at(key);
+ xbt_assert(dp && dp->task == task);
/* If we are in the middle of dirty page tracking, we record how much computation has been done until now, and keep
* the information for the lookup_() function that will called soon. */
vm->pimpl_vm_->dp_updated_by_deleted_tasks += updated;
}
- if (vm->pimpl_vm_->dp_objs)
- xbt_dict_remove(vm->pimpl_vm_->dp_objs, key);
+
+ vm->pimpl_vm_->dp_objs.erase(key);
xbt_free(dp);
XBT_DEBUG("del %s on %s", key, host->getCname());
allVms_.erase(iter);
/* dirty page tracking */
- unsigned int size = xbt_dict_size(dp_objs);
+ unsigned int size = dp_objs.size();
static bool already_warned = false;
if (size > 0 && not already_warned) {
- xbt_dict_cursor_t cursor = nullptr;
- xbt_dict_cursor_first(dp_objs, &cursor);
+ auto front = dp_objs.begin();
XBT_WARN("Dirty page tracking: %u pending task(s) on a destroyed VM (first one is %s).\n"
"If you don't understand why your task was not properly removed, please report that bug.\n"
"This is a known bug if you turned the host off during the VM execution.\n"
"Please remind us of that problem at some point: our code base is not ready to fix this harmless issue in "
"2016, sorry.",
- size, (xbt_log_no_loc ? "(name hidden)" : xbt_dict_cursor_get_key(cursor)));
- xbt_dict_cursor_free(&cursor);
+ size, (xbt_log_no_loc ? "(name hidden)" : front->first.c_str()));
already_warned = true;
}
- xbt_dict_free(&dp_objs);
/* Free the cpu_action of the VM. */
XBT_ATTRIB_UNUSED int ret = action_->unref();
#include "src/surf/HostImpl.hpp"
#include <algorithm>
#include <deque>
+#include <unordered_map>
#ifndef VM_INTERFACE_HPP_
#define VM_INTERFACE_HPP_
#define GUESTOS_NOISE 100 // This value corresponds to the cost of the global action associated to the VM
// It corresponds to the cost of a VM running no tasks.
+typedef struct dirty_page* dirty_page_t;
+
namespace simgrid {
namespace vm {
surf::Action* action_ = nullptr;
/* Dirty pages stuff */
+ std::unordered_map<std::string, dirty_page_t> dp_objs;
int dp_enabled = 0;
- xbt_dict_t dp_objs = nullptr;
double dp_updated_by_deleted_tasks = 0;
protected:
const char* Storage::getProperty(const char* key)
{
- return static_cast<const char*>(xbt_dict_get_or_null(this->getProperties(), key));
+ return this->pimpl_->getProperty(key);
}
void Storage::setProperty(const char* key, char* value)
{
- xbt_dict_set(this->getProperties(), key, value, nullptr);
+ simgrid::simix::kernelImmediate([this, key, value] { this->pimpl_->setProperty(key, value); });
}
std::map<std::string, sg_size_t>* Storage::getContent()
XBT_PUBLIC(double) surf_parse_get_bandwidth(const char *string, const char *entity_kind, const char *name);
XBT_PUBLIC(double) surf_parse_get_speed(const char *string, const char *entity_kind, const char *name);
-XBT_PUBLIC_DATA(int_f_void_t) surf_parse; /* Entry-point to the parser. Set this to your function. */
+XBT_PUBLIC(int) surf_parse(); /* Entry-point to the parser */
SG_END_DECL()
}
}
-/* Call the lexer to parse the currently opened file. This pointer to function enables bypassing of the parser */
-static int _surf_parse() {
+/* Call the lexer to parse the currently opened file */
+int surf_parse()
+{
return surf_parse_lex();
}
-int_f_void_t surf_parse = &_surf_parse;
-
SG_END_DECL()
# C examples
-foreach(x cloud-sharing get_sender host_on_off host_on_off_recv host_on_off_processes trace_integration)
+foreach(x actions-comm actions-storage cloud-sharing get_sender host_on_off host_on_off_recv host_on_off_processes
+ trace_integration)
add_executable (${x} ${x}/${x}.c)
target_link_libraries(${x} simgrid)
set_target_properties(${x} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x})
set(teshsuite_src ${teshsuite_src} PARENT_SCOPE)
set(tesh_files ${tesh_files} PARENT_SCOPE)
-set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/trace_integration/test-hbp1.0-hbp1.0-hbp1.0.xml
+set(txt_files ${txt_files} ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/actions-comm.txt
+ ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/actions-comm_split_p0.txt
+ ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/actions-comm_split_p1.txt
+ ${CMAKE_CURRENT_SOURCE_DIR}/actions-storage/actions-storage.txt PARENT_SCOPE)
+set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/actions-comm_d.xml
+ ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/actions-comm_split_d.xml
+ ${CMAKE_CURRENT_SOURCE_DIR}/actions-storage/actions-storage_d.xml
+ ${CMAKE_CURRENT_SOURCE_DIR}/trace_integration/test-hbp1.0-hbp1.0-hbp1.0.xml
${CMAKE_CURRENT_SOURCE_DIR}/trace_integration/test-hbp1.0-hbp3.0-hbp4.0.xml
${CMAKE_CURRENT_SOURCE_DIR}/trace_integration/test-hbp1.5-hbp1.5.xml
${CMAKE_CURRENT_SOURCE_DIR}/trace_integration/test-hbp1-c0s0-c0s1.xml
ADD_TESH_FACTORIES(tesh-msg-${x} "thread;boost;ucontext;raw" --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/msg/${x} --cd ${CMAKE_BINARY_DIR}/teshsuite/msg/${x} ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/${x}/${x}.tesh)
endforeach()
-
+foreach(x actions-comm actions-storage)
+ ADD_TESH_FACTORIES(tesh-msg-${x} "thread;ucontext;raw;boost" --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/msg/${x} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/${x} ${x}.tesh)
+endforeach()
# One context factory is enough for these ones
foreach(x cloud-sharing)
XBT_LOG_NEW_DEFAULT_CATEGORY(actions, "Messages specific for this msg example");
int communicator_size = 0;
-static void action_Isend(const char *const *action);
+static void action_Isend(const char* const* action);
typedef struct {
int last_Irecv_sender_id;
int bcast_counter;
- xbt_dynar_t isends; /* of msg_comm_t */
+ xbt_dynar_t isends; /* of msg_comm_t */
/* Used to implement irecv+wait */
- xbt_dynar_t irecvs; /* of msg_comm_t */
- xbt_dynar_t tasks; /* of msg_task_t */
+ xbt_dynar_t irecvs; /* of msg_comm_t */
+ xbt_dynar_t tasks; /* of msg_task_t */
} s_process_globals_t;
-typedef s_process_globals_t *process_globals_t;
+typedef s_process_globals_t* process_globals_t;
/* Helper function */
-static double parse_double(const char *string)
+static double parse_double(const char* string)
{
double value;
- char *endptr;
+ char* endptr;
value = strtod(string, &endptr);
if (*endptr != '\0')
return value;
}
-#define ACT_DEBUG(...) \
- if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose)) { \
- char *NAME = xbt_str_join_array(action, " "); \
- XBT_DEBUG(__VA_ARGS__); \
- xbt_free(NAME); \
- } else ((void)0)
+#define ACT_DEBUG(...) \
+ if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose)) { \
+ char* NAME = xbt_str_join_array(action, " "); \
+ XBT_DEBUG(__VA_ARGS__); \
+ xbt_free(NAME); \
+ } else \
+ ((void)0)
-static void log_action(const char *const *action, double date)
+static void log_action(const char* const* action, double date)
{
if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose)) {
- char *name = xbt_str_join_array(action, " ");
+ char* name = xbt_str_join_array(action, " ");
XBT_VERB("%s %f", name, date);
xbt_free(name);
}
static void asynchronous_cleanup(void)
{
- process_globals_t globals = (process_globals_t) MSG_process_get_data(MSG_process_self());
+ process_globals_t globals = (process_globals_t)MSG_process_get_data(MSG_process_self());
/* Destroy any isend which correspond to completed communications */
msg_comm_t comm;
- while (1/*true*/) {
+ while (1 /*true*/) {
int pos_found = MSG_comm_testany(globals->isends);
if (pos_found == -1) /* none remaining */
break;
}
/* My actions */
-static void action_send(const char *const *action)
+static void action_send(const char* const* action)
{
char to[250];
- const char *size_str = action[3];
- double size = parse_double(size_str);
- double clock = MSG_get_clock();
+ const char* size_str = action[3];
+ double size = parse_double(size_str);
+ double clock = MSG_get_clock();
- snprintf(to,249, "%s_%s", MSG_process_get_name(MSG_process_self()), action[2]);
+ snprintf(to, 249, "%s_%s", MSG_process_get_name(MSG_process_self()), action[2]);
ACT_DEBUG("Entering Send: %s (size: %g)", NAME, size);
if (size < 65536) {
asynchronous_cleanup();
}
-static void action_Isend(const char *const *action)
+static void action_Isend(const char* const* action)
{
char to[250];
- const char *size = action[3];
- double clock = MSG_get_clock();
- process_globals_t globals = (process_globals_t) MSG_process_get_data(MSG_process_self());
+ const char* size = action[3];
+ double clock = MSG_get_clock();
+ process_globals_t globals = (process_globals_t)MSG_process_get_data(MSG_process_self());
- snprintf(to,249, "%s_%s", MSG_process_get_name(MSG_process_self()), action[2]);
+ snprintf(to, 249, "%s_%s", MSG_process_get_name(MSG_process_self()), action[2]);
msg_comm_t comm = MSG_task_isend(MSG_task_create(to, 0, parse_double(size), NULL), to);
xbt_dynar_push(globals->isends, &comm);
asynchronous_cleanup();
}
-static void action_recv(const char *const *action)
+static void action_recv(const char* const* action)
{
char mailbox_name[250];
msg_task_t task = NULL;
- double clock = MSG_get_clock();
+ double clock = MSG_get_clock();
- snprintf(mailbox_name,249, "%s_%s", action[2], MSG_process_get_name(MSG_process_self()));
+ snprintf(mailbox_name, 249, "%s_%s", action[2], MSG_process_get_name(MSG_process_self()));
ACT_DEBUG("Receiving: %s", NAME);
msg_error_t res = MSG_task_receive(&task, mailbox_name);
asynchronous_cleanup();
}
-static void action_Irecv(const char *const *action)
+static void action_Irecv(const char* const* action)
{
char mailbox[250];
- double clock = MSG_get_clock();
- process_globals_t globals = (process_globals_t) MSG_process_get_data(MSG_process_self());
+ double clock = MSG_get_clock();
+ process_globals_t globals = (process_globals_t)MSG_process_get_data(MSG_process_self());
XBT_DEBUG("Irecv on %s", MSG_process_get_name(MSG_process_self()));
- snprintf(mailbox,249, "%s_%s", action[2], MSG_process_get_name(MSG_process_self()));
+ snprintf(mailbox, 249, "%s_%s", action[2], MSG_process_get_name(MSG_process_self()));
msg_task_t t = NULL;
xbt_dynar_push(globals->tasks, &t);
msg_comm_t c = MSG_task_irecv(xbt_dynar_get_ptr(globals->tasks, xbt_dynar_length(globals->tasks) - 1), mailbox);
asynchronous_cleanup();
}
-static void action_wait(const char *const *action)
+static void action_wait(const char* const* action)
{
msg_task_t task = NULL;
msg_comm_t comm;
- double clock = MSG_get_clock();
- process_globals_t globals = (process_globals_t) MSG_process_get_data(MSG_process_self());
+ double clock = MSG_get_clock();
+ process_globals_t globals = (process_globals_t)MSG_process_get_data(MSG_process_self());
xbt_assert(xbt_dynar_length(globals->irecvs), "action wait not preceded by any irecv: %s",
xbt_str_join_array(action, " "));
}
/* FIXME: that's a poor man's implementation: we should take the message exchanges into account */
-static void action_barrier(const char *const *action)
+static void action_barrier(const char* const* action)
{
static msg_bar_t barrier = NULL;
static int processes_arrived_sofar = 0;
ACT_DEBUG("Exiting barrier: %s", NAME);
processes_arrived_sofar--;
- if (processes_arrived_sofar<=0) {
+ if (processes_arrived_sofar <= 0) {
MSG_barrier_destroy(barrier);
barrier = NULL;
}
}
-static void action_bcast(const char *const *action)
+static void action_bcast(const char* const* action)
{
char mailbox[80];
double comm_size = parse_double(action[2]);
- msg_task_t task = NULL;
- double clock = MSG_get_clock();
+ msg_task_t task = NULL;
+ double clock = MSG_get_clock();
- process_globals_t counters = (process_globals_t) MSG_process_get_data(MSG_process_self());
+ process_globals_t counters = (process_globals_t)MSG_process_get_data(MSG_process_self());
xbt_assert(communicator_size, "Size of Communicator is not defined, can't use collective operations");
- const char * process_name = MSG_process_get_name(MSG_process_self());
+ const char* process_name = MSG_process_get_name(MSG_process_self());
- char *bcast_identifier = bprintf("bcast_%d", counters->bcast_counter);
+ char* bcast_identifier = bprintf("bcast_%d", counters->bcast_counter);
counters->bcast_counter++;
if (!strcmp(process_name, "p0")) {
XBT_DEBUG("%s: %s is the Root", bcast_identifier, process_name);
- msg_comm_t *comms = xbt_new0(msg_comm_t, communicator_size - 1);
+ msg_comm_t* comms = xbt_new0(msg_comm_t, communicator_size - 1);
for (int i = 1; i < communicator_size; i++) {
- snprintf(mailbox,79, "%s_p0_p%d", bcast_identifier, i);
+ snprintf(mailbox, 79, "%s_p0_p%d", bcast_identifier, i);
comms[i - 1] = MSG_task_isend(MSG_task_create(mailbox, 0, comm_size, NULL), mailbox);
}
MSG_comm_waitall(comms, communicator_size - 1, -1);
XBT_DEBUG("%s: all messages sent by %s have been received", bcast_identifier, process_name);
} else {
- snprintf(mailbox,79, "%s_p0_%s", bcast_identifier, process_name);
+ snprintf(mailbox, 79, "%s_p0_%s", bcast_identifier, process_name);
MSG_task_receive(&task, mailbox);
MSG_task_destroy(task);
XBT_DEBUG("%s: %s has received", bcast_identifier, process_name);
xbt_free(bcast_identifier);
}
-static void action_comm_size(const char *const *action)
+static void action_comm_size(const char* const* action)
{
- const char *size = action[2];
- double clock = MSG_get_clock();
+ const char* size = action[2];
+ double clock = MSG_get_clock();
communicator_size = parse_double(size);
log_action(action, MSG_get_clock() - clock);
}
-static void action_compute(const char *const *action)
+static void action_compute(const char* const* action)
{
- const char *amount = action[2];
- msg_task_t task = MSG_task_create("task", parse_double(amount), 0, NULL);
- double clock = MSG_get_clock();
+ const char* amount = action[2];
+ msg_task_t task = MSG_task_create("task", parse_double(amount), 0, NULL);
+ double clock = MSG_get_clock();
ACT_DEBUG("Entering %s", NAME);
MSG_task_execute(task);
log_action(action, MSG_get_clock() - clock);
}
-static void action_init(const char *const *action)
+static void action_init(const char* const* action)
{
XBT_DEBUG("Initialize the counters");
- process_globals_t globals = (process_globals_t) calloc(1, sizeof(s_process_globals_t));
- globals->isends = xbt_dynar_new(sizeof(msg_comm_t), NULL);
- globals->irecvs = xbt_dynar_new(sizeof(msg_comm_t), NULL);
- globals->tasks = xbt_dynar_new(sizeof(msg_task_t), NULL);
+ process_globals_t globals = (process_globals_t)calloc(1, sizeof(s_process_globals_t));
+ globals->isends = xbt_dynar_new(sizeof(msg_comm_t), NULL);
+ globals->irecvs = xbt_dynar_new(sizeof(msg_comm_t), NULL);
+ globals->tasks = xbt_dynar_new(sizeof(msg_task_t), NULL);
MSG_process_set_data(MSG_process_self(), globals);
}
-static void action_finalize(const char *const *action)
+static void action_finalize(const char* const* action)
{
- process_globals_t globals = (process_globals_t) MSG_process_get_data(MSG_process_self());
+ process_globals_t globals = (process_globals_t)MSG_process_get_data(MSG_process_self());
if (globals) {
asynchronous_cleanup();
xbt_dynar_free_container(&(globals->isends));
}
}
-int main(int argc, char *argv[])
+int main(int argc, char* argv[])
{
/* Check the given arguments */
MSG_init(&argc, argv);
/* Explicit initialization of the action module is required now*/
MSG_action_init();
- xbt_assert(argc > 2,
- "Usage: %s platform_file deployment_file [action_files]\n"
- "\t# if all actions are in the same file\n"
- "\tExample: %s msg_platform.xml msg_deployment.xml actions\n"
- "\t# if actions are in separate files, specified in deployment\n"
- "\tExample: %s msg_platform.xml msg_deployment.xml ",
- argv[0],argv[0],argv[0]);
+ xbt_assert(argc > 2, "Usage: %s platform_file deployment_file [action_files]\n"
+ "\t# if all actions are in the same file\n"
+ "\tExample: %s msg_platform.xml msg_deployment.xml actions\n"
+ "\t# if actions are in separate files, specified in deployment\n"
+ "\tExample: %s msg_platform.xml msg_deployment.xml ",
+ argv[0], argv[0], argv[0]);
MSG_create_environment(argv[1]);
MSG_launch_application(argv[2]);
static xbt_dict_t opened_files = NULL;
-#define ACT_DEBUG(...) \
- if (XBT_LOG_ISENABLED(storage_actions, xbt_log_priority_verbose)) { \
- char *NAME = xbt_str_join_array(action, " "); \
- XBT_DEBUG(__VA_ARGS__); \
- xbt_free(NAME); \
- } else ((void)0)
-
-static void log_action(const char *const *action, double date)
+#define ACT_DEBUG(...) \
+ if (XBT_LOG_ISENABLED(storage_actions, xbt_log_priority_verbose)) { \
+ char* NAME = xbt_str_join_array(action, " "); \
+ XBT_DEBUG(__VA_ARGS__); \
+ xbt_free(NAME); \
+ } else \
+ ((void)0)
+
+static void log_action(const char* const* action, double date)
{
if (XBT_LOG_ISENABLED(storage_actions, xbt_log_priority_verbose)) {
- char *name = xbt_str_join_array(action, " ");
+ char* name = xbt_str_join_array(action, " ");
XBT_VERB("%s %f", name, date);
xbt_free(name);
}
}
-static msg_file_t get_file_descriptor(const char *file_name){
+static msg_file_t get_file_descriptor(const char* file_name)
+{
char full_name[1024];
- snprintf(full_name,1023, "%s:%s", MSG_process_get_name(MSG_process_self()), file_name);
+ snprintf(full_name, 1023, "%s:%s", MSG_process_get_name(MSG_process_self()), file_name);
msg_file_t file = (msg_file_t)xbt_dict_get_or_null(opened_files, full_name);
return file;
}
-static sg_size_t parse_size(const char *string){
+static sg_size_t parse_size(const char* string)
+{
sg_size_t size;
- char *endptr;
+ char* endptr;
size = strtoul(string, &endptr, 10);
if (*endptr != '\0')
return size;
}
-static void action_open(const char *const *action) {
- const char *file_name = action[2];
+static void action_open(const char* const* action)
+{
+ const char* file_name = action[2];
char full_name[1024];
msg_file_t file = NULL;
- double clock = MSG_get_clock();
+ double clock = MSG_get_clock();
- snprintf(full_name,1023, "%s:%s", MSG_process_get_name(MSG_process_self()), file_name);
+ snprintf(full_name, 1023, "%s:%s", MSG_process_get_name(MSG_process_self()), file_name);
ACT_DEBUG("Entering Open: %s (filename: %s)", NAME, file_name);
file = MSG_file_open(file_name, NULL);
log_action(action, MSG_get_clock() - clock);
}
-static void action_read(const char *const *action) {
- const char *file_name = action[2];
- const char *size_str = action[3];
- sg_size_t size = parse_size(size_str);
+static void action_read(const char* const* action)
+{
+ const char* file_name = action[2];
+ const char* size_str = action[3];
+ sg_size_t size = parse_size(size_str);
double clock = MSG_get_clock();
log_action(action, MSG_get_clock() - clock);
}
-static void action_close(const char *const *action) {
- const char *file_name = action[2];
+static void action_close(const char* const* action)
+{
+ const char* file_name = action[2];
msg_file_t file;
double clock = MSG_get_clock();
log_action(action, MSG_get_clock() - clock);
}
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[])
+{
MSG_init(&argc, argv);
/* Explicit initialization of the action module is required */
MSG_action_init();
- xbt_assert(argc > 3,"Usage: %s platform_file deployment_file [action_files]\n"
+ xbt_assert(argc > 3,
+ "Usage: %s platform_file deployment_file [action_files]\n"
"\texample: %s platform.xml deployment.xml actions # if all actions are in the same file\n"
"\texample: %s platform.xml deployment.xml # if actions are in separate files, specified in deployment\n",
argv[0], argv[0], argv[0]);
/* Explicit finalization of the action module is required now*/
MSG_action_exit();
- return res!=MSG_OK;
+ return res != MSG_OK;
}