+int Comm::wait_any_for(std::vector<CommPtr>* comms_in, double timeout)
+{
+ // Map to dynar<Synchro*>:
+ xbt_dynar_t comms = xbt_dynar_new(sizeof(simgrid::kernel::activity::ActivityImpl*), [](void* ptr) {
+ intrusive_ptr_release(*(simgrid::kernel::activity::ActivityImpl**)ptr);
+ });
+ for (auto const& comm : *comms_in) {
+ if (comm->state_ == Activity::State::inited)
+ comm->start();
+ xbt_assert(comm->state_ == Activity::State::started);
+ simgrid::kernel::activity::ActivityImpl* ptr = comm->pimpl_.get();
+ intrusive_ptr_add_ref(ptr);
+ xbt_dynar_push_as(comms, simgrid::kernel::activity::ActivityImpl*, ptr);
+ }
+ // Call the underlying simcall:
+ int idx = simcall_comm_waitany(comms, timeout);
+ xbt_dynar_free(&comms);
+ return idx;
+}
+
+void Comm::wait_all(std::vector<CommPtr>* comms)
+{
+ // TODO: this should be a simcall or something
+ // TODO: we are missing a version with timeout
+ for (CommPtr comm : *comms) {
+ comm->wait();
+ }
+}
+