X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2685dbb427cbe90685e23c1000d8b6670bb91750..f063625862eb4dfe006653ce98a4291fb4c1810e:/src/kernel/actor/ActorImpl.cpp diff --git a/src/kernel/actor/ActorImpl.cpp b/src/kernel/actor/ActorImpl.cpp index c943038964..0d4521318d 100644 --- a/src/kernel/actor/ActorImpl.cpp +++ b/src/kernel/actor/ActorImpl.cpp @@ -356,27 +356,24 @@ s4u::Actor* ActorImpl::restart() return actor->ciface(); } -activity::ActivityImplPtr ActorImpl::suspend(ActorImpl* issuer) +void ActorImpl::suspend(ActorImpl* issuer) { if (suspended_) { XBT_DEBUG("Actor '%s' is already suspended", get_cname()); - return nullptr; + return; } suspended_ = true; - /* If we are suspending another actor that is waiting on a sync, suspend its synchronization. */ - if (this != issuer) { - if (waiting_synchro) - waiting_synchro->suspend(); - /* If the other actor is not waiting, its suspension is delayed to when the actor is rescheduled. */ - - return nullptr; - } else { + /* If the suspended actor is waiting on a sync, suspend its synchronization. */ + if (waiting_synchro == nullptr) { activity::ExecImpl* exec = new activity::ExecImpl(); - (*exec).set_name("suspend").set_host(host_).set_flops_amount(0.0).start(); - return activity::ExecImplPtr(exec); + exec->set_name("suspend").set_host(host_).set_flops_amount(0.0).start(); + waiting_synchro = activity::ExecImplPtr(exec); + + waiting_synchro->simcalls_.push_back(&simcall); } + waiting_synchro->suspend(); } void ActorImpl::resume() @@ -440,6 +437,20 @@ void ActorImpl::throw_exception(std::exception_ptr e) } } +void ActorImpl::simcall_answer() +{ + if (this != simix_global->maestro_process){ + XBT_DEBUG("Answer simcall %s (%d) issued by %s (%p)", SIMIX_simcall_name(simcall.call), (int)simcall.call, + get_cname(), this); + simcall.call = SIMCALL_NONE; + xbt_assert(not XBT_LOG_ISENABLED(simix_process, xbt_log_priority_debug) || + std::find(begin(simix_global->actors_to_run), end(simix_global->actors_to_run), this) == + end(simix_global->actors_to_run), + "Actor %p should not exist in actors_to_run!", this); + simix_global->actors_to_run.push_back(this); + } +} + void ActorImpl::set_host(s4u::Host* dest) { xbt::intrusive_erase(host_->pimpl_->process_list_, *this); @@ -540,20 +551,6 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn return simgrid::kernel::actor::ActorImpl::attach(name, data, sg_host_by_name(hostname), properties).get(); } -void simcall_HANDLER_process_suspend(smx_simcall_t simcall, smx_actor_t actor) -{ - smx_activity_t sync_suspend = actor->suspend(simcall->issuer); - - if (actor != simcall->issuer) { - SIMIX_simcall_answer(simcall); - } else { - sync_suspend->simcalls_.push_back(simcall); - actor->waiting_synchro = sync_suspend; - actor->waiting_synchro->suspend(); - } - /* If we are suspending ourselves, then just do not finish the simcall now */ -} - int SIMIX_process_count() { return simix_global->process_list.size(); @@ -586,32 +583,6 @@ const char* SIMIX_process_self_get_name() return process->get_cname(); } -void simcall_HANDLER_process_join(smx_simcall_t simcall, smx_actor_t process, double timeout) -{ - if (process->finished_) { - // The joined process is already finished, just wake up the issuer process right away - simcall_process_sleep__set__result(simcall, SIMIX_DONE); - SIMIX_simcall_answer(simcall); - return; - } - smx_activity_t sync = simcall->issuer->join(process, timeout); - sync->simcalls_.push_back(simcall); - simcall->issuer->waiting_synchro = sync; -} - -void simcall_HANDLER_process_sleep(smx_simcall_t simcall, double duration) -{ - if (MC_is_active() || MC_record_replay_is_active()) { - MC_process_clock_add(simcall->issuer, duration); - simcall_process_sleep__set__result(simcall, SIMIX_DONE); - SIMIX_simcall_answer(simcall); - return; - } - smx_activity_t sync = simcall->issuer->sleep(duration); - sync->simcalls_.push_back(simcall); - simcall->issuer->waiting_synchro = sync; -} - /** * @brief Calling this function makes the process to yield. *