actor->set_properties(*properties);
/* Add the process to it's host process list */
- host->pimpl_->actor_list_.push_back(*actor);
+ host->pimpl_->add_actor(actor);
/* Now insert it in the global process list and in the process to run list */
simix_global->process_list[actor->get_pid()] = actor;
simix_global->process_list.erase(pid_);
if (host_ && host_actor_list_hook.is_linked())
- simgrid::xbt::intrusive_erase(host_->pimpl_->actor_list_, *this);
+ host_->pimpl_->remove_actor(this);
if (not smx_destroy_list_hook.is_linked()) {
#if SIMGRID_HAVE_MC
xbt_dynar_push_as(simix_global->dead_actors_vector, ActorImpl*, this);
void ActorImpl::set_host(s4u::Host* dest)
{
- xbt::intrusive_erase(host_->pimpl_->actor_list_, *this);
+ host_->pimpl_->remove_actor(this);
host_ = dest;
- dest->pimpl_->actor_list_.push_back(*this);
+ dest->pimpl_->add_actor(this);
}
ActorImplPtr ActorImpl::init(const std::string& name, s4u::Host* host)
XBT_DEBUG("Start context '%s'", get_cname());
/* Add the actor to its host's actor list */
- host_->pimpl_->actor_list_.push_back(*this);
+ host_->pimpl_->add_actor(this);
simix_global->process_list[pid_] = this;
/* Now insert it in the global actor list and in the actor to run list */
throw VmFailureException(XBT_THROW_POINT, xbt::string_printf("Actor %s cannot suspend the VM %s in which it runs",
issuer->get_cname(), piface_->get_cname()));
- XBT_DEBUG("suspend VM(%s), where %zu actors exist", piface_->get_cname(), actor_list_.size());
+ XBT_DEBUG("suspend VM(%s), where %zu actors exist", piface_->get_cname(), get_actor_count());
action_->suspend();
- for (auto& actor : actor_list_) {
- XBT_DEBUG("suspend %s", actor.get_cname());
- actor.suspend();
+ for (auto& actor : get_all_actors()) {
+ XBT_DEBUG("suspend %s", actor->get_cname());
+ actor->suspend();
}
XBT_DEBUG("suspend all actors on the VM done done");
throw VmFailureException(XBT_THROW_POINT,
xbt::string_printf("Cannot resume VM %s: it was not suspended", piface_->get_cname()));
- XBT_DEBUG("Resume VM %s, containing %zu actors.", piface_->get_cname(), actor_list_.size());
+ XBT_DEBUG("Resume VM %s, containing %zu actors.", piface_->get_cname(), get_actor_count());
action_->resume();
- for (auto& actor : actor_list_) {
- XBT_DEBUG("resume %s", actor.get_cname());
- actor.resume();
+ for (auto& actor : get_all_actors()) {
+ XBT_DEBUG("resume %s", actor->get_cname());
+ actor->resume();
}
vm_state_ = s4u::VirtualMachine::state::RUNNING;
XBT_VERB("Shutting down the VM %s even if it's not running but %s", piface_->get_cname(), stateName);
}
- XBT_DEBUG("shutdown VM %s, that contains %zu actors", piface_->get_cname(), actor_list_.size());
+ XBT_DEBUG("shutdown VM %s, that contains %zu actors", piface_->get_cname(), get_actor_count());
- for (auto& actor : actor_list_) {
- XBT_DEBUG("kill %s@%s on behalf of %s which shutdown that VM.", actor.get_cname(), actor.get_host()->get_cname(),
+ for (auto& actor : get_all_actors()) {
+ XBT_DEBUG("kill %s@%s on behalf of %s which shutdown that VM.", actor->get_cname(), actor->get_host()->get_cname(),
issuer->get_cname());
- issuer->kill(&actor);
+ issuer->kill(actor->get_impl());
}
set_state(s4u::VirtualMachine::state::DESTROYED);
MPI_Comm Comm::find_intra_comm(int * leader){
//get the indices of all processes sharing the same simix host
- auto& actor_list = sg_host_self()->pimpl_->actor_list_;
+ auto actor_list = sg_host_self()->pimpl_->get_all_actors();
int intra_comm_size = 0;
int min_index = INT_MAX; // the minimum index will be the leader
for (auto& actor : actor_list) {
- int index = actor.get_pid();
- if (this->group()->rank(actor.ciface()) != MPI_UNDEFINED) { // Is this process in the current group?
+ int index = actor->get_pid();
+ if (this->group()->rank(actor.get()) != MPI_UNDEFINED) { // Is this process in the current group?
intra_comm_size++;
if (index < min_index)
min_index = index;
MPI_Group group_intra = new Group(intra_comm_size);
int i = 0;
for (auto& actor : actor_list) {
- if (this->group()->rank(actor.ciface()) != MPI_UNDEFINED) {
- group_intra->set_mapping(actor.ciface(), i);
+ if (this->group()->rank(actor.get()) != MPI_UNDEFINED) {
+ group_intra->set_mapping(actor.get(), i);
i++;
}
}
* @details An host represents a machine with a aggregation of a Cpu, a RoutingEdge and a Storage
*/
class XBT_PRIVATE HostImpl : public simgrid::surf::PropertyHolder {
+ typedef boost::intrusive::list<
+ kernel::actor::ActorImpl,
+ boost::intrusive::member_hook<kernel::actor::ActorImpl, boost::intrusive::list_member_hook<>,
+ &kernel::actor::ActorImpl::host_actor_list_hook>>
+ ActorList;
+ ActorList actor_list_;
public:
explicit HostImpl(s4u::Host* host);
void turn_off();
std::vector<s4u::ActorPtr> get_all_actors();
size_t get_actor_count();
+ void add_actor(kernel::actor::ActorImpl* actor) { actor_list_.push_back(*actor); }
+ void remove_actor(kernel::actor::ActorImpl* actor) { xbt::intrusive_erase(actor_list_, *actor); }
- typedef boost::intrusive::list<
- kernel::actor::ActorImpl,
- boost::intrusive::member_hook<kernel::actor::ActorImpl, boost::intrusive::list_member_hook<>,
- &kernel::actor::ActorImpl::host_actor_list_hook>>
- ActorList;
-
- // FIXME: make these private
- ActorList actor_list_;
+ // FIXME: make this private
std::vector<kernel::actor::ProcessArg*> actors_at_boot_;
};
}