From cb3dd47fc3ee91fbf921e02078184253ef3f775d Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Tue, 14 Nov 2023 17:16:22 +0100 Subject: [PATCH] Give a way to C users to not leak activities in activityset --- examples/c/activityset-testany/activityset-testany.c | 1 + examples/c/activityset-waitall/activityset-waitall.c | 2 ++ examples/c/activityset-waitallfor/activityset-waitallfor.c | 1 + examples/c/activityset-waitany/activityset-waitany.c | 1 + include/simgrid/activity_set.h | 3 +++ src/s4u/s4u_ActivitySet.cpp | 4 ++++ 6 files changed, 12 insertions(+) diff --git a/examples/c/activityset-testany/activityset-testany.c b/examples/c/activityset-testany/activityset-testany.c index 370e684389..b0c870214a 100644 --- a/examples/c/activityset-testany/activityset-testany.c +++ b/examples/c/activityset-testany/activityset-testany.c @@ -41,6 +41,7 @@ static void bob(int argc, char* argv[]) XBT_INFO("Completed a Comm"); if (sg_exec_isinstance(completed_one)) XBT_INFO("Completed an Exec"); + sg_activity_unref(completed_one); } else { XBT_INFO("Nothing matches, test again in 0.5s"); sg_actor_sleep_for(.5); diff --git a/examples/c/activityset-waitall/activityset-waitall.c b/examples/c/activityset-waitall/activityset-waitall.c index c63f091640..fe9e2710b9 100644 --- a/examples/c/activityset-waitall/activityset-waitall.c +++ b/examples/c/activityset-waitall/activityset-waitall.c @@ -32,6 +32,8 @@ static void bob() XBT_INFO("Wait for asynchronous activities to complete, all in one shot."); sg_activity_set_wait_all(pending_activities); + sg_activity_unref((sg_activity_t)exec); + sg_activity_unref((sg_activity_t)comm); XBT_INFO("All activities are completed."); free(payload); diff --git a/examples/c/activityset-waitallfor/activityset-waitallfor.c b/examples/c/activityset-waitallfor/activityset-waitallfor.c index 93bbe67db1..5bc1ede402 100644 --- a/examples/c/activityset-waitallfor/activityset-waitallfor.c +++ b/examples/c/activityset-waitallfor/activityset-waitallfor.c @@ -42,6 +42,7 @@ static void bob() XBT_INFO("Completed a Comm"); if (sg_exec_isinstance(completed_one)) XBT_INFO("Completed an Exec"); + sg_activity_unref(completed_one); completed_one = sg_activity_set_test_any(pending_activities); } } diff --git a/examples/c/activityset-waitany/activityset-waitany.c b/examples/c/activityset-waitany/activityset-waitany.c index 183693fcf9..3bf9b25b79 100644 --- a/examples/c/activityset-waitany/activityset-waitany.c +++ b/examples/c/activityset-waitany/activityset-waitany.c @@ -40,6 +40,7 @@ static void bob() XBT_INFO("Completed an Exec"); else xbt_die("This activity set is supposed to only contain Comm or Exec"); + sg_activity_unref(completed_one); } XBT_INFO("Last activity is complete"); free(payload); diff --git a/include/simgrid/activity_set.h b/include/simgrid/activity_set.h index 9028407bfc..9f80ad7561 100644 --- a/include/simgrid/activity_set.h +++ b/include/simgrid/activity_set.h @@ -26,6 +26,9 @@ XBT_PUBLIC sg_activity_t sg_activity_set_wait_any(sg_activity_set_t as); XBT_PUBLIC sg_activity_t sg_activity_set_wait_any_for(sg_activity_set_t as, double timeout); XBT_PUBLIC void sg_activity_set_delete(sg_activity_set_t as); +/** You must call this function manually on activities extracted from an activity_set with waitany and friends */ +XBT_PUBLIC void sg_activity_unref(sg_activity_t acti); + SG_END_DECL #endif /* INCLUDE_SIMGRID_ACTIVITY_SET_H */ diff --git a/src/s4u/s4u_ActivitySet.cpp b/src/s4u/s4u_ActivitySet.cpp index 215f126650..92a65cedf0 100644 --- a/src/s4u/s4u_ActivitySet.cpp +++ b/src/s4u/s4u_ActivitySet.cpp @@ -182,5 +182,9 @@ void sg_activity_set_delete(sg_activity_set_t as) { delete as; } +void sg_activity_unref(sg_activity_t acti) +{ + acti->unref(); +} SG_END_DECL -- 2.20.1