Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
C bindings of ActivitySet, along with 4 examples
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Fri, 21 Jul 2023 23:03:03 +0000 (01:03 +0200)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Fri, 21 Jul 2023 23:04:11 +0000 (01:04 +0200)
17 files changed:
MANIFEST.in
examples/c/CMakeLists.txt
examples/c/activityset-testany/activityset-testany.c [new file with mode: 0644]
examples/c/activityset-testany/activityset-testany.tesh [new file with mode: 0644]
examples/c/activityset-waitall/activityset-waitall.c [new file with mode: 0644]
examples/c/activityset-waitall/activityset-waitall.tesh [new file with mode: 0644]
examples/c/activityset-waitallfor/activityset-waitallfor.c [new file with mode: 0644]
examples/c/activityset-waitallfor/activityset-waitallfor.tesh [new file with mode: 0644]
examples/c/activityset-waitany/activityset-waitany.c [new file with mode: 0644]
examples/c/activityset-waitany/activityset-waitany.tesh [new file with mode: 0644]
include/simgrid/comm.h
include/simgrid/exec.h
include/simgrid/forward.h
src/s4u/s4u_ActivitySet.cpp
src/s4u/s4u_Comm.cpp
src/s4u/s4u_Exec.cpp
tools/cmake/DefinePackages.cmake

index b1bfd8e..7ec6879 100644 (file)
@@ -1,6 +1,14 @@
 # This file lists the content of the python source package
 # Prepared in tools/cmake/Distrib.cmake
 
+include examples/c/activityset-testany/activityset-testany.c
+include examples/c/activityset-testany/activityset-testany.tesh
+include examples/c/activityset-waitall/activityset-waitall.c
+include examples/c/activityset-waitall/activityset-waitall.tesh
+include examples/c/activityset-waitallfor/activityset-waitallfor.c
+include examples/c/activityset-waitallfor/activityset-waitallfor.tesh
+include examples/c/activityset-waitany/activityset-waitany.c
+include examples/c/activityset-waitany/activityset-waitany.tesh
 include examples/c/actor-create/actor-create.c
 include examples/c/actor-create/actor-create.tesh
 include examples/c/actor-create/actor-create_d.xml
@@ -1912,6 +1920,7 @@ include examples/smpi/replay_multiple_manual_deploy/CMakeLists.txt
 include examples/smpi/smpi_s4u_masterworker/CMakeLists.txt
 include examples/sthread/CMakeLists.txt
 include include/simgrid/Exception.hpp
+include include/simgrid/activityset.h
 include include/simgrid/actor.h
 include include/simgrid/barrier.h
 include include/simgrid/chrono.hpp
