Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
make sleep and suspend methods of ActorImpl
[simgrid.git] / src / simix / ActorImpl.cpp
index d0f4ae7..36d847f 100644 (file)
@@ -167,10 +167,59 @@ void ActorImpl::daemonize()
   }
 }
 
-/** Whether this process is daemonized */
-bool ActorImpl::isDaemon()
+smx_activity_t ActorImpl::suspend(smx_actor_t issuer)
 {
-  return daemon;
+  if (suspended) {
+    XBT_DEBUG("Process '%s' is already suspended", name.c_str());
+    return nullptr;
+  }
+
+  suspended = 1;
+
+  /* If we are suspending another process that is waiting on a sync, suspend its synchronization. */
+  if (this != issuer) {
+    if (waiting_synchro)
+      waiting_synchro->suspend();
+    /* If the other process is not waiting, its suspension is delayed to when the process is rescheduled. */
+
+    return nullptr;
+  } else {
+    return SIMIX_execution_start(this, "suspend", 0.0, 1.0, 0.0);
+  }
+}
+
+void ActorImpl::resume()
+{
+  XBT_IN("process = %p", this);
+
+  if (context->iwannadie) {
+    XBT_VERB("Ignoring request to suspend a process that is currently dying.");
+    return;
+  }
+
+  if (not suspended)
+    return;
+  suspended = 0;
+
+  /* resume the synchronization that was blocking the resumed process. */
+  if (waiting_synchro)
+    waiting_synchro->resume();
+
+  XBT_OUT();
+}
+
+smx_activity_t ActorImpl::sleep(double duration)
+{
+  if (host->isOff())
+    THROWF(host_error, 0, "Host %s failed, you cannot sleep there.", host->getCname());
+
+  simgrid::kernel::activity::SleepImpl* synchro = new simgrid::kernel::activity::SleepImpl();
+  synchro->host                                 = host;
+  synchro->surf_sleep                           = host->pimpl_cpu->sleep(duration);
+  synchro->surf_sleep->setData(synchro);
+  XBT_DEBUG("Create sleep synchronization %p", synchro);
+
+  return synchro;
 }
 
 void create_maestro(std::function<void()> code)
