Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
introduce sg_actor_create and use it in C examples
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Wed, 4 Mar 2020 11:44:31 +0000 (12:44 +0100)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Wed, 4 Mar 2020 11:44:31 +0000 (12:44 +0100)
may want to add a sg_actor_create_no_args?

19 files changed:
examples/c/actor-create/actor-create.c
examples/c/actor-daemon/actor-daemon.c
examples/c/actor-exiting/actor-exiting.c
examples/c/actor-join/actor-join.c
examples/c/actor-kill/actor-kill.c
examples/c/actor-migrate/actor-migrate.c
examples/c/actor-suspend/actor-suspend.c
examples/c/app-token-ring/app-token-ring.c
examples/c/cloud-capping/cloud-capping.c
examples/c/cloud-migration/cloud-migration.c
examples/c/cloud-simple/cloud-simple.c
examples/c/energy-exec-ptask/energy-exec-ptask.c
examples/c/energy-exec/energy-exec.c
examples/c/energy-vm/energy-vm.c
examples/c/exec-dvfs/exec-dvfs.c
examples/c/io-disk-raw/io-disk-raw.c
examples/c/plugin-hostload/plugin-hostload.c
include/simgrid/actor.h
src/s4u/s4u_Actor.cpp

index 30a5143..eda06b9 100644 (file)
@@ -84,17 +84,15 @@ int main(int argc, char** argv)
    *
    * The easiest way to do so is to implement the behavior of your actor in a single function,
    * as we do here for the receiver actors. This function can take any kind of parameters, as
-   * long as the last parameters of Actor::create() match what your function expects.
+   * long as the last parameters of sg_actor_create() or sg_actor_start() match what your function expects.
    */
   int recv_argc           = 2;
   const char* recv_argv[] = {"receiver", "mb42", NULL};
-  sg_actor_t recv         = sg_actor_init("receiver", sg_host_by_name("Fafard"));
-  sg_actor_start(recv, receiver, recv_argc, recv_argv);
+  sg_actor_create("receiver", sg_host_by_name("Fafard"), receiver, recv_argc, recv_argv);
 
   int sender1_argc           = 3;
   const char* sender1_argv[] = {"sender", "GaBuZoMeu", "mb42", NULL};
-  sg_actor_t sender1         = sg_actor_init("sender1", sg_host_by_name("Tremblay"));
-  sg_actor_start(sender1, sender, sender1_argc, sender1_argv);
+  sg_actor_create("sender1", sg_host_by_name("Tremblay"), sender, sender1_argc, sender1_argv);
 
   int sender2_argc           = 3;
   const char* sender2_argv[] = {"sender", "GloubiBoulga", "mb42", NULL};
index 9e1bd7e..852e23e 100644 (file)
@@ -38,10 +38,8 @@ int main(int argc, char* argv[])
   xbt_assert(argc > 1, "Usage: %s platform.xml\n", argv[0]);
   simgrid_load_platform(argv[1]);
 
-  sg_actor_t w = sg_actor_init("worker", sg_host_by_name("Boivin"));
-  sg_actor_start(w, worker, 0, NULL);
-  sg_actor_t d = sg_actor_init("daemon", sg_host_by_name("Tremblay"));
-  sg_actor_start(d, my_daemon, 0, NULL);
+  sg_actor_create("worker", sg_host_by_name("Boivin"), worker, 0, NULL);
+  sg_actor_create("daemon", sg_host_by_name("Tremblay"), my_daemon, 0, NULL);
 
   simgrid_run();
 }
index cde29b7..d568802 100644 (file)
@@ -46,8 +46,7 @@ int main(int argc, char* argv[])
 
   simgrid_load_platform(argv[1]); /* - Load the platform description */
 
-  sg_actor_t actor = sg_actor_init("A", sg_host_by_name("Tremblay"));
-  sg_actor_start(actor, actor_fun, 0, NULL);
+  sg_actor_create("A", sg_host_by_name("Tremblay"), actor_fun, 0, NULL);
 
   simgrid_run();
 