index 25cccf5..89060ad 100644 (file)
@@ -4,6 +4,7 @@
 foreach(x
         actor-create actor-daemon actor-exiting actor-join actor-kill actor-lifetime actor-migrate actor-stacksize
         actor-suspend actor-yield
+        activityset-testany activityset-waitall activityset-waitallfor activityset-waitany
         app-masterworker app-token-ring
         comm-pingpong comm-wait comm-waitall comm-waitany
         cloud-capping cloud-masterworker cloud-migration cloud-simple
@@ -96,6 +97,7 @@ set(xml_files     ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/actor-create/actor-cr
 foreach(x
         actor-create actor-daemon actor-exiting actor-join actor-kill actor-lifetime actor-migrate actor-stacksize
         actor-suspend actor-yield
+        activityset-testany activityset-waitall activityset-waitallfor activityset-waitany
         app-bittorrent app-chainsend app-masterworker app-token-ring
         comm-pingpong comm-wait comm-waitall comm-waitany
         cloud-capping  cloud-masterworker cloud-migration cloud-simple
diff --git a/examples/c/activityset-testany/activityset-testany.c b/examples/c/activityset-testany/activityset-testany.c
new file mode 100644 (file)
index 0000000..370e684
--- /dev/null
@@ -0,0 +1,76 @@
+/* Copyright (c) 2010-2023. 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/activity_set.h"
+#include "simgrid/actor.h"
+#include "simgrid/comm.h"
+#include "simgrid/engine.h"
+#include "simgrid/exec.h"
+#include "simgrid/host.h"
+#include "simgrid/mailbox.h"
+
+#include "xbt/log.h"
+#include "xbt/sysdep.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_activity_testany, "Messages specific for this s4u example");
+
+static void bob(int argc, char* argv[])
+{
+  XBT_INFO("Create my asynchronous activities");
+  sg_exec_t exec = sg_actor_exec_init(5e9);
+  sg_exec_start(exec);
+
+  sg_mailbox_t mbox = sg_mailbox_by_name("mbox");
+  void* payload     = NULL;
+  sg_comm_t comm    = sg_mailbox_get_async(mbox, &payload);
+
+  sg_activity_set_t pending_activities = sg_activity_set_init();
+  sg_activity_set_push(pending_activities, (sg_activity_t)exec);
+  sg_activity_set_push(pending_activities, (sg_activity_t)comm);
+
+  XBT_INFO("Sleep_for a while");
+  sg_actor_sleep_for(1);
+
+  XBT_INFO("Test for completed activities");
+  while (!sg_activity_set_empty(pending_activities)) {
+    sg_activity_t completed_one = sg_activity_set_test_any(pending_activities);
+    if (completed_one != NULL) {
+      if (sg_comm_isinstance(completed_one))
+        XBT_INFO("Completed a Comm");
+      if (sg_exec_isinstance(completed_one))
+        XBT_INFO("Completed an Exec");
+    } else {
+      XBT_INFO("Nothing matches, test again in 0.5s");
+      sg_actor_sleep_for(.5);
+    }
+  }
+  XBT_INFO("Last activity is complete");
+  free(payload);
+}
+
+static void alice(int argc, char* argv[])
+{
+  char* payload = xbt_strdup("Message");
+  XBT_INFO("Send '%s'", payload);
+  sg_mailbox_put(sg_mailbox_by_name("mbox"), payload, 6e8);
+}
+
+int main(int argc, char* argv[])
+{
+  simgrid_init(&argc, argv);
+  xbt_assert(argc > 1,
+             "Usage: %s platform_file\n"
+             "\tExample: %s hosts_with_disks.xml\n",
+             argv[0], argv[0]);
+
+  simgrid_load_platform(argv[1]);
+
+  sg_actor_create("alice", sg_host_by_name("alice"), alice, 0, NULL);
+  sg_actor_create("bob", sg_host_by_name("bob"), bob, 0, NULL);
+
+  simgrid_run();
+
+  return 0;
+}
diff --git a/examples/c/activityset-testany/activityset-testany.tesh b/examples/c/activityset-testany/activityset-testany.tesh
new file mode 100644 (file)
index 0000000..6293fa3
--- /dev/null
@@ -0,0 +1,19 @@
+#!/usr/bin/env tesh
+
+$ ${bindir:=.}/c-activityset-testany ${platfdir}/hosts_with_disks.xml "--log=root.fmt:[%4.2r]%e[%5a]%e%m%n"
+> [0.00] [alice] Send 'Message'
+> [0.00] [  bob] Create my asynchronous activities
+> [0.00] [  bob] Sleep_for a while
+> [1.00] [  bob] Test for completed activities
+> [1.00] [  bob] Nothing matches, test again in 0.5s
+> [1.50] [  bob] Nothing matches, test again in 0.5s
+> [2.00] [  bob] Nothing matches, test again in 0.5s
+> [2.50] [  bob] Nothing matches, test again in 0.5s
+> [3.00] [  bob] Nothing matches, test again in 0.5s
+> [3.50] [  bob] Nothing matches, test again in 0.5s
+> [4.00] [  bob] Nothing matches, test again in 0.5s
+> [4.50] [  bob] Nothing matches, test again in 0.5s
+> [5.00] [  bob] Completed an Exec
+> [5.00] [  bob] Nothing matches, test again in 0.5s
+> [5.50] [  bob] Completed a Comm
+> [5.50] [  bob] Last activity is complete
diff --git a/examples/c/activityset-waitall/activityset-waitall.c b/examples/c/activityset-waitall/activityset-waitall.c
new file mode 100644 (file)
index 0000000..c63f091
--- /dev/null
@@ -0,0 +1,63 @@
+/* Copyright (c) 2010-2023. 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/activity_set.h"
+#include "simgrid/actor.h"
+#include "simgrid/comm.h"
+#include "simgrid/engine.h"
+#include "simgrid/exec.h"
+#include "simgrid/host.h"
+#include "simgrid/mailbox.h"
+
+#include "xbt/log.h"
+#include "xbt/sysdep.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_activity_waitall, "Messages specific for this s4u example");
+
+static void bob()
+{
+  XBT_INFO("Create my asynchronous activities");
+  sg_exec_t exec = sg_actor_exec_init(5e9);
+  sg_exec_start(exec);
+
+  sg_mailbox_t mbox = sg_mailbox_by_name("mbox");
+  void* payload     = NULL;
+  sg_comm_t comm    = sg_mailbox_get_async(mbox, &payload);
+
+  sg_activity_set_t pending_activities = sg_activity_set_init();
+  sg_activity_set_push(pending_activities, (sg_activity_t)exec);
+  sg_activity_set_push(pending_activities, (sg_activity_t)comm);
+
+  XBT_INFO("Wait for asynchronous activities to complete, all in one shot.");
+  sg_activity_set_wait_all(pending_activities);
+
+  XBT_INFO("All activities are completed.");
+  free(payload);
+}
+
+static void alice()
+{
+  char* payload = xbt_strdup("Message");
+  XBT_INFO("Send '%s'", payload);
+  sg_mailbox_put(sg_mailbox_by_name("mbox"), payload, 6e8);
+}
+
+int main(int argc, char* argv[])
+{
+  simgrid_init(&argc, argv);
+  xbt_assert(argc > 1,
+             "Usage: %s platform_file\n"
+             "\tExample: %s hosts_with_disks.xml\n",
+             argv[0], argv[0]);
+
+  simgrid_load_platform(argv[1]);
+
+  sg_actor_create("alice", sg_host_by_name("alice"), alice, 0, NULL);
+  sg_actor_create("bob", sg_host_by_name("bob"), bob, 0, NULL);
+
+  simgrid_run();
+
+  return 0;
+}
diff --git a/examples/c/activityset-waitall/activityset-waitall.tesh b/examples/c/activityset-waitall/activityset-waitall.tesh
new file mode 100644 (file)
index 0000000..1093563
--- /dev/null
@@ -0,0 +1,7 @@
+#!/usr/bin/env tesh
+
+$ ${bindir:=.}/c-activityset-waitall ${platfdir}/hosts_with_disks.xml "--log=root.fmt:[%7.6r]%e[%5a]%e%m%n"
+> [0.000000] [alice] Send 'Message'
+> [0.000000] [  bob] Create my asynchronous activities
+> [0.000000] [  bob] Wait for asynchronous activities to complete, all in one shot.
+> [5.197828] [  bob] All activities are completed.
diff --git a/examples/c/activityset-waitallfor/activityset-waitallfor.c b/examples/c/activityset-waitallfor/activityset-waitallfor.c
new file mode 100644 (file)
index 0000000..93bbe67
--- /dev/null
@@ -0,0 +1,76 @@
+/* Copyright (c) 2010-2023. 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/activity_set.h"
+#include "simgrid/actor.h"
+#include "simgrid/comm.h"
+#include "simgrid/engine.h"
+#include "simgrid/exec.h"
+#include "simgrid/host.h"
+#include "simgrid/mailbox.h"
+
+#include "xbt/log.h"
+#include "xbt/sysdep.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_activity_waitallfor, "Messages specific for this s4u example");
+
+static void bob()
+{
+  XBT_INFO("Create my asynchronous activities");
+  sg_exec_t exec = sg_actor_exec_init(5e9);
+  sg_exec_start(exec);
+
+  sg_mailbox_t mbox = sg_mailbox_by_name("mbox");
+  void* payload     = NULL;
+  sg_comm_t comm    = sg_mailbox_get_async(mbox, &payload);
+
+  sg_activity_set_t pending_activities = sg_activity_set_init();
+  sg_activity_set_push(pending_activities, (sg_activity_t)exec);
+  sg_activity_set_push(pending_activities, (sg_activity_t)comm);
+
+  XBT_INFO("Wait for asynchronous activities to complete");
+  while (!sg_activity_set_empty(pending_activities)) {
+    if (!sg_activity_set_wait_all_for(pending_activities, 1)) {
+      XBT_INFO("Not all activities are terminated yet.");
+    }
+
+    sg_activity_t completed_one = sg_activity_set_test_any(pending_activities);
+    while (completed_one != NULL) {
+      if (sg_comm_isinstance(completed_one))
+        XBT_INFO("Completed a Comm");
+      if (sg_exec_isinstance(completed_one))
+        XBT_INFO("Completed an Exec");
+      completed_one = sg_activity_set_test_any(pending_activities);
+    }
+  }
+
+  XBT_INFO("Last activity is complete");
+  free(payload);
+}
+
+static void alice()
+{
+  char* payload = xbt_strdup("Message");
+  XBT_INFO("Send '%s'", payload);
+  sg_mailbox_put(sg_mailbox_by_name("mbox"), payload, 6e8);
+}
+
+int main(int argc, char* argv[])
+{
+  simgrid_init(&argc, argv);
+  xbt_assert(argc > 1,
+             "Usage: %s platform_file\n"
+             "\tExample: %s hosts_with_disks.xml\n",
+             argv[0], argv[0]);
+
+  simgrid_load_platform(argv[1]);
+
+  sg_actor_create("alice", sg_host_by_name("alice"), alice, 0, NULL);
+  sg_actor_create("bob", sg_host_by_name("bob"), bob, 0, NULL);
+
+  simgrid_run();
+
+  return 0;
+}
diff --git a/examples/c/activityset-waitallfor/activityset-waitallfor.tesh b/examples/c/activityset-waitallfor/activityset-waitallfor.tesh
new file mode 100644 (file)
index 0000000..26a73c5
--- /dev/null
@@ -0,0 +1,14 @@
+#!/usr/bin/env tesh
+
+$ ${bindir:=.}/c-activityset-waitallfor ${platfdir}/hosts_with_disks.xml "--log=root.fmt:[%7.6r]%e[%5a]%e%m%n"
+> [0.000000] [alice] Send 'Message'
+> [0.000000] [  bob] Create my asynchronous activities
+> [0.000000] [  bob] Wait for asynchronous activities to complete
+> [1.000000] [  bob] Not all activities are terminated yet.
+> [2.000000] [  bob] Not all activities are terminated yet.
+> [3.000000] [  bob] Not all activities are terminated yet.
+> [4.000000] [  bob] Not all activities are terminated yet.
+> [5.000000] [  bob] Not all activities are terminated yet.
+> [5.000000] [  bob] Completed an Exec
+> [5.197828] [  bob] Completed a Comm
+> [5.197828] [  bob] Last activity is complete
diff --git a/examples/c/activityset-waitany/activityset-waitany.c b/examples/c/activityset-waitany/activityset-waitany.c
new file mode 100644 (file)
index 0000000..183693f
--- /dev/null
@@ -0,0 +1,71 @@
+/* Copyright (c) 2010-2023. 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/activity_set.h"
+#include "simgrid/actor.h"
+#include "simgrid/comm.h"
+#include "simgrid/engine.h"
+#include "simgrid/exec.h"
+#include "simgrid/host.h"
+#include "simgrid/mailbox.h"
+
+#include "xbt/log.h"
+#include "xbt/sysdep.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_activity_waittany, "Messages specific for this s4u example");
+
+static void bob()
+{
+  XBT_INFO("Create my asynchronous activities");
+  sg_exec_t exec = sg_actor_exec_init(5e9);
+  sg_exec_start(exec);
+
+  sg_mailbox_t mbox = sg_mailbox_by_name("mbox");
+  void* payload     = NULL;
+  sg_comm_t comm    = sg_mailbox_get_async(mbox, &payload);
+
+  sg_activity_set_t pending_activities = sg_activity_set_init();
+  sg_activity_set_push(pending_activities, (sg_activity_t)exec);
+  sg_activity_set_push(pending_activities, (sg_activity_t)comm);
+
+  XBT_INFO("Wait for asynchronous activities to complete");
+  while (!sg_activity_set_empty(pending_activities)) {
+
+    sg_activity_t completed_one = sg_activity_set_wait_any(pending_activities);
+    if (sg_comm_isinstance(completed_one))
+      XBT_INFO("Completed a Comm");
+    else if (sg_exec_isinstance(completed_one))
+      XBT_INFO("Completed an Exec");
+    else
+      xbt_die("This activity set is supposed to only contain Comm or Exec");
+  }
+  XBT_INFO("Last activity is complete");
+  free(payload);
+}
+
+static void alice()
+{
+  char* payload = xbt_strdup("Message");
+  XBT_INFO("Send '%s'", payload);
+  sg_mailbox_put(sg_mailbox_by_name("mbox"), payload, 6e8);
+}
+
+int main(int argc, char* argv[])
+{
+  simgrid_init(&argc, argv);
+  xbt_assert(argc > 1,
+             "Usage: %s platform_file\n"
+             "\tExample: %s hosts_with_disks.xml\n",
+             argv[0], argv[0]);
+
+  simgrid_load_platform(argv[1]);
+
+  sg_actor_create("alice", sg_host_by_name("alice"), alice, 0, NULL);
+  sg_actor_create("bob", sg_host_by_name("bob"), bob, 0, NULL);
+
+  simgrid_run();
+
+  return 0;
+}
diff --git a/examples/c/activityset-waitany/activityset-waitany.tesh b/examples/c/activityset-waitany/activityset-waitany.tesh
new file mode 100644 (file)
index 0000000..dac02a8
--- /dev/null
@@ -0,0 +1,9 @@
+#!/usr/bin/env tesh
+
+$ ${bindir:=.}/c-activityset-waitany ${platfdir}/hosts_with_disks.xml "--log=root.fmt:[%7.6r]%e[%5a]%e%m%n"
+> [0.000000] [alice] Send 'Message'
+> [0.000000] [  bob] Create my asynchronous activities
+> [0.000000] [  bob] Wait for asynchronous activities to complete
+> [5.000000] [  bob] Completed an Exec
+> [5.197828] [  bob] Completed a Comm
+> [5.197828] [  bob] Last activity is complete
index ee5f5e7..299b743 100644 (file)
@@ -12,6 +12,8 @@
 /* C interface */
 SG_BEGIN_DECL
 
+XBT_PUBLIC int sg_comm_isinstance(sg_activity_t acti);
+
 XBT_PUBLIC void sg_comm_detach(sg_comm_t comm, void (*clean_function)(void*));
 XBT_PUBLIC int sg_comm_test(sg_comm_t comm);
 XBT_PUBLIC sg_error_t sg_comm_wait(sg_comm_t comm);
index aed0390..7779a5a 100644 (file)
@@ -12,6 +12,8 @@
 /* C interface */
 SG_BEGIN_DECL
 
+XBT_PUBLIC int sg_exec_isinstance(sg_activity_t acti);
+
 XBT_PUBLIC void sg_exec_set_bound(sg_exec_t exec, double bound);
 XBT_PUBLIC const char* sg_exec_get_name(const_sg_exec_t exec);
 XBT_PUBLIC void sg_exec_set_name(sg_exec_t exec, const char* name);
index 6c72682..85fe6a7 100644 (file)
@@ -221,6 +221,8 @@ class RemoteApp;
 } // namespace simgrid
 
 using s4u_Actor             = simgrid::s4u::Actor;
+using s4u_Activity          = simgrid::s4u::Activity;
+using s4u_ActivitySet       = simgrid::s4u::ActivitySet;
 using s4u_Barrier           = simgrid::s4u::Barrier;
 using s4u_Comm              = simgrid::s4u::Comm;
 using s4u_Exec              = simgrid::s4u::Exec;
@@ -239,6 +241,8 @@ using smx_activity_t = simgrid::kernel::activity::ActivityImpl*;
 #else
 
 typedef struct s4u_Actor s4u_Actor;
+typedef struct s4u_Activity s4u_Activity;
+typedef struct s4u_ActivitySet s4u_ActivitySet;
 typedef struct s4u_Barrier s4u_Barrier;
 typedef struct s4u_Comm s4u_Comm;
 typedef struct s4u_Exec s4u_Exec;
@@ -289,6 +293,16 @@ typedef s4u_Actor* sg_actor_t;
 /** Pointer to a constant actor object */
 typedef const s4u_Actor* const_sg_actor_t;
 
+/** Pointer to an activity object */
+typedef s4u_Activity* sg_activity_t;
+/** Pointer to a constant activity object */
+typedef const s4u_Activity* const_sg_activity_t;
+
+/** Pointer to an activity set object */
+typedef s4u_ActivitySet* sg_activity_set_t;
+/** Pointer to a constant activity set object */
+typedef const s4u_ActivitySet* const_sg_activity_set_t;
+
 /** @ingroup m_datatypes_management_details
  * @brief Type for any SimGrid size
  */
index 6e7eded..8ba545a 100644 (file)
@@ -7,6 +7,7 @@
 #include "src/kernel/actor/ActorImpl.hpp"
 #include "src/kernel/actor/CommObserver.hpp"
 #include <simgrid/Exception.hpp>
+#include <simgrid/activity_set.h>
 #include <simgrid/s4u/ActivitySet.hpp>
 #include <simgrid/s4u/Engine.hpp>
 
@@ -97,3 +98,63 @@ ActivityPtr ActivitySet::get_failed_activity()
 
 } // namespace s4u
 } // namespace simgrid