@@ -217,10 +266,10 @@ smx_actor_t SIMIX_process_create(const char* name, std::function<void()> code, v
                                  xbt_dict_t properties, smx_actor_t parent_process)
 {
 
-  XBT_DEBUG("Start process %s on host '%s'", name, host->cname());
+  XBT_DEBUG("Start process %s on host '%s'", name, host->getCname());
 
   if (host->isOff()) {
-    XBT_WARN("Cannot launch process '%s' on failed host '%s'", name, host->cname());
+    XBT_WARN("Cannot launch process '%s' on failed host '%s'", name, host->getCname());
     return nullptr;
   }
 
@@ -240,9 +289,9 @@ smx_actor_t SIMIX_process_create(const char* name, std::function<void()> code, v
 #if HAVE_SMPI
     if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) {
       if (parent_process->pid != 0) {
-        SIMIX_segment_index_set(process, parent_process->segment_index);
+        process->segment_index = parent_process->segment_index;
       } else {
-        SIMIX_segment_index_set(process, process->pid - 1);
+        process->segment_index = process->pid - 1;
       }
     }
 #endif
@@ -267,7 +316,7 @@ smx_actor_t SIMIX_process_create(const char* name, std::function<void()> code, v
 
   /* Now insert it in the global process list and in the process to run list */
   simix_global->process_list[process->pid] = process;
-  XBT_DEBUG("Inserting %s(%s) in the to_run list", process->cname(), host->cname());
+  XBT_DEBUG("Inserting %s(%s) in the to_run list", process->cname(), host->getCname());
   xbt_dynar_push_as(simix_global->process_to_run, smx_actor_t, process);
   intrusive_ptr_add_ref(process);
 
@@ -306,9 +355,9 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn
 #if HAVE_SMPI
     if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) {
       if (parent_process->pid != 0) {
-        SIMIX_segment_index_set(process, parent_process->segment_index);
+        process->segment_index = parent_process->segment_index;
       } else {
-        SIMIX_segment_index_set(process, process->pid - 1);
+        process->segment_index = process->pid - 1;
       }
     }
 #endif
@@ -331,7 +380,7 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn
 
   /* Now insert it in the global process list and in the process to run list */
   simix_global->process_list[process->pid] = process;
-  XBT_DEBUG("Inserting %s(%s) in the to_run list", process->cname(), host->cname());
+  XBT_DEBUG("Inserting %s(%s) in the to_run list", process->cname(), host->getCname());
   xbt_dynar_push_as(simix_global->process_to_run, smx_actor_t, process);
 
   /* Tracing the process creation */
@@ -396,7 +445,7 @@ void simcall_HANDLER_process_kill(smx_simcall_t simcall, smx_actor_t process) {
  */
 void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) {
 
-  XBT_DEBUG("Killing process %s@%s", process->cname(), process->host->cname());
+  XBT_DEBUG("Killing process %s@%s", process->cname(), process->host->getCname());
 
   process->context->iwannadie = 1;
   process->blocked = 0;
@@ -464,7 +513,7 @@ void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const
   SMX_EXCEPTION(process, cat, value, msg);
 
   if (process->suspended)
-    SIMIX_process_resume(process);
+    process->resume();
 
   /* cancel the blocking synchro if any */
   if (process->waiting_synchro) {
@@ -529,11 +578,6 @@ void SIMIX_process_killall(smx_actor_t issuer, int reset_pid)
   SIMIX_process_empty_trash();
 }
 
-void simcall_HANDLER_process_set_host(smx_simcall_t simcall, smx_actor_t process, sg_host_t dest)
-{
-  process->new_host = dest;
-}
-
 void SIMIX_process_change_host(smx_actor_t process, sg_host_t dest)
 {
   xbt_assert((process != nullptr), "Invalid parameters");
@@ -542,10 +586,9 @@ void SIMIX_process_change_host(smx_actor_t process, sg_host_t dest)
   xbt_swag_insert(process, dest->extension<simgrid::simix::Host>()->process_list);
 }
 
-
 void simcall_HANDLER_process_suspend(smx_simcall_t simcall, smx_actor_t process)
 {
-  smx_activity_t sync_suspend = SIMIX_process_suspend(process, simcall->issuer);
+  smx_activity_t sync_suspend = process->suspend(simcall->issuer);
 
   if (process != simcall->issuer) {
     SIMIX_simcall_answer(simcall);
@@ -557,48 +600,6 @@ void simcall_HANDLER_process_suspend(smx_simcall_t simcall, smx_actor_t process)
   /* If we are suspending ourselves, then just do not finish the simcall now */
 }
 
-smx_activity_t SIMIX_process_suspend(smx_actor_t process, smx_actor_t issuer)
-{
-  if (process->suspended) {
-    XBT_DEBUG("Process '%s' is already suspended", process->name.c_str());
-    return nullptr;
-  }
-
-  process->suspended = 1;
-
-  /* If we are suspending another process that is waiting on a sync, suspend its synchronization. */
-  if (process != issuer) {
-
-    if (process->waiting_synchro)
-      process->waiting_synchro->suspend();
-    /* If the other process is not waiting, its suspension is delayed to when the process is rescheduled. */
-
-    return nullptr;
-  } else {
-    return SIMIX_execution_start(process, "suspend", 0.0, 1.0, 0.0);
-  }
-}
-
-void SIMIX_process_resume(smx_actor_t process)
-{
-  XBT_IN("process = %p", process);
-
-  if (process->context->iwannadie) {
-    XBT_VERB("Ignoring request to suspend a process that is currently dying.");
-    return;
-  }
-
-  if (not process->suspended)
-    return;
-  process->suspended = 0;
-
-  /* resume the synchronization that was blocking the resumed process. */
-  if (process->waiting_synchro)
-    process->waiting_synchro->resume();
-
-  XBT_OUT();
-}
-
 int SIMIX_process_get_maxpid() {
   return simix_process_maxpid;
 }
@@ -608,14 +609,6 @@ int SIMIX_process_count()
   return simix_global->process_list.size();
 }
 
-int SIMIX_process_get_PID(smx_actor_t self)
-{
-  if (self == nullptr)
-    return 0;
-  else
-    return self->pid;
-}
-
 void* SIMIX_process_self_get_data()
 {
   smx_actor_t self = SIMIX_process_self();
@@ -657,16 +650,6 @@ smx_actor_t SIMIX_process_get_by_name(const char* name)
   return nullptr;
 }
 
-int SIMIX_process_is_suspended(smx_actor_t process)
-{
-  return process->suspended;
-}
-
-xbt_dict_t SIMIX_process_get_properties(smx_actor_t process)
-{
-  return process->properties;
-}
-
 void simcall_HANDLER_process_join(smx_simcall_t simcall, smx_actor_t process, double timeout)
 {
   if (process->finished) {
@@ -709,7 +692,7 @@ static int SIMIX_process_join_finish(smx_process_exit_status_t status, void* syn
 
 smx_activity_t SIMIX_process_join(smx_actor_t issuer, smx_actor_t process, double timeout)
 {
-  smx_activity_t res = SIMIX_process_sleep(issuer, timeout);
+  smx_activity_t res = issuer->sleep(timeout);
   intrusive_ptr_add_ref(res.get());
   /* We are leaking the process here, but if we don't take the ref, we get a "use after free".
    * The correct solution would be to derivate the type SynchroSleep into a SynchroProcessJoin,
@@ -729,27 +712,11 @@ void simcall_HANDLER_process_sleep(smx_simcall_t simcall, double duration)
     SIMIX_simcall_answer(simcall);
     return;
   }
-  smx_activity_t sync = SIMIX_process_sleep(simcall->issuer, duration);
+  smx_activity_t sync = simcall->issuer->sleep(duration);
   sync->simcalls.push_back(simcall);
   simcall->issuer->waiting_synchro = sync;
 }
 
-smx_activity_t SIMIX_process_sleep(smx_actor_t process, double duration)
-{
-  sg_host_t host = process->host;
-
-  if (host->isOff())
-    THROWF(host_error, 0, "Host %s failed, you cannot sleep there.", host->cname());
-
-  simgrid::kernel::activity::SleepImpl* synchro = new simgrid::kernel::activity::SleepImpl();
-  synchro->host = host;
-  synchro->surf_sleep                           = host->pimpl_cpu->sleep(duration);
-  synchro->surf_sleep->setData(synchro);
-  XBT_DEBUG("Create sleep synchronization %p", synchro);
-
-  return synchro;
-}
-
 void SIMIX_process_sleep_destroy(smx_activity_t synchro)
 {
   XBT_DEBUG("Destroy sleep synchro %p", synchro.get());
@@ -798,7 +765,7 @@ void SIMIX_process_yield(smx_actor_t self)
                                           self->properties,
                                           self->auto_restart);
     }
-    XBT_DEBUG("Process %s@%s is dead", self->cname(), self->host->cname());
+    XBT_DEBUG("Process %s@%s is dead", self->cname(), self->host->getCname());
     self->context->stop();
   }
 
@@ -806,7 +773,7 @@ void SIMIX_process_yield(smx_actor_t self)
     XBT_DEBUG("Hey! I'm suspended.");
     xbt_assert(self->exception != nullptr, "Gasp! This exception may be lost by subsequent calls.");
     self->suspended = 0;
-    SIMIX_process_suspend(self, self);
+    self->suspend(self);
   }
 
   if (self->exception != nullptr) {
@@ -828,14 +795,6 @@ void SIMIX_process_exception_terminate(xbt_ex_t * e)
   xbt_abort();
 }
 
-smx_context_t SIMIX_process_get_context(smx_actor_t p) {
-  return p->context;
-}
-
-void SIMIX_process_set_context(smx_actor_t p,smx_context_t c) {
-  p->context = c;
-}
-
 /**
  * \brief Returns the list of processes to run.
  */
@@ -895,7 +854,7 @@ smx_actor_t simcall_HANDLER_process_restart(smx_simcall_t simcall, smx_actor_t p
 }
 /** @brief Restart a process, starting it again from the beginning. */
 smx_actor_t SIMIX_process_restart(smx_actor_t process, smx_actor_t issuer) {
-  XBT_DEBUG("Restarting process %s on %s", process->cname(), process->host->cname());
+  XBT_DEBUG("Restarting process %s on %s", process->cname(), process->host->getCname());
 
   //retrieve the arguments of the old process
   //FIXME: Factorize this with SIMIX_host_add_auto_restart_process ?
@@ -922,10 +881,6 @@ smx_actor_t SIMIX_process_restart(smx_actor_t process, smx_actor_t issuer) {
   return actor;
 }
 
-void SIMIX_segment_index_set(smx_actor_t proc, int index){
-  proc->segment_index = index;
-}
-
 /**
  * \ingroup simix_process_management
  * \brief Creates and runs a new SIMIX process.