int count_ = 0;
bool working_ = false;
s4u::ActivityPtr current_activity_;
- std::function<void(Operation*)> end_func_;
- std::function<void(Operation*)> start_func_;
+ std::vector<std::function<void(Operation*)>> end_func_handlers_;
+ std::vector<std::function<void(Operation*)>> start_func_handlers_;
explicit Operation(const std::string& name);
virtual ~Operation() = default;
virtual void execute() = 0;
working_ = false;
count_++;
});
- if (end_func_)
- end_func_(this);
+ for (auto end_func : end_func_handlers_)
+ end_func(this);
Operation::on_end(this);
for (auto const& op : successors_)
op->receive(this);
*/
void Operation::on_this_start(const std::function<void(Operation*)>& func)
{
- simgrid::kernel::actor::simcall_answered([this, &func] { start_func_ = func; });
+ simgrid::kernel::actor::simcall_answered([this, &func] { start_func_handlers_.push_back(func); });
}
/** @ingroup plugin_operation
*/
void Operation::on_this_end(const std::function<void(Operation*)>& func)
{
- simgrid::kernel::actor::simcall_answered([this, &func] { end_func_ = func; });
+ simgrid::kernel::actor::simcall_answered([this, &func] { end_func_handlers_.push_back(func); });
}
/** @ingroup plugin_operation
*/
void ExecOp::execute()
{
- if (start_func_)
- start_func_(this);
+ for (auto start_func : start_func_handlers_)
+ start_func(this);
Operation::on_start(this);
kernel::actor::simcall_answered([this] {
working_ = true;
*/
void CommOp::execute()
{
- if (start_func_)
- start_func_(this);
+ for (auto start_func : start_func_handlers_)
+ start_func(this);
Operation::on_start(this);
kernel::actor::simcall_answered([this] {
working_ = true;