void SIMIX_synchro_stop_waiting(smx_process_t process, smx_simcall_t simcall) { XBT_IN("(%p, %p)",process,simcall); switch (simcall->call) { case SIMCALL_MUTEX_LOCK: xbt_swag_remove(process, simcall_mutex_lock__get__mutex(simcall)->sleeping); break; case SIMCALL_COND_WAIT: xbt_swag_remove(process, simcall_cond_wait__get__cond(simcall)->sleeping); break; case SIMCALL_COND_WAIT_TIMEOUT: xbt_swag_remove(process, simcall_cond_wait_timeout__get__cond(simcall)->sleeping); break; case SIMCALL_SEM_ACQUIRE: xbt_swag_remove(process, simcall_sem_acquire__get__sem(simcall)->sleeping); break; case SIMCALL_SEM_ACQUIRE_TIMEOUT: xbt_swag_remove(process, simcall_sem_acquire_timeout__get__sem(simcall)->sleeping); break; default: THROW_IMPOSSIBLE; } XBT_OUT(); }
void RawImpl::finish() { smx_simcall_t simcall = simcalls_.front(); simcalls_.pop_front(); if (state_ == SIMIX_FAILED) { XBT_DEBUG("RawImpl::finish(): host '%s' failed", simcall->issuer->get_host()->get_cname()); simcall->issuer->context_->iwannadie = true; simcall->issuer->exception_ = std::make_exception_ptr(HostFailureException(XBT_THROW_POINT, "Host failed")); } else if (state_ != SIMIX_SRC_TIMEOUT) { xbt_die("Internal error in RawImpl::finish() unexpected synchro state %d", static_cast<int>(state_)); } switch (simcall->call) { case SIMCALL_MUTEX_LOCK: simgrid::xbt::intrusive_erase(simcall_mutex_lock__get__mutex(simcall)->sleeping_, *simcall->issuer); break; case SIMCALL_COND_WAIT: simgrid::xbt::intrusive_erase(simcall_cond_wait__get__cond(simcall)->sleeping_, *simcall->issuer); break; case SIMCALL_COND_WAIT_TIMEOUT: simgrid::xbt::intrusive_erase(simcall_cond_wait_timeout__get__cond(simcall)->sleeping_, *simcall->issuer); simcall_cond_wait_timeout__set__result(simcall, 1); // signal a timeout break; case SIMCALL_SEM_ACQUIRE: simgrid::xbt::intrusive_erase(simcall_sem_acquire__get__sem(simcall)->sleeping_, *simcall->issuer); break; case SIMCALL_SEM_ACQUIRE_TIMEOUT: simgrid::xbt::intrusive_erase(simcall_sem_acquire_timeout__get__sem(simcall)->sleeping_, *simcall->issuer); simcall_sem_acquire_timeout__set__result(simcall, 1); // signal a timeout break; default: THROW_IMPOSSIBLE; } simcall->issuer->waiting_synchro = nullptr; SIMIX_simcall_answer(simcall); }