friend Exec;
friend Io;
+public:
+ // enum class State { ... }
+ XBT_DECLARE_ENUM_CLASS(State, INITED, STARTING, STARTED, CANCELED, FINISHED);
+
protected:
Activity() = default;
virtual ~Activity() = default;
virtual bool is_assigned() const = 0;
+ virtual void complete(Activity::State state)
+ {
+ state_ = state;
+ if (state == State::FINISHED)
+ release_dependencies();
+ }
+
void release_dependencies()
{
while (not successors_.empty()) {
Activity& operator=(Activity const&) = delete;
#endif
- // enum class State { ... }
- XBT_DECLARE_ENUM_CLASS(State, INITED, STARTING, STARTED, CANCELED, FINISHED);
-
/** Starts a previously created activity.
*
* This function is optional: you can call wait() even if you didn't call start()
Comm() = default;
+protected:
+ void complete(Activity::State state) override;
+
public:
#ifndef DOXYGEN
friend Mailbox; // Factory of comms
protected:
explicit Exec(kernel::activity::ExecImplPtr pimpl);
+ void complete(Activity::State state) override;
+
public:
#ifndef DOXYGEN
Exec(Exec const&) = delete;
protected:
explicit Io(kernel::activity::IoImplPtr pimpl);
+ void complete(Activity::State state) override;
+
public:
enum class OpType { READ, WRITE };
this->vetoable_start();
if (kernel::actor::simcall([this] { return this->get_impl()->test(); })) {
- state_ = State::FINISHED;
- this->release_dependencies();
+ complete(State::FINISHED);
return true;
}
xbt::signal<void(Comm const&, bool is_sender)> Comm::on_start;
xbt::signal<void(Comm const&)> Comm::on_completion;
+void Comm::complete(Activity::State state)
+{
+ Activity::complete(state);
+ on_completion(*this);
+}
+
Comm::~Comm()
{
if (state_ == State::STARTED && not detached_ &&
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.data(), rcomms.size(), timeout);
- if (changed_pos != -1) {
- on_completion(*(comms->at(changed_pos)));
- comms->at(changed_pos)->release_dependencies();
- }
+ if (changed_pos != -1)
+ comms->at(changed_pos)->complete(State::FINISHED);
return changed_pos;
}
simcall_comm_recv(receiver_, mailbox_->get_impl(), dst_buff_, &dst_buff_size_, match_fun_, copy_data_function_,
get_user_data(), timeout, rate_);
}
- state_ = State::FINISHED;
- this->release_dependencies();
break;
case State::STARTED:
simcall_comm_wait(get_impl(), timeout);
- state_ = State::FINISHED;
- this->release_dependencies();
break;
case State::CANCELED:
default:
THROW_IMPOSSIBLE;
}
- on_completion(*this);
+ complete(State::FINISHED);
return this;
}
[](const CommPtr& comm) { return static_cast<kernel::activity::CommImpl*>(comm->pimpl_.get()); });
int changed_pos = simcall_comm_testany(rcomms.data(), rcomms.size());
if (changed_pos != -1)
- comms->at(changed_pos)->release_dependencies();
+ comms->at(changed_pos)->complete(State::FINISHED);
return changed_pos;
}
if (pimpl_)
boost::static_pointer_cast<kernel::activity::CommImpl>(pimpl_)->cancel();
});
- state_ = State::CANCELED;
+ complete(State::CANCELED);
return this;
}
this->vetoable_start();
if (simcall_comm_test(get_impl())) {
- state_ = State::FINISHED;
- this->release_dependencies();
+ complete(State::FINISHED);
return true;
}
return false;
pimpl_ = pimpl;
}
+void Exec::complete(Activity::State state)
+{
+ Activity::complete(state);
+ on_completion(*this);
+}
+
ExecPtr Exec::init()
{
auto pimpl = kernel::activity::ExecImplPtr(new kernel::activity::ExecImpl());
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
kernel::actor::simcall_blocking([this, issuer, timeout] { this->get_impl()->wait_for(issuer, timeout); });
- state_ = State::FINISHED;
- on_completion(*this);
- this->release_dependencies();
+ complete(State::FINISHED);
return this;
}
kernel::activity::ExecImpl::wait_any_for(observer.get_issuer(), observer.get_execs(), observer.get_timeout());
},
&observer);
- if (changed_pos != -1) {
- on_completion(*(execs->at(changed_pos)));
- execs->at(changed_pos)->release_dependencies();
- }
+ if (changed_pos != -1)
+ execs->at(changed_pos)->complete(State::FINISHED);
return changed_pos;
}
Exec* Exec::cancel()
{
kernel::actor::simcall([this] { boost::static_pointer_cast<kernel::activity::ExecImpl>(pimpl_)->cancel(); });
- state_ = State::CANCELED;
- on_completion(*this);
+ complete(State::CANCELED);
return this;
}
pimpl_ = pimpl;
}
+void Io::complete(Activity::State state)
+{
+ Activity::complete(state);
+ on_completion(*this);
+}
+
IoPtr Io::init()
{
auto pimpl = kernel::activity::IoImplPtr(new kernel::activity::IoImpl());
Io* Io::cancel()
{
kernel::actor::simcall([this] { boost::static_pointer_cast<kernel::activity::IoImpl>(pimpl_)->cancel(); });
- state_ = State::CANCELED;
- on_completion(*this);
+ complete(State::CANCELED);
return this;
}
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
kernel::actor::simcall_blocking([this, issuer, timeout] { this->get_impl()->wait_for(issuer, timeout); });
- state_ = State::FINISHED;
- this->release_dependencies();
-
- on_completion(*this);
+ complete(state_ = State::FINISHED);
return this;
}