X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4485d715fa3a090c1dd38def83ab8239feebecb3..58bb531bcf303874a5e1356c750423a8490617e9:/src/simix/ActorImpl.cpp diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index f81c789bd9..4fc435d496 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -148,7 +148,7 @@ void ActorImpl::exit() io->cancel(); } else { simgrid::kernel::activity::ActivityImplPtr activity = waiting_synchro; - xbt_die("Activity %s is of unknown type %s", activity->name_.c_str(), + xbt_die("Activity %s is of unknown type %s", activity->get_cname(), simgrid::xbt::demangle(typeid(activity).name()).get()); } @@ -277,11 +277,25 @@ void ActorImpl::resume() XBT_OUT(); } +smx_activity_t ActorImpl::join(smx_actor_t actor, double timeout) +{ + smx_activity_t res = this->sleep(timeout); + intrusive_ptr_add_ref(res.get()); + SIMIX_process_on_exit(actor, + [](int, void* arg) { + auto sleep = static_cast(arg); + if (sleep->surf_action_) + sleep->surf_action_->finish(simgrid::kernel::resource::Action::State::FINISHED); + intrusive_ptr_release(sleep); + }, + res.get()); + return res; +} smx_activity_t ActorImpl::sleep(double duration) { if (not host_->is_on()) throw_exception(std::make_exception_ptr(simgrid::HostFailureException( - XBT_THROW_POINT, std::string("Host ") + std::string(host_->get_cname()) + " failed, you cannot sleep there."))); + XBT_THROW_POINT, std::string("Host ") + host_->get_cname() + " failed, you cannot sleep there."))); return simgrid::kernel::activity::SleepImplPtr(new simgrid::kernel::activity::SleepImpl("sleep", host_)) ->start(duration); @@ -595,26 +609,11 @@ void simcall_HANDLER_process_join(smx_simcall_t simcall, smx_actor_t process, do SIMIX_simcall_answer(simcall); return; } - smx_activity_t sync = SIMIX_process_join(simcall->issuer, process, timeout); + smx_activity_t sync = simcall->issuer->join(process, timeout); sync->simcalls_.push_back(simcall); simcall->issuer->waiting_synchro = sync; } -smx_activity_t SIMIX_process_join(smx_actor_t issuer, smx_actor_t process, double timeout) -{ - smx_activity_t res = issuer->sleep(timeout); - intrusive_ptr_add_ref(res.get()); - SIMIX_process_on_exit(process, - [](int, void* arg) { - auto sleep = static_cast(arg); - if (sleep->surf_action_) - sleep->surf_action_->finish(simgrid::kernel::resource::Action::State::FINISHED); - intrusive_ptr_release(sleep); - }, - res.get()); - return res; -} - void simcall_HANDLER_process_sleep(smx_simcall_t simcall, double duration) { if (MC_is_active() || MC_record_replay_is_active()) { @@ -632,7 +631,7 @@ void SIMIX_process_sleep_destroy(smx_activity_t synchro) { XBT_DEBUG("Destroy sleep synchro %p", synchro.get()); simgrid::kernel::activity::SleepImplPtr sleep = - boost::dynamic_pointer_cast(synchro); + boost::static_pointer_cast(synchro); if (sleep->surf_action_) { sleep->surf_action_->unref(); @@ -731,7 +730,8 @@ smx_actor_t simcall_process_create(std::string name, simgrid::simix::ActorCode c { smx_actor_t self = SIMIX_process_self(); return simgrid::simix::simcall([name, code, data, host, properties, self] { - return simgrid::kernel::actor::ActorImpl::create(name, std::move(code), data, host, properties, self).get(); + return simgrid::kernel::actor::ActorImpl::create(std::move(name), std::move(code), data, host, properties, self) + .get(); }); }