# 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
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
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
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
--- /dev/null
+/* 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;
+}
--- /dev/null
+#!/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
--- /dev/null
+/* 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;
+}
--- /dev/null
+#!/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.
--- /dev/null
+/* 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;
+}
--- /dev/null
+#!/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
--- /dev/null
+/* 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;
+}
--- /dev/null
+#!/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
/* 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);
/* 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);
} // 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;
#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;
/** 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
*/
#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>
} // 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
}
} // 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);
} // 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);
set(headers_to_install
include/simgrid/actor.h
+ include/simgrid/activityset.h
include/simgrid/barrier.h
include/simgrid/comm.h
include/simgrid/engine.h