CommPtr Comm::set_rate(double rate)
{
xbt_assert(state_ == State::INITED, "You cannot use %s() once your communication started (not implemented)",
- __FUNCTION__);
+ __func__);
rate_ = rate;
return this;
}
CommPtr Comm::set_mailbox(Mailbox* mailbox)
{
xbt_assert(state_ == State::INITED, "You cannot use %s() once your communication started (not implemented)",
- __FUNCTION__);
+ __func__);
mailbox_ = mailbox;
return this;
}
CommPtr Comm::set_src_data(void* buff)
{
xbt_assert(state_ == State::INITED, "You cannot use %s() once your communication started (not implemented)",
- __FUNCTION__);
+ __func__);
xbt_assert(dst_buff_ == nullptr, "Cannot set the src and dst buffers at the same time");
src_buff_ = buff;
return this;
CommPtr Comm::set_src_data_size(size_t size)
{
xbt_assert(state_ == State::INITED, "You cannot use %s() once your communication started (not implemented)",
- __FUNCTION__);
+ __func__);
src_buff_size_ = size;
return this;
}
CommPtr Comm::set_src_data(void* buff, size_t size)
{
xbt_assert(state_ == State::INITED, "You cannot use %s() once your communication started (not implemented)",
- __FUNCTION__);
+ __func__);
xbt_assert(dst_buff_ == nullptr, "Cannot set the src and dst buffers at the same time");
src_buff_ = buff;
CommPtr Comm::set_dst_data(void** buff)
{
xbt_assert(state_ == State::INITED, "You cannot use %s() once your communication started (not implemented)",
- __FUNCTION__);
+ __func__);
xbt_assert(src_buff_ == nullptr, "Cannot set the src and dst buffers at the same time");
dst_buff_ = buff;
return this;
CommPtr Comm::set_dst_data(void** buff, size_t size)
{
xbt_assert(state_ == State::INITED, "You cannot use %s() once your communication started (not implemented)",
- __FUNCTION__);
+ __func__);
xbt_assert(src_buff_ == nullptr, "Cannot set the src and dst buffers at the same time");
dst_buff_ = buff;
Comm* Comm::do_start()
{
xbt_assert(get_state() == State::INITED || get_state() == State::STARTING,
- "You cannot use %s() once your communication started (not implemented)", __FUNCTION__);
+ "You cannot use %s() once your communication started (not implemented)", __func__);
auto myself = kernel::actor::ActorImpl::self();
Comm* Comm::detach()
{
xbt_assert(state_ == State::INITED || state_ == State::STARTING,
- "You cannot use %s() once your communication is %s (not implemented)", __FUNCTION__, get_state_str());
+ "You cannot use %s() once your communication is %s (not implemented)", __func__, get_state_str());
xbt_assert(dst_buff_ == nullptr && dst_buff_size_ == 0, "You can only detach sends, not recvs");
detached_ = true;
start();
return this;
}
-ssize_t Comm::test_any(const std::vector<CommPtr>& comms)
+ssize_t Comm::test_any(const std::vector<CommPtr>& comms) // XBT_ATTRIB_DEPRECATED_v339
{
- std::vector<ActivityPtr> activities;
- for (const auto& comm : comms)
- activities.push_back(boost::dynamic_pointer_cast<Activity>(comm));
- return Activity::test_any(activities);
+ std::vector<kernel::activity::ActivityImpl*> ractivities(comms.size());
+ std::transform(begin(comms), end(comms), begin(ractivities), [](const CommPtr& act) { return act->pimpl_.get(); });
+
+ kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
+ kernel::actor::ActivityTestanySimcall observer{issuer, ractivities, "test_any"};
+ ssize_t changed_pos = kernel::actor::simcall_answered(
+ [&observer] {
+ return kernel::activity::ActivityImpl::test_any(observer.get_issuer(), observer.get_activities());
+ },
+ &observer);
+ if (changed_pos != -1)
+ comms.at(changed_pos)->complete(State::FINISHED);
+ return changed_pos;
}
/** @brief Block the calling actor until the communication is finished, or until timeout
return this;
}
-ssize_t Comm::deprecated_wait_any_for(const std::vector<CommPtr>& comms, double timeout)
+ssize_t Comm::deprecated_wait_any_for(const std::vector<CommPtr>& comms, double timeout) // XBT_ATTRIB_DEPRECATED_v339
{
- std::vector<ActivityPtr> activities;
+ if (comms.empty())
+ return -1;
+ ActivitySet set;
for (const auto& comm : comms)
- activities.push_back(boost::dynamic_pointer_cast<Activity>(comm));
- ssize_t changed_pos;
+ set.push(comm);
try {
- changed_pos = Activity::wait_any_for(activities, timeout);
+ auto* ret = set.wait_any_for(timeout).get();
+ for (size_t i = 0; i < comms.size(); i++)
+ if (comms[i].get() == ret)
+ return i;
+
+ } catch (TimeoutException& e) {
+ return -1;
} catch (const NetworkFailureException& e) {
- changed_pos = -1;
- for (auto c : comms) {
- if (c->pimpl_->get_state() == kernel::activity::State::FAILED) {
+ for (auto c : comms)
+ if (c->pimpl_->get_state() == kernel::activity::State::FAILED)
c->complete(State::FAILED);
- }
- }
+
e.rethrow_nested(XBT_THROW_POINT, boost::core::demangle(typeid(e).name()) + " raised in kernel mode.");
}
- return changed_pos;
+ return -1;
}
void Comm::wait_all(const std::vector<CommPtr>& comms) // XBT_ATTRIB_DEPRECATED_v339
return comms.size();
}
- double deadline = Engine::get_clock() + timeout;
- std::vector<CommPtr> waited_comm(1, nullptr);
- for (size_t i = 0; i < comms.size(); i++) {
- double wait_timeout = std::max(0.0, deadline - Engine::get_clock());
- waited_comm[0] = comms[i];
- // Using wait_any_for() here (and not wait_for) because we don't want comms to be invalidated on timeout
- if (wait_any_for(waited_comm, wait_timeout) == -1) {
- XBT_DEBUG("Timeout (%g): i = %zu", wait_timeout, i);
- return i;
- }
- }
- return comms.size();
+ ActivitySet set;
+ for (auto comm : comms)
+ set.push(comm);
+ set.wait_all_for(timeout);
+
+ return set.size();
}
} // namespace simgrid::s4u
/* **************************** Public C interface *************************** */