X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/24760d83c71aa79e6aab9d3922d30a607a6cf7da..68701a14f6323155ceb9a0af8e82679cd10fe8ae:/src/plugins/operation.cpp diff --git a/src/plugins/operation.cpp b/src/plugins/operation.cpp index a250332be2..32ed8661b4 100644 --- a/src/plugins/operation.cpp +++ b/src/plugins/operation.cpp @@ -31,11 +31,6 @@ xbt::signal Operation::on_end; Operation::Operation(const std::string& name) : name_(name) {} -std::string Operation::get_name() -{ - return name_; -} - /** * @param predecessor The Operation to add. * @brief Add a predecessor to this Operation. @@ -61,10 +56,7 @@ void Operation::remove_predecessor(Operation* predecessor) */ bool Operation::ready_to_run() const { - if (working_ or queued_execs_ <= 0) - return false; - else - return true; + return not working_ && queued_execs_ > 0; } /** @@ -108,7 +100,8 @@ void Operation::complete() working_ = false; count_++; }); - end_func_(this); + if (end_func_) + end_func_(this); Operation::on_end(this); for (auto const& op : successors_) op->receive(this); @@ -126,7 +119,7 @@ void Operation::init() return; Operation::inited_ = true; ExtendedAttributeActivity::EXTENSION_ID = simgrid::s4u::Activity::extension_create(); - simgrid::s4u::Activity::on_completion_cb([&](simgrid::s4u::Activity const& activity) { + simgrid::s4u::Activity::on_completion_cb([](simgrid::s4u::Activity const& activity) { activity.extension()->operation_->complete(); }); } @@ -177,14 +170,25 @@ void Operation::remove_successor(OperationPtr successor) successor->remove_predecessor(this); } +void Operation::remove_all_successors() +{ + simgrid::kernel::actor::simcall_answered([this] { + while (not successors_.empty()) { + auto* successor = *(successors_.begin()); + successor->predecessors_.erase(this); + successors_.erase(successor); + } + }); +} + /** @ingroup plugin_operation * @param func The function to set. * @brief Set a function to be called before each execution. * @note The function is called before the underlying Activity starts. */ -void Operation::on_this_start(std::function func) +void Operation::on_this_start(const std::function& func) { - simgrid::kernel::actor::simcall_answered([this, func] { start_func_ = func; }); + simgrid::kernel::actor::simcall_answered([this, &func] { start_func_ = func; }); } /** @ingroup plugin_operation @@ -192,15 +196,15 @@ void Operation::on_this_start(std::function func) * @brief Set a function to be called after each execution. * @note The function is called after the underlying Activity ends, but before sending tokens to successors. */ -void Operation::on_this_end(std::function func) +void Operation::on_this_end(const std::function& func) { - simgrid::kernel::actor::simcall_answered([this, func] { end_func_ = func; }); + simgrid::kernel::actor::simcall_answered([this, &func] { end_func_ = func; }); } /** @ingroup plugin_operation * @brief Return the number of completed executions. */ -int Operation::get_count() +int Operation::get_count() const { return count_; } @@ -215,19 +219,15 @@ ExecOp::ExecOp(const std::string& name) : Operation(name) {} */ ExecOpPtr ExecOp::init(const std::string& name) { - auto op = ExecOpPtr(new ExecOp(name)); - return op; + return ExecOpPtr(new ExecOp(name)); } /** @ingroup plugin_operation * @brief Smart Constructor. */ -ExecOpPtr ExecOp::init(const std::string& name, double flops, simgrid::s4u::Host* host) +ExecOpPtr ExecOp::init(const std::string& name, double flops, s4u::Host* host) { - auto op = ExecOpPtr(new ExecOp(name)); - op->set_flops(flops); - op->set_host(host); - return op; + return init(name)->set_flops(flops)->set_host(host); } /** @@ -237,37 +237,40 @@ ExecOpPtr ExecOp::init(const std::string& name, double flops, simgrid::s4u::Host */ void ExecOp::execute() { - start_func_(this); + if (start_func_) + start_func_(this); Operation::on_start(this); - simgrid::kernel::actor::simcall_answered([this] { + kernel::actor::simcall_answered([this] { working_ = true; queued_execs_ = std::max(queued_execs_ - 1, 0); }); - simgrid::s4u::ExecPtr exec = simgrid::s4u::Exec::init(); + s4u::ExecPtr exec = s4u::Exec::init(); exec->set_name(name_); exec->set_flops_amount(amount_); exec->set_host(host_); exec->start(); exec->extension_set(new ExtendedAttributeActivity()); exec->extension()->operation_ = this; - simgrid::kernel::actor::simcall_answered([this, exec] { current_activity_ = exec; }); + kernel::actor::simcall_answered([this, exec] { current_activity_ = exec; }); } /** @ingroup plugin_operation * @param host The host to set. * @brief Set a new host. */ -void ExecOp::set_host(simgrid::s4u::Host* host) +ExecOpPtr ExecOp::set_host(s4u::Host* host) { - simgrid::kernel::actor::simcall_answered([this, host] { host_ = host; }); + kernel::actor::simcall_answered([this, host] { host_ = host; }); + return this; } /** @ingroup plugin_operation * @param flops The amount of flops to set. */ -void ExecOp::set_flops(double flops) +ExecOpPtr ExecOp::set_flops(double flops) { - simgrid::kernel::actor::simcall_answered([this, flops] { amount_ = flops; }); + kernel::actor::simcall_answered([this, flops] { amount_ = flops; }); + return this; } /** @@ -280,21 +283,16 @@ CommOp::CommOp(const std::string& name) : Operation(name) {} */ CommOpPtr CommOp::init(const std::string& name) { - auto op = CommOpPtr(new CommOp(name)); - return op; + return CommOpPtr(new CommOp(name)); } /** @ingroup plugin_operation * @brief Smart constructor. */ -CommOpPtr CommOp::init(const std::string& name, double bytes, simgrid::s4u::Host* source, - simgrid::s4u::Host* destination) +CommOpPtr CommOp::init(const std::string& name, double bytes, s4u::Host* source, + s4u::Host* destination) { - auto op = CommOpPtr(new CommOp(name)); - op->set_bytes(bytes); - op->set_source(source); - op->set_destination(destination); - return op; + return init(name)->set_bytes(bytes)->set_source(source)->set_destination(destination); } /** @@ -304,45 +302,49 @@ CommOpPtr CommOp::init(const std::string& name, double bytes, simgrid::s4u::Host */ void CommOp::execute() { - start_func_(this); + if (start_func_) + start_func_(this); Operation::on_start(this); - simgrid::kernel::actor::simcall_answered([this] { + kernel::actor::simcall_answered([this] { working_ = true; queued_execs_ = std::max(queued_execs_ - 1, 0); }); - simgrid::s4u::CommPtr comm = simgrid::s4u::Comm::sendto_init(source_, destination_); + s4u::CommPtr comm = s4u::Comm::sendto_init(source_, destination_); comm->set_name(name_); comm->set_payload_size(amount_); comm->start(); comm->extension_set(new ExtendedAttributeActivity()); comm->extension()->operation_ = this; - simgrid::kernel::actor::simcall_answered([this, comm] { current_activity_ = comm; }); + kernel::actor::simcall_answered([this, comm] { current_activity_ = comm; }); } /** @ingroup plugin_operation * @param source The host to set. * @brief Set a new source host. */ -void CommOp::set_source(simgrid::s4u::Host* source) +CommOpPtr CommOp::set_source(s4u::Host* source) { - simgrid::kernel::actor::simcall_answered([this, source] { source_ = source; }); + kernel::actor::simcall_answered([this, source] { source_ = source; }); + return this; } /** @ingroup plugin_operation * @param destination The host to set. * @brief Set a new destination host. */ -void CommOp::set_destination(simgrid::s4u::Host* destination) +CommOpPtr CommOp::set_destination(s4u::Host* destination) { - simgrid::kernel::actor::simcall_answered([this, destination] { destination_ = destination; }); + kernel::actor::simcall_answered([this, destination] { destination_ = destination; }); + return this; } /** @ingroup plugin_operation * @param bytes The amount of bytes to set. */ -void CommOp::set_bytes(double bytes) +CommOpPtr CommOp::set_bytes(double bytes) { - simgrid::kernel::actor::simcall_answered([this, bytes] { amount_ = bytes; }); + kernel::actor::simcall_answered([this, bytes] { amount_ = bytes; }); + return this; } } // namespace simgrid::plugins