index 1f26270..b4b6bea 100644 (file)
@@ -25,26 +25,22 @@ static void master(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char* argv[])
   sg_actor_t actor;
 
   XBT_INFO("Start sleeper");
-  actor = sg_actor_init("sleeper from master", sg_host_self());
-  sg_actor_start(actor, sleeper, 0, NULL);
+  actor = sg_actor_create("sleeper from master", sg_host_self(), sleeper, 0, NULL);
   XBT_INFO("Join the sleeper (timeout 2)");
   sg_actor_join(actor, 2);
 
   XBT_INFO("Start sleeper");
-  actor = sg_actor_init("sleeper from master", sg_host_self());
-  sg_actor_start(actor, sleeper, 0, NULL);
+  actor = sg_actor_create("sleeper from master", sg_host_self(), sleeper, 0, NULL);
   XBT_INFO("Join the sleeper (timeout 4)");
   sg_actor_join(actor, 4);
 
   XBT_INFO("Start sleeper");
-  actor = sg_actor_init("sleeper from master", sg_host_self());
-  sg_actor_start(actor, sleeper, 0, NULL);
+  actor = sg_actor_create("sleeper from master", sg_host_self(), sleeper, 0, NULL);
   XBT_INFO("Join the sleeper (timeout 2)");
   sg_actor_join(actor, 2);
 
   XBT_INFO("Start sleeper");
-  actor = sg_actor_init("sleeper from master", sg_host_self());
-  sg_actor_start(actor, sleeper, 0, NULL);
+  actor = sg_actor_create("sleeper from master", sg_host_self(), sleeper, 0, NULL);
   sg_actor_ref(actor); // We have to take that ref because the actor will stop before we join it
   XBT_INFO("Waiting 4");
   sg_actor_sleep_for(4);
@@ -66,8 +62,7 @@ int main(int argc, char* argv[])
 
   simgrid_load_platform(argv[1]);
 
-  sg_actor_t actor = sg_actor_init("master", sg_host_by_name("Tremblay"));
-  sg_actor_start(actor, master, 0, NULL);
+  sg_actor_create("master", sg_host_by_name("Tremblay"), master, 0, NULL);
 
   simgrid_run();
 
