*
* 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};
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();
}
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();
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);
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();
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);
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);
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();
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);
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();
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!!!!");
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();
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);
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);
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
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());
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[])
/* 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());
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 {
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);
}
/* 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());
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.");
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();
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)");
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();
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();
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();
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();
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.
*
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();