namespace simgrid {
namespace s4u {
-xbt::signal<void(Actor const&)> Comm::on_sender_start;
-xbt::signal<void(Actor const&)> Comm::on_receiver_start;
-xbt::signal<void(Actor const&)> Comm::on_completion;
+xbt::signal<void(Comm const&, bool is_sender)> Comm::on_start;
+xbt::signal<void(Comm const&)> Comm::on_completion;
Comm::~Comm()
{
return this;
}
-CommPtr Comm::set_tracing_category(const std::string& category)
-{
- xbt_assert(state_ == State::INITED, "Cannot change the tracing category of an exec after its start");
- tracing_category_ = category;
- return this;
-}
-
Comm* Comm::start()
{
xbt_assert(get_state() == State::INITED || get_state() == State::STARTING,
"You cannot use %s() once your communication started (not implemented)", __FUNCTION__);
if (src_buff_ != nullptr) { // Sender side
- on_sender_start(*Actor::self());
+ on_start(*this, true /* is_sender*/);
pimpl_ = simcall_comm_isend(sender_, mailbox_->get_impl(), remains_, rate_, src_buff_, src_buff_size_, match_fun_,
clean_fun_, copy_data_function_, get_user_data(), detached_);
} else if (dst_buff_ != nullptr) { // Receiver side
xbt_assert(not detached_, "Receive cannot be detached");
- on_receiver_start(*Actor::self());
+ on_start(*this, false /*is_sender*/);
pimpl_ = simcall_comm_irecv(receiver_, mailbox_->get_impl(), dst_buff_, &dst_buff_size_, match_fun_,
copy_data_function_, get_user_data(), rate_);
case State::INITED:
case State::STARTING: // It's not started yet. Do it in one simcall
if (src_buff_ != nullptr) {
- on_sender_start(*Actor::self());
+ on_start(*this, true /*is_sender*/);
simcall_comm_send(sender_, mailbox_->get_impl(), remains_, rate_, src_buff_, src_buff_size_, match_fun_,
copy_data_function_, get_user_data(), timeout);
} else { // Receiver
- on_receiver_start(*Actor::self());
+ on_start(*this, false /*is_sender*/);
simcall_comm_recv(receiver_, mailbox_->get_impl(), dst_buff_, &dst_buff_size_, match_fun_, copy_data_function_,
get_user_data(), timeout, rate_);
}
case State::STARTED:
simcall_comm_wait(get_impl(), timeout);
- on_completion(*Actor::self());
state_ = State::FINISHED;
this->release_dependencies();
break;
default:
THROW_IMPOSSIBLE;
}
+ on_completion(*this);
return this;
}