typedef struct surf_vm_workstation_model_extension_public {
s_surf_model_extension_workstation_t basic;
void* (*create) (const char *name, void *workstation); // First operation of the VM model
+ void (*destroy) (const char *name); // destory the vm-specific data
} s_surf_model_extension_vm_workstation_t;
/** \ingroup SURF_models
*
* \param h the host to destroy (a smx_host_t)
*/
-void SIMIX_host_destroy(void *h)
+void SIMIX_vm_host_destroy(void *h)
{
smx_host_priv_t host = (smx_host_priv_t) h;
+ smx_host_t
+ xbt_lib_(host_lib,name,SIMIX_HOST_LEVEL,smx_host);
+
+ /* jump to vm_ws_destroy() */
+ surf_vm_workstation_model->extension.vm_workstation.destroy(name);
+
xbt_assert((host != NULL), "Invalid parameters");
/* Clean Simulator data */
workstation->physical_workstation = phys_workstation;
xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, workstation);
+
+}
+
+/*
+ * A physical host does not disapper in the current SimGrid code, but a VM may
+ * disapper during a simulation.
+ */
+static void vm_ws_destroy(const char *name)
+{
+ workstation_VM2013_t workstation = xbt_lib_get_or_null(host_lib, name, SURF_WKS_LEVEL);
+ xbt_assert(workstation);
+ xbt_assert(workstation->generic_resource.model == surf_vm_workstation_model);
+
+ xbt_free(workstation->generic_resource.name);
+
+ /* not defined yet, but we should have */
+ // xbt_lib_unset(host_lib, name, SURF_WKS_LEVEL);
+
+ xbt_free(workstation);
}
static int ws_resource_used(void *resource_id)
surf_vm_workstation_model->extension.workstation.unlink = ws_action_unlink;
surf_vm_workstation_model->extension.workstation.ls = ws_action_ls;
surf_vm_workstation_model->extension.vm_workstation.create = vm_ws_create;
+ surf_vm_workstation_model->extension.vm_workstation.destroy = vm_ws_destroy;
}