int Comm::wait_any_for(const std::vector<CommPtr>* comms, double timeout)
{
- std::unique_ptr<kernel::activity::CommImpl* []> rcomms(new kernel::activity::CommImpl*[comms->size()]);
- std::transform(begin(*comms), end(*comms), rcomms.get(),
+ std::vector<kernel::activity::CommImpl*> rcomms(comms->size());
+ std::transform(begin(*comms), end(*comms), begin(rcomms),
[](const CommPtr& comm) { return static_cast<kernel::activity::CommImpl*>(comm->pimpl_.get()); });
- int changed_pos = simcall_comm_waitany(rcomms.get(), comms->size(), timeout);
+ int changed_pos = simcall_comm_waitany(rcomms.data(), rcomms.size(), timeout);
if (changed_pos != -1)
comms->at(changed_pos)->release_dependencies();
return changed_pos;
} else {
xbt_die("Cannot start a communication before specifying whether we are the sender or the receiver");
}
+
+ if (suspended_)
+ pimpl_->suspend();
+
state_ = State::STARTED;
return this;
}
int Comm::test_any(const std::vector<CommPtr>* comms)
{
- std::unique_ptr<kernel::activity::CommImpl* []> rcomms(new kernel::activity::CommImpl*[comms->size()]);
- std::transform(begin(*comms), end(*comms), rcomms.get(),
+ std::vector<kernel::activity::CommImpl*> rcomms(comms->size());
+ std::transform(begin(*comms), end(*comms), begin(rcomms),
[](const CommPtr& comm) { return static_cast<kernel::activity::CommImpl*>(comm->pimpl_.get()); });
- int changed_pos = simcall_comm_testany(rcomms.get(), comms->size());
+ int changed_pos = simcall_comm_testany(rcomms.data(), rcomms.size());
if (changed_pos != -1)
comms->at(changed_pos)->release_dependencies();
return changed_pos;
Actor* Comm::get_sender() const
{
- return kernel::actor::simcall([this] {
- kernel::actor::ActorImplPtr sender = nullptr;
- if (pimpl_)
- sender = boost::static_pointer_cast<kernel::activity::CommImpl>(pimpl_)->src_actor_;
- return sender ? sender->ciface() : nullptr;
- });
+ kernel::actor::ActorImplPtr sender = nullptr;
+ if (pimpl_)
+ sender = boost::static_pointer_cast<kernel::activity::CommImpl>(pimpl_)->src_actor_;
+ return sender ? sender->get_ciface() : nullptr;
}
} // namespace s4u