From a3e3c75a39a2b73a07bcf209d6516791b80968bb Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Thu, 25 Mar 2021 09:56:29 +0100 Subject: [PATCH] Better fix for constness of argv in sg_actor_start/create. Define two variants of the functions and allow to write the examples without cast romving const qualifier. --- examples/c/actor-create/actor-create.c | 6 +++--- examples/c/actor-migrate/actor-migrate.c | 2 +- examples/c/cloud-capping/cloud-capping.c | 6 +++--- examples/c/cloud-migration/cloud-migration.c | 2 +- examples/c/cloud-simple/cloud-simple.c | 4 ++-- examples/c/exec-waitany/exec-waitany.c | 4 ++-- examples/c/synchro-semaphore/synchro-semaphore.c | 4 ++-- include/simgrid/actor.h | 15 ++++++++++++--- src/s4u/s4u_Actor.cpp | 4 ++-- 9 files changed, 28 insertions(+), 19 deletions(-) diff --git a/examples/c/actor-create/actor-create.c b/examples/c/actor-create/actor-create.c index 5cdf5136c4..8765e79f55 100644 --- a/examples/c/actor-create/actor-create.c +++ b/examples/c/actor-create/actor-create.c @@ -88,16 +88,16 @@ int main(int argc, char** argv) */ int recv_argc = 2; const char* recv_argv[] = {"receiver", "mb42", NULL}; - sg_actor_create("receiver", sg_host_by_name("Fafard"), receiver, recv_argc, (char**)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_create("sender1", sg_host_by_name("Tremblay"), sender, sender1_argc, (char**)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}; sg_actor_t sender2 = sg_actor_init("sender2", sg_host_by_name("Jupiter")); - sg_actor_start(sender2, sender, sender2_argc, (char**)sender2_argv); + sg_actor_start_(sender2, sender, sender2_argc, sender2_argv); /* But starting actors directly is considered as a bad experimental habit, since it ties the code * you want to test with the experimental scenario. Starting your actors from an external deployment diff --git a/examples/c/actor-migrate/actor-migrate.c b/examples/c/actor-migrate/actor-migrate.c index a5358cf0d3..9666126512 100644 --- a/examples/c/actor-migrate/actor-migrate.c +++ b/examples/c/actor-migrate/actor-migrate.c @@ -42,7 +42,7 @@ static void monitor(int argc, char* argv[]) int actor_argc = 3; const char* actor_argv[] = {"worker", "Boivin", "Jacquelin", NULL}; - sg_actor_t actor = sg_actor_create("worker", sg_host_by_name("Fafard"), worker, actor_argc, (char**)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); diff --git a/examples/c/cloud-capping/cloud-capping.c b/examples/c/cloud-capping/cloud-capping.c index 81dc1fdc96..fd5fd665c6 100644 --- a/examples/c/cloud-capping/cloud-capping.c +++ b/examples/c/cloud-capping/cloud-capping.c @@ -50,7 +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_create(pr_name, host, worker_main, 4, (char**)argv); + sg_actor_create_(pr_name, host, worker_main, 4, argv); free(argv1); free(argv2); @@ -92,11 +92,11 @@ static void test_dynamic_change() sg_vm_start(vm1); const char* w0_argv[] = {"worker0", "Task0", "-1.0", NULL}; - sg_actor_create("worker0", (sg_host_t)vm0, worker_busy_loop, 3, (char**)w0_argv); + sg_actor_create_("worker0", (sg_host_t)vm0, worker_busy_loop, 3, w0_argv); char* speed = bprintf("%f", sg_host_get_speed(pm0)); const char* w1_argv[] = {"worker1", "Task1", speed, NULL}; - sg_actor_create("worker1", (sg_host_t)vm1, worker_busy_loop, 3, (char**)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 diff --git a/examples/c/cloud-migration/cloud-migration.c b/examples/c/cloud-migration/cloud-migration.c index f3e5b82552..4e64e4b483 100644 --- a/examples/c/cloud-migration/cloud-migration.c +++ b/examples/c/cloud-migration/cloud-migration.c @@ -45,7 +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_create("mig_wrk", sg_host_self(), migration_worker_main, 3, (char**)argv); + sg_actor_create_("mig_wrk", sg_host_self(), migration_worker_main, 3, argv); } static void master_main(int argc, char* argv[]) diff --git a/examples/c/cloud-simple/cloud-simple.c b/examples/c/cloud-simple/cloud-simple.c index 6ed17197b7..b2c10c0a22 100644 --- a/examples/c/cloud-simple/cloud-simple.c +++ b/examples/c/cloud-simple/cloud-simple.c @@ -72,10 +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_create("comm_tx", tx_host, communication_tx_fun, 2, (char**)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_create("comm_rx", rx_host, communication_rx_fun, 2, (char**)rx_argv); + sg_actor_create_("comm_rx", rx_host, communication_rx_fun, 2, rx_argv); xbt_free(mbox); } diff --git a/examples/c/exec-waitany/exec-waitany.c b/examples/c/exec-waitany/exec-waitany.c index 8b29393dee..ef353fe107 100644 --- a/examples/c/exec-waitany/exec-waitany.c +++ b/examples/c/exec-waitany/exec-waitany.c @@ -67,10 +67,10 @@ int main(int argc, char* argv[]) simgrid_load_platform(argv[1]); const char* worker_argv[] = {"worker", "false"}; - sg_actor_create("worker", sg_host_by_name("Tremblay"), worker, 2, (char**)worker_argv); + sg_actor_create_("worker", sg_host_by_name("Tremblay"), worker, 2, worker_argv); worker_argv[1] = "true"; - sg_actor_create("worker_timeout", sg_host_by_name("Tremblay"), worker, 2, (char**)worker_argv); + sg_actor_create_("worker_timeout", sg_host_by_name("Tremblay"), worker, 2, worker_argv); simgrid_run(); return 0; diff --git a/examples/c/synchro-semaphore/synchro-semaphore.c b/examples/c/synchro-semaphore/synchro-semaphore.c index f52532cc48..bb0e3b8dea 100644 --- a/examples/c/synchro-semaphore/synchro-semaphore.c +++ b/examples/c/synchro-semaphore/synchro-semaphore.c @@ -56,8 +56,8 @@ int main(int argc, char* argv[]) const char* aliceTimes[] = {"0", "1", "3", "5", "1", "2", "5", "0"}; const char* bobTimes[] = {"0.9", "1", "1", "2", "2", "0", "0", "5"}; - sg_actor_create("Alice", h, peer, 8, (char**)aliceTimes); - sg_actor_create("Bob", h, peer, 8, (char**)bobTimes); + sg_actor_create_("Alice", h, peer, 8, aliceTimes); + sg_actor_create_("Bob", h, peer, 8, bobTimes); simgrid_run(); sg_sem_destroy(sem); diff --git a/include/simgrid/actor.h b/include/simgrid/actor.h index 58f2ec2284..af0ef343db 100644 --- a/include/simgrid/actor.h +++ b/include/simgrid/actor.h @@ -23,13 +23,22 @@ SG_BEGIN_DECL XBT_PUBLIC size_t sg_actor_count(); XBT_PUBLIC sg_actor_t* sg_actor_list(); -XBT_PUBLIC sg_actor_t sg_actor_create(const char* name, sg_host_t host, xbt_main_func_t code, int argc, - char* const* argv); +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); +static inline sg_actor_t sg_actor_create(const char* name, sg_host_t host, xbt_main_func_t code, int argc, + char* const* argv) +{ + return sg_actor_create_(name, host, code, 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. * * Note that argv is copied over, so you should free your own copy once the actor is started. */ -XBT_PUBLIC void sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, char* const* argv); +XBT_PUBLIC void sg_actor_start_(sg_actor_t actor, xbt_main_func_t code, int argc, const char* const* argv); +static inline void sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, char* const* argv) +{ + sg_actor_start_(actor, code, argc, (const char* const*)argv); +} XBT_PUBLIC void sg_actor_set_stacksize(sg_actor_t actor, unsigned size); XBT_PUBLIC void sg_actor_exit(); diff --git a/src/s4u/s4u_Actor.cpp b/src/s4u/s4u_Actor.cpp index ba18f7715c..6c2dbe91d3 100644 --- a/src/s4u/s4u_Actor.cpp +++ b/src/s4u/s4u_Actor.cpp @@ -492,7 +492,7 @@ sg_actor_t sg_actor_init(const char* name, sg_host_t host) return simgrid::s4u::Actor::init(name, host).get(); } -void sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, char* const* argv) +void sg_actor_start_(sg_actor_t actor, xbt_main_func_t code, int argc, const char* const* argv) { simgrid::kernel::actor::ActorCode function; if (code) @@ -500,7 +500,7 @@ void sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, char* cons actor->start(function); } -sg_actor_t sg_actor_create(const char* name, sg_host_t host, xbt_main_func_t code, int argc, char* const* argv) +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(function).get(); -- 2.20.1