+
+SG_BEGIN_DECL
+
+sg_activity_set_t sg_activity_set_init()
+{
+  return new simgrid::s4u::ActivitySet();
+}
+void sg_activity_set_push(sg_activity_set_t as, sg_activity_t acti)
+{
+  as->push(acti);
+}
+void sg_activity_set_erase(sg_activity_set_t as, sg_activity_t acti)
+{
+  as->erase(acti);
+}
+size_t sg_activity_set_size(sg_activity_set_t as)
+{
+  return as->size();
+}
+int sg_activity_set_empty(sg_activity_set_t as)
+{
+  return as->empty();
+}
+
+sg_activity_t sg_activity_set_test_any(sg_activity_set_t as)
+{
+  return as->test_any().get();
+}
+void sg_activity_set_wait_all(sg_activity_set_t as)
+{
+  as->wait_all();
+}
+int sg_activity_set_wait_all_for(sg_activity_set_t as, double timeout)
+{
+  try {
+    as->wait_all_for(timeout);
+    return 1;
+  } catch (const simgrid::TimeoutException& e) {
+    return 0;
+  }
+}
+sg_activity_t sg_activity_set_wait_any(sg_activity_set_t as)
+{
+  return as->wait_any().get();
+}
+sg_activity_t sg_activity_set_wait_any_for(sg_activity_set_t as, double timeout)
+{
+  try {
+    return as->wait_any_for(timeout).get();
+  } catch (const simgrid::TimeoutException& e) {
+    return nullptr;
+  }
+}
+
+void sg_activity_set_delete(sg_activity_set_t as)
+{
+  delete as;
+}
+
+SG_END_DECL
index d88103a..4b7030e 100644 (file)
@@ -498,6 +498,11 @@ size_t Comm::wait_all_for(const std::vector<CommPtr>& comms, double timeout)
 }
 } // namespace simgrid::s4u
 /* **************************** Public C interface *************************** */
+int sg_comm_isinstance(sg_activity_t acti)
+{
+  return dynamic_cast<simgrid::s4u::Comm*>(acti) != nullptr;
+}
+
 void sg_comm_detach(sg_comm_t comm, void (*clean_function)(void*))
 {
   comm->detach(clean_function);
index 4a641e2..caa7466 100644 (file)
@@ -259,6 +259,11 @@ bool Exec::is_assigned() const
 } // namespace simgrid::s4u
 
 /* **************************** Public C interface *************************** */
+int sg_exec_isinstance(sg_activity_t acti)
+{
+  return dynamic_cast<simgrid::s4u::Exec*>(acti) != nullptr;
+}
+
 void sg_exec_set_bound(sg_exec_t exec, double bound)
 {
   exec->set_bound(bound);
index 96da677..5456284 100644 (file)
@@ -649,6 +649,7 @@ set(MC_SIMGRID_MC_SRC  src/mc/explo/simgrid_mc.cpp)
 
 set(headers_to_install
   include/simgrid/actor.h
+  include/simgrid/activityset.h
   include/simgrid/barrier.h
   include/simgrid/comm.h
   include/simgrid/engine.h