index 8a8a9be..417efd7 100644 (file)
@@ -37,12 +37,10 @@ static void victimB_fun(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char* argv
 static void killer_fun(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char* argv[])
 {
   XBT_INFO("Hello!"); /* - First start a victim process */
-  sg_actor_t victimA = sg_actor_init("victim A", sg_host_by_name("Fafard"));
-  sg_actor_start(victimA, victimA_fun, 0, NULL);
+  sg_actor_t victimA = sg_actor_create("victim A", sg_host_by_name("Fafard"), victimA_fun, 0, NULL);
 
-  sg_actor_t victimB = sg_actor_init("victim B", sg_host_by_name("Jupiter"));
+  sg_actor_t victimB = sg_actor_create("victim B", sg_host_by_name("Jupiter"), victimB_fun, 0, NULL);
   sg_actor_ref(victimB); // We have to take that ref because victimB will end before we try to kill it
-  sg_actor_start(victimB, victimB_fun, 0, NULL);
 
   sg_actor_sleep_for(10.0);
 
@@ -60,8 +58,7 @@ static void killer_fun(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char* argv[
   sg_actor_sleep_for(1.0);
 
   XBT_INFO("Start a new actor, and kill it right away");
-  sg_actor_t victimC = sg_actor_init("victim C", sg_host_by_name("Jupiter"));
-  sg_actor_start(victimC, victimA_fun, 0, NULL);
+  sg_actor_t victimC = sg_actor_create("victim C", sg_host_by_name("Jupiter"), victimA_fun, 0, NULL);
   sg_actor_kill(victimC);
   sg_actor_sleep_for(1.0);
 
@@ -82,8 +79,7 @@ int main(int argc, char* argv[])
   simgrid_load_platform(argv[1]);
 
   /* - Create and deploy killer process, that will create the victim process  */
-  sg_actor_t killer = sg_actor_init("killer", sg_host_by_name("Tremblay"));
-  sg_actor_start(killer, killer_fun, 0, NULL);
+  sg_actor_create("killer", sg_host_by_name("Tremblay"), killer_fun, 0, NULL);
 
   simgrid_run();
 
index ce36bb3..a8e6fd5 100644 (file)
@@ -42,8 +42,7 @@ static void monitor(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char* argv[])
 
   int actor_argc           = 3;
   const char* actor_argv[] = {"worker", "Boivin", "Jacquelin", NULL};
-  sg_actor_t actor         = sg_actor_init("worker", sg_host_by_name("Fafard"));
-  sg_actor_start(actor, worker, actor_argc, actor_argv);
+  sg_actor_t actor         = sg_actor_create("worker", sg_host_by_name("Fafard"), worker, actor_argc, actor_argv);
 
   sg_actor_sleep_for(5);
 
@@ -63,8 +62,7 @@ int main(int argc, char* argv[])
 
   simgrid_load_platform(argv[1]); /* - Load the platform description */
   /* - Create and deploy the emigrant and policeman processes */
-  sg_actor_t actor = sg_actor_init("monitor", sg_host_by_name("Boivin"));
-  sg_actor_start(actor, monitor, 0, NULL);
+  sg_actor_create("monitor", sg_host_by_name("Boivin"), monitor, 0, NULL);
 
   simgrid_run();
 
index 604dfc0..58b7b9e 100644 (file)
@@ -38,8 +38,7 @@ static void lazy_guy(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char* argv[])
 static void dream_master(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char* argv[])
 {
   XBT_INFO("Let's create a lazy guy."); /* - Create a lazy_guy process */
-  sg_actor_t lazy = sg_actor_init("Lazy", sg_host_self());
-  sg_actor_start(lazy, lazy_guy, 0, NULL);
+  sg_actor_t lazy = sg_actor_create("Lazy", sg_host_self(), lazy_guy, 0, NULL);
   XBT_INFO("Let's wait a little bit...");
   sg_actor_sleep_for(10.0); /* - Wait for 10 seconds */
   XBT_INFO("Let's wake the lazy guy up! >:) BOOOOOUUUHHH!!!!");
@@ -79,8 +78,7 @@ int main(int argc, char* argv[])
   simgrid_load_platform(argv[1]);
   simgrid_register_function("dream_master", dream_master);
 
-  sg_actor_t actor = sg_actor_init("dream_master", sg_host_by_name("Boivin"));
-  sg_actor_start(actor, dream_master, 0, NULL);
+  sg_actor_create("dream_master", sg_host_by_name("Boivin"), dream_master, 0, NULL);
 
   simgrid_run();
 
index 275b4dc..d7cf8cd 100644 (file)
@@ -64,8 +64,7 @@ int main(int argc, char* argv[])
   for (size_t i = 0; i < host_count; i++) {
     /* - Give a unique rank to each host and create a @ref relay_runner process on each */
     char* name_host  = bprintf("%zu", i);
-    sg_actor_t actor = sg_actor_init(name_host, hosts[i]);
-    sg_actor_start(actor, relay_runner, 0, NULL);
+    sg_actor_create(name_host, hosts[i], relay_runner, 0, NULL);
     free(name_host);
   }
   free(hosts);
index 8e37ece..0e8a1cd 100644 (file)
@@ -50,8 +50,7 @@ static void launch_worker(sg_host_t host, const char* pr_name, double computatio
   char* argv3        = bprintf("%f", bound);
   const char* argv[] = {pr_name, argv1, argv2, argv3, NULL};
 
-  sg_actor_t actor = sg_actor_init(pr_name, host);
-  sg_actor_start(actor, worker_main, 4, argv);
+  sg_actor_create(pr_name, host, worker_main, 4, argv);
 
   free(argv1);
   free(argv2);
@@ -92,17 +91,12 @@ static void test_dynamic_change()
   sg_vm_start(vm0);
   sg_vm_start(vm1);
 
-  int w0_argc           = 3;
   const char* w0_argv[] = {"worker0", "Task0", "-1.0", NULL};
-  sg_actor_t w0         = sg_actor_init("worker0", (sg_host_t)vm0);
-  sg_actor_start(w0, worker_busy_loop, w0_argc, w0_argv);
+  sg_actor_create("worker0", (sg_host_t)vm0, worker_busy_loop, 3, w0_argv);
 
-  int w1_argc           = 3;
   char* speed           = bprintf("%f", sg_host_speed(pm0));
   const char* w1_argv[] = {"worker1", "Task1", speed, NULL};
-
-  sg_actor_t w1 = sg_actor_init("worker1", (sg_host_t)vm1);
-  sg_actor_start(w1, worker_busy_loop, w1_argc, w1_argv);
+  sg_actor_create("worker1", (sg_host_t)vm1, worker_busy_loop, 3, w1_argv);
 
   sg_actor_sleep_for(3000); // let the tasks end
 
@@ -298,8 +292,7 @@ int main(int argc, char* argv[])
 
   simgrid_load_platform(argv[1]);
 
-  sg_actor_t actor = sg_actor_init("master_", sg_host_by_name("Fafard"));
-  sg_actor_start(actor, master_main, 0, NULL);
+  sg_actor_create("master_", sg_host_by_name("Fafard"), master_main, 0, NULL);
 
   simgrid_run();
   XBT_INFO("Bye (simulation time %g)", simgrid_get_clock());
index b6ab2d0..28cf9f2 100644 (file)
@@ -45,8 +45,7 @@ static void vm_migrate_async(const_sg_vm_t vm, const_sg_host_t dst_pm)
   const char* dst_pm_name = sg_host_get_name(dst_pm);
 
   const char* argv[] = {"mig_work", vm_name, dst_pm_name, NULL};
-  sg_actor_t actor   = sg_actor_init("mig_wrk", sg_host_self());
-  sg_actor_start(actor, migration_worker_main, 3, argv);
+  sg_actor_create("mig_wrk", sg_host_self(), migration_worker_main, 3, argv);
 }
 
 static void master_main(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char* argv[])
@@ -115,8 +114,7 @@ int main(int argc, char* argv[])
   /* load the platform file */
   simgrid_load_platform(argv[1]);
 
-  sg_actor_t actor = sg_actor_init("master_", sg_host_by_name("Fafard"));
-  sg_actor_start(actor, master_main, 0, NULL);
+  sg_actor_create("master_", sg_host_by_name("Fafard"), master_main, 0, NULL);
 
   simgrid_run();
   XBT_INFO("Bye (simulation time %g)", simgrid_get_clock());
index 6d20bb0..3e0274b 100644 (file)
@@ -29,8 +29,7 @@ static void computation_fun(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char*
 
 static void launch_computation_worker(sg_host_t host)
 {
-  sg_actor_t actor = sg_actor_init("compute", host);
-  sg_actor_start(actor, computation_fun, 0, NULL);
+  sg_actor_create("compute", host, computation_fun, 0, NULL);
 }
 
 struct task_priv {
@@ -73,14 +72,10 @@ static void launch_communication_worker(sg_host_t tx_host, sg_host_t rx_host)
   char* mbox = bprintf("MBOX:%s-%s", sg_host_get_name(tx_host), sg_host_get_name(rx_host));
 
   const char* tx_argv[] = {"comm_tx", mbox, NULL};
-
-  sg_actor_t tx = sg_actor_init("comm_tx", tx_host);
-  sg_actor_start(tx, communication_tx_fun, 2, tx_argv);
+  sg_actor_create("comm_tx", tx_host, communication_tx_fun, 2, tx_argv);
 
   const char* rx_argv[] = {"comm_rx", mbox, NULL};
-
-  sg_actor_t rx = sg_actor_init("comm_rx", rx_host);
-  sg_actor_start(rx, communication_rx_fun, 2, rx_argv);
+  sg_actor_create("comm_rx", rx_host, communication_rx_fun, 2, rx_argv);
 
   xbt_free(mbox);
 }
@@ -237,8 +232,7 @@ int main(int argc, char* argv[])
   /* load the platform file */
   simgrid_load_platform(argv[1]);
 
-  sg_actor_t actor = sg_actor_init("master_", sg_host_by_name("Fafard"));
-  sg_actor_start(actor, master_main, 0, NULL);
+  sg_actor_create("master_", sg_host_by_name("Fafard"), master_main, 0, NULL);
 
   simgrid_run();
   XBT_INFO("Simulation time %g", simgrid_get_clock());
index f4e9888..1078fbd 100644 (file)
@@ -95,8 +95,7 @@ int main(int argc, char* argv[])
   sg_host_t first_host = all_hosts[0];
   free(all_hosts);
 
-  sg_actor_t actor = sg_actor_init("test", first_host);
-  sg_actor_start(actor, runner, 0, NULL);
+  sg_actor_create("test", first_host, runner, 0, NULL);
 
   simgrid_run();
   XBT_INFO("Simulation done.");
index e223218..b21943c 100644 (file)
@@ -74,8 +74,7 @@ int main(int argc, char* argv[])
   xbt_assert(argc == 2, "Usage: %s platform_file\n\tExample: %s msg_platform.xml\n", argv[0], argv[0]);
 
   simgrid_load_platform(argv[1]);
-  sg_actor_t actor = sg_actor_init("dvfs_test", sg_host_by_name("MyHost1"));
-  sg_actor_start(actor, dvfs, 0, NULL);
+  sg_actor_create("dvfs_test", sg_host_by_name("MyHost1"), dvfs, 0, NULL);
 
   simgrid_run();
 
index 9a20d33..04aaef1 100644 (file)
@@ -34,22 +34,16 @@ static void dvfs(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char* argv[])
   sg_vm_start(vm_host2);
 
   XBT_INFO("Create two tasks on Host1: both inside a VM");
-  sg_actor_t p11 = sg_actor_init("p11", (sg_host_t)vm_host1);
-  sg_actor_start(p11, worker_func, 0, NULL);
-  sg_actor_t p12 = sg_actor_init("p12", (sg_host_t)vm_host1);
-  sg_actor_start(p12, worker_func, 0, NULL);
+  sg_actor_create("p11", (sg_host_t)vm_host1, worker_func, 0, NULL);
+  sg_actor_create("p12", (sg_host_t)vm_host1, worker_func, 0, NULL);
 
   XBT_INFO("Create two tasks on Host2: one inside a VM, the other directly on the host");
-  sg_actor_t p21 = sg_actor_init("p21", (sg_host_t)vm_host2);
-  sg_actor_start(p21, worker_func, 0, NULL);
-  sg_actor_t p22 = sg_actor_init("p22", host2);
-  sg_actor_start(p22, worker_func, 0, NULL);
+  sg_actor_create("p21", (sg_host_t)vm_host2, worker_func, 0, NULL);
+  sg_actor_create("p22", host2, worker_func, 0, NULL);
 
   XBT_INFO("Create two tasks on Host3: both directly on the host");
-  sg_actor_t p31 = sg_actor_init("p31", host3);
-  sg_actor_start(p31, worker_func, 0, NULL);
-  sg_actor_t p32 = sg_actor_init("p32", host3);
-  sg_actor_start(p32, worker_func, 0, NULL);
+  sg_actor_create("p31", host3, worker_func, 0, NULL);
+  sg_actor_create("p32", host3, worker_func, 0, NULL);
 
   XBT_INFO("Wait 5 seconds. The tasks are still running (they run for 3 seconds, but 2 tasks are co-located, "
            "so they run for 6 seconds)");
@@ -70,8 +64,7 @@ int main(int argc, char* argv[])
 
   simgrid_load_platform(argv[1]);
 
-  sg_actor_t actor = sg_actor_init("dvfs", sg_host_by_name("MyHost1"));
-  sg_actor_start(actor, dvfs, 0, NULL);
+  sg_actor_create("dvfs", sg_host_by_name("MyHost1"), dvfs, 0, NULL);
 
   simgrid_run();
 
index 8956538..3db08da 100644 (file)
@@ -63,11 +63,8 @@ int main(int argc, char* argv[])
 
   simgrid_load_platform(argv[1]);
 
-  sg_actor_t a1 = sg_actor_init("dvfs_test", sg_host_by_name("MyHost1"));
-  sg_actor_start(a1, dvfs, 0, NULL);
-
-  sg_actor_t a2 = sg_actor_init("dvfs_test", sg_host_by_name("MyHost2"));
-  sg_actor_start(a2, dvfs, 0, NULL);
+  sg_actor_create("dvfs_test", sg_host_by_name("MyHost1"), dvfs, 0, NULL);
+  sg_actor_create("dvfs_test", sg_host_by_name("MyHost2"), dvfs, 0, NULL);
 
   simgrid_run();
 
index 0c3c48b..36f5071 100644 (file)
@@ -79,8 +79,7 @@ int main(int argc, char* argv[])
 
   free(hosts);
 
-  sg_actor_t actor = sg_actor_init("", sg_host_by_name("bob"));
-  sg_actor_start(actor, host, 0, NULL);
+  sg_actor_create("", sg_host_by_name("bob"), host, 0, NULL);
 
   simgrid_run();
 
index dff588d..2a6996d 100644 (file)
@@ -97,11 +97,9 @@ int main(int argc, char* argv[])
   xbt_assert(argc == 2, "Usage: %s platform_file\n\tExample: %s msg_platform.xml\n", argv[0], argv[0]);
 
   simgrid_load_platform(argv[1]);
-  sg_actor_t actor = sg_actor_init("load_test", sg_host_by_name("MyHost1"));
-  sg_actor_start(actor, execute_load_test, 0, NULL);
+  sg_actor_create("load_test", sg_host_by_name("MyHost1"), execute_load_test, 0, NULL);
 
-  sg_actor_t actor2 = sg_actor_init("change_speed", sg_host_by_name("MyHost1"));
-  sg_actor_start(actor2, change_speed, 0, NULL);
+  sg_actor_create("change_speed", sg_host_by_name("MyHost1"), change_speed, 0, NULL);
 
   simgrid_run();
 
index 220b449..7f7d699 100644 (file)
@@ -20,6 +20,8 @@ SG_BEGIN_DECL
     You should not access directly to the fields of the pointed structure, but always use the provided API to interact
     with actors.
  */
+XBT_PUBLIC sg_actor_t sg_actor_create(const char* name, sg_host_t host, xbt_main_func_t code, int argc,
+                                      const char* const* argv);
 XBT_PUBLIC sg_actor_t sg_actor_init(const char* name, sg_host_t host);
 /** Start the previously initialized actor.
  *
index aaa8686..c39f366 100644 (file)
@@ -476,6 +476,12 @@ void sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, const char
   actor->start(std::move(function));
 }
 
+sg_actor_t sg_actor_create(const char* name, sg_host_t host, xbt_main_func_t code, int argc, const char* const* argv)
+{
+  simgrid::kernel::actor::ActorCode function = simgrid::xbt::wrap_main(code, argc, argv);
+  return simgrid::s4u::Actor::init(name, host)->start(std::move(function)).get();
+}
+
 void sg_actor_exit()
 {
   simgrid::s4u::this_actor::exit();