Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Try to fix a failure about mutex freed too early in RMA
[simgrid.git] / src / kernel / activity / Synchro.cpp
index c15f155..aa57662 100644 (file)
@@ -28,8 +28,8 @@ SynchroImpl& SynchroImpl::set_timeout(double timeout)
 
 SynchroImpl* SynchroImpl::start()
 {
-  surf_action_ = host_->get_cpu()->sleep(timeout_);
-  surf_action_->set_activity(this);
+  model_action_ = host_->get_cpu()->sleep(timeout_);
+  model_action_->set_activity(this);
   return this;
 }
 
@@ -49,17 +49,6 @@ void SynchroImpl::cancel()
   /* I cannot cancel raw synchros directly. */
 }
 
-void SynchroImpl::post()
-{
-  if (surf_action_->get_state() == resource::Action::State::FAILED)
-    set_state(State::FAILED);
-  else if (surf_action_->get_state() == resource::Action::State::FINISHED)
-    set_state(State::SRC_TIMEOUT);
-
-  clean_action();
-  /* Answer all simcalls associated with the synchro */
-  finish();
-}
 void SynchroImpl::set_exception(actor::ActorImpl* issuer)
 {
   if (get_state() == State::FAILED) {
@@ -74,6 +63,13 @@ void SynchroImpl::set_exception(actor::ActorImpl* issuer)
 void SynchroImpl::finish()
 {
   XBT_DEBUG("SynchroImpl::finish() in state %s", get_state_str());
+  if (model_action_->get_state() == resource::Action::State::FAILED)
+    set_state(State::FAILED);
+  else if (model_action_->get_state() == resource::Action::State::FINISHED)
+    set_state(State::SRC_TIMEOUT);
+
+  clean_action();
+
   xbt_assert(simcalls_.size() == 1, "Unexpected number of simcalls waiting: %zu", simcalls_.size());
   actor::Simcall* simcall = simcalls_.front();
   simcalls_.pop_front();