Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
The VirtualMachineImpl is stored in VirtualMachine->pimpl_vm_, not in Host->pimpl_
[simgrid.git] / src / msg / msg_vm.cpp
index c3c29d8..b91f255 100644 (file)
@@ -182,25 +182,14 @@ void MSG_vm_destroy(msg_vm_t vm)
 
   /* Then, destroy the VM object */
   simgrid::simix::kernelImmediate([vm]() {
-    /* this code basically performs a similar thing like SIMIX_host_destroy() */
-    XBT_DEBUG("destroy %s", vm->name().c_str());
-
-    /* FIXME: this is really strange that everything fails if the next line is removed.
-     * This is as if we shared these data with the PM, which definitely should not be the case...
-     *
-     * We need to test that suspending a VM does not suspends the processes running on its PM, for example.
-     * Or we need to simplify this code enough to make it actually readable (but this sounds harder than testing)
-     */
-    vm->extension_set<simgrid::simix::Host>(nullptr);
-
-    /* Don't free these things twice: they are the ones of my physical host */
-    vm->pimpl_cpu     = nullptr;
-    vm->pimpl_netcard = nullptr;
-
     vm->destroy();
   });
 
-  TRACE_msg_vm_end(vm);
+  if (TRACE_msg_vm_is_enabled()) {
+    container_t container = PJ_container_get(vm->name().c_str());
+    PJ_container_remove_from_parent(container);
+    PJ_container_free(container);
+  }
 }
 
 /** @brief Start a vm (i.e., boot the guest operating system)
@@ -212,7 +201,12 @@ void MSG_vm_start(msg_vm_t vm)
 {
   simcall_vm_start(vm);
 
-  TRACE_msg_vm_start(vm);
+  if (TRACE_msg_vm_is_enabled()) {
+    container_t vm_container = PJ_container_get(vm->name().c_str());
+    type_t type              = PJ_type_get("MSG_VM_STATE", vm_container->type);
+    val_t value              = PJ_value_get_or_new("start", "0 0 1", type); // start is blue
+    new_pajePushState(MSG_get_clock(), vm_container, type, value);
+  }
 }
 
 /** @brief Immediately kills all processes within the given VM. Any memory that they allocated will be leaked.
@@ -223,11 +217,9 @@ void MSG_vm_start(msg_vm_t vm)
  */
 void MSG_vm_shutdown(msg_vm_t vm)
 {
-  /* msg_vm_t equals to msg_host_t */
   simcall_vm_shutdown(vm);
   MSG_process_sleep(0.); // Make sure that the processes in the VM are killed in this scheduling round before processing
                          // (eg with the VM destroy)
-  // TRACE_msg_vm_(vm);
 }
 
 /* We have two mailboxes. mbox is used to transfer migration data between source and destination PMs. mbox_ctl is used
@@ -353,7 +345,30 @@ static int migration_rx_fun(int argc, char *argv[])
    vm->pimpl_vm_->isMigrating = false;
    XBT_DEBUG("VM(%s) moved from PM(%s) to PM(%s)", sg_host_get_name(ms->vm), sg_host_get_name(ms->src_pm),
              sg_host_get_name(ms->dst_pm));
-   TRACE_msg_vm_change_host(ms->vm, ms->src_pm, ms->dst_pm);
+
+   if (TRACE_msg_vm_is_enabled()) {
+     static long long int counter = 0;
+     char key[INSTR_DEFAULT_STR_SIZE];
+     snprintf(key, INSTR_DEFAULT_STR_SIZE, "%lld", counter++);
+
+     // start link
+     container_t msg = PJ_container_get(vm->name().c_str());
+     type_t type     = PJ_type_get("MSG_VM_LINK", PJ_type_get_root());
+     new_pajeStartLink(MSG_get_clock(), PJ_container_get_root(), type, msg, "M", key);
+
+     // destroy existing container of this vm
+     container_t existing_container = PJ_container_get(vm->name().c_str());
+     PJ_container_remove_from_parent(existing_container);
+     PJ_container_free(existing_container);
+
+     // create new container on the new_host location
+     PJ_container_new(vm->name().c_str(), INSTR_MSG_VM, PJ_container_get(sg_host_get_name(ms->dst_pm)));
+
+     // end link
+     msg  = PJ_container_get(vm->name().c_str());
+     type = PJ_type_get("MSG_VM_LINK", PJ_type_get_root());
+     new_pajeEndLink(MSG_get_clock(), PJ_container_get_root(), type, msg, "M", key);
+   }
   }
   // Inform the SRC that the migration has been correctly performed
   {
@@ -381,7 +396,7 @@ static int migration_rx_fun(int argc, char *argv[])
 
 static void reset_dirty_pages(msg_vm_t vm)
 {
-  simgrid::surf::VirtualMachineImpl* pimpl = static_cast<simgrid::surf::VirtualMachineImpl*>(vm->pimpl_);
+  simgrid::surf::VirtualMachineImpl* pimpl = static_cast<simgrid::s4u::VirtualMachine*>(vm)->pimpl_vm_;
 
   char *key = nullptr;
   xbt_dict_cursor_t cursor = nullptr;
@@ -458,7 +473,7 @@ void MSG_host_add_task(msg_host_t host, msg_task_t task)
   simgrid::s4u::VirtualMachine* vm = dynamic_cast<simgrid::s4u::VirtualMachine*>(host);
   if (vm == nullptr)
     return;
-  simgrid::surf::VirtualMachineImpl* pimpl = static_cast<simgrid::surf::VirtualMachineImpl*>(vm->pimpl_);
+  simgrid::surf::VirtualMachineImpl* pimpl = static_cast<simgrid::s4u::VirtualMachine*>(vm)->pimpl_vm_;
 
   double remaining = MSG_task_get_flops_amount(task);
   char *key = bprintf("%s-%p", task->name, task);
@@ -483,7 +498,7 @@ void MSG_host_del_task(msg_host_t host, msg_task_t task)
   simgrid::s4u::VirtualMachine* vm = dynamic_cast<simgrid::s4u::VirtualMachine*>(host);
   if (vm == nullptr)
     return;
-  simgrid::surf::VirtualMachineImpl* pimpl = static_cast<simgrid::surf::VirtualMachineImpl*>(vm->pimpl_);
+  simgrid::surf::VirtualMachineImpl* pimpl = static_cast<simgrid::s4u::VirtualMachine*>(vm)->pimpl_vm_;
 
   char *key = bprintf("%s-%p", task->name, task);
   dirty_page_t dp = (dirty_page_t)(pimpl->dp_objs ? xbt_dict_get_or_null(pimpl->dp_objs, key) : NULL);
@@ -870,7 +885,7 @@ void MSG_vm_migrate(msg_vm_t vm, msg_host_t new_pm)
   if (MSG_vm_is_migrating(vm))
     THROWF(vm_error, 0, "VM(%s) is already migrating", sg_host_get_name(vm));
 
-  simgrid::surf::VirtualMachineImpl* pimpl = static_cast<simgrid::surf::VirtualMachineImpl*>(vm->pimpl_);
+  simgrid::surf::VirtualMachineImpl* pimpl = static_cast<simgrid::s4u::VirtualMachine*>(vm)->pimpl_vm_;
   pimpl->isMigrating                       = 1;
 
   {
@@ -908,7 +923,12 @@ void MSG_vm_suspend(msg_vm_t vm)
 
   XBT_DEBUG("vm_suspend done");
 
-  TRACE_msg_vm_suspend(vm);
+  if (TRACE_msg_vm_is_enabled()) {
+    container_t vm_container = PJ_container_get(vm->name().c_str());
+    type_t type              = PJ_type_get("MSG_VM_STATE", vm_container->type);
+    val_t value              = PJ_value_get_or_new("suspend", "1 0 0", type); // suspend is red
+    new_pajePushState(MSG_get_clock(), vm_container, type, value);
+  }
 }
 
 /** @brief Resume the execution of the VM. All processes on the VM run again.
@@ -920,7 +940,11 @@ void MSG_vm_resume(msg_vm_t vm)
 {
   simcall_vm_resume(vm);
 
-  TRACE_msg_vm_resume(vm);
+  if (TRACE_msg_vm_is_enabled()) {
+    container_t vm_container = PJ_container_get(vm->name().c_str());
+    type_t type              = PJ_type_get("MSG_VM_STATE", vm_container->type);
+    new_pajePopState(MSG_get_clock(), vm_container, type);
+  }
 }
 
 
@@ -939,7 +963,13 @@ void MSG_vm_save(msg_vm_t vm)
     THROWF(vm_error, 0, "VM(%s) is migrating", sg_host_get_name(vm));
 
   simcall_vm_save(vm);
-  TRACE_msg_vm_save(vm);
+
+  if (TRACE_msg_vm_is_enabled()) {
+    container_t vm_container = PJ_container_get(vm->name().c_str());
+    type_t type              = PJ_type_get("MSG_VM_STATE", vm_container->type);
+    val_t value              = PJ_value_get_or_new("save", "0 1 0", type); // save is green
+    new_pajePushState(MSG_get_clock(), vm_container, type, value);
+  }
 }
 
 /** @brief Restore the execution of the VM. All processes on the VM run again.
@@ -952,7 +982,11 @@ void MSG_vm_restore(msg_vm_t vm)
 {
   simcall_vm_restore(vm);
 
-  TRACE_msg_vm_restore(vm);
+  if (TRACE_msg_vm_is_enabled()) {
+    container_t vm_container = PJ_container_get(vm->name().c_str());
+    type_t type              = PJ_type_get("MSG_VM_STATE", vm_container->type);
+    new_pajePopState(MSG_get_clock(), vm_container, type);
+  }
 }
 
 /** @brief Get the physical host of a given VM.