X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/37baaf70ee95c42a6f4b80913db243c199230fb9..aab40b3fc85c15a347487954ae41ea2da113f32f:/src/msg/msg_vm.c diff --git a/src/msg/msg_vm.c b/src/msg/msg_vm.c index b31536f187..fc9edcb15e 100644 --- a/src/msg/msg_vm.c +++ b/src/msg/msg_vm.c @@ -10,28 +10,83 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_vm, msg, "Cloud-oriented parts of the MSG API"); -/** @brief Create a new (empty) VMs +/** @brief Create a new VM (the VM is just attached to the location but it is not started yet). * @ingroup msg_VMs + */ + +msg_vm_t MSG_vm_create(msg_host_t location, const char *name, + int core_nb, int mem_cap, int net_cap){ + + // Note new and vm_workstation refer to the same area (due to the lib/dict appraoch) + msg_vm_t new = NULL; + void *vm_workstation = NULL; + // Ask simix to create the surf vm resource + vm_workstation = simcall_vm_create(name,location); + new = (msg_vm_t) __MSG_host_create(vm_workstation); + + + MSG_vm_set_property_value(new, "CORE_NB", bprintf("%d", core_nb)), NULL); + MSG_vm_set_property_value(new, "MEM_CAP", bprintf("%d", core_nb)), NULL); + MSG_vm_set_property_value(new, "NET_CAP", bprintf("%d", core_nb)), NULL); + + #ifdef HAVE_TRACING + TRACE_msg_vm_create(name, location); + #endif + return new; +} + +/** \ingroup m_host_management + * \brief Returns the value of a given host property * - * @bug it is expected that in the future, the coreAmount parameter will be used - * to add extra constraints on the execution, but the argument is ignored for now. + * \param host a host + * \param name a property name + * \return value of a property (or NULL if property not set) */ +const char *MSG_host_get_property_value(msg_host_t host, const char *name) +{ + return xbt_dict_get_or_null(MSG_host_get_properties(host), name); +} -msg_vm_t MSG_vm_start(m_host_t location, int coreAmount) { - msg_vm_t res = xbt_new0(s_msg_vm_t,1); - res->all_vms_hookup.prev = NULL; - res->host_vms_hookup.prev = NULL; - res->state = msg_vm_state_running; - res->location = location; - res->coreAmount = coreAmount; - res->processes = xbt_dynar_new(sizeof(m_process_t),NULL); +/** \ingroup m_host_management + * \brief Returns a xbt_dict_t consisting of the list of properties assigned to this host + * + * \param host a host + * \return a dict containing the properties + */ +xbt_dict_t MSG_host_get_properties(msg_host_t host) +{ + xbt_assert((host != NULL), "Invalid parameters (host is NULL)"); - xbt_swag_insert(res,msg_global->vms); - xbt_swag_insert(res,location->vms); + return (simcall_host_get_properties(host)); +} - return res; +/** \ingroup m_host_management + * \brief Change the value of a given host property + * + * \param host a host + * \param name a property name + * \param value what to change the property to + * \param free_ctn the freeing function to use to kill the value on need + */ +void MSG_vm_set_property_value(msg_vm_t vm, const char *name, void *value,void_f_pvoid_t free_ctn) { + + xbt_dict_set(MSG_host_get_properties(vm), name, value,free_ctn); } -/** @brief Returns a newly constructed dynar containing all existing VMs in the system + +/** @brief Immediately suspend the execution of all processes within the given VM. + * @ingroup msg_VMs + * return wheter the VM has been correctly started (0) or not (<0) + * + */ +int MSG_vm_start(msg_vm_t vm) { + // TODO Please complete the code + + #ifdef HAVE_TRACING + TRACE_msg_vm_start(vm); + #endif +} + +/** @brief Returns a newly constructed dynar containing all existing VMs in the system. * @ingroup msg_VMs * * Don't forget to free the dynar after use. @@ -62,41 +117,60 @@ int MSG_vm_is_running(msg_vm_t vm) { * * Afterward, when the VM is migrated or suspended or whatever, the process will have the corresponding handling, too. * - * @bug for now, if a binded process terminates, every VM functions will segfault. Baaaad. */ -void MSG_vm_bind(msg_vm_t vm, m_process_t process) { - xbt_dynar_push_as(vm->processes,m_process_t,process); +void MSG_vm_bind(msg_vm_t vm, msg_process_t process) { + /* check if the process is already in a VM */ + simdata_process_t simdata = simcall_process_get_data(process); + if (simdata->vm) { + msg_vm_t old_vm = simdata->vm; + int pos = xbt_dynar_search(old_vm->processes,&process); + xbt_dynar_remove_at(old_vm->processes,pos, NULL); + } + /* check if the host is in the right host */ + if (simdata->m_host != vm->location) { + MSG_process_migrate(process,vm->location); + } + simdata->vm = vm; + + XBT_DEBUG("binding Process %s to %p",MSG_process_get_name(process),vm); + + xbt_dynar_push_as(vm->processes,msg_process_t,process); } /** @brief Removes the given process from the given VM, and kill it * @ingroup msg_VMs * * Will raise a not_found exception if the process were not binded to that VM */ -void MSG_vm_unbind(msg_vm_t vm, m_process_t process) { +void MSG_vm_unbind(msg_vm_t vm, msg_process_t process) { int pos = xbt_dynar_search(vm->processes,process); xbt_dynar_remove_at(vm->processes,pos, NULL); MSG_process_kill(process); } -/** @brief Immediately change the host on which all processes are running +/** @brief Immediately change the host on which all processes are running. * @ingroup msg_VMs * * No migration cost occurs. If you want to simulate this too, you want to use a * MSG_task_send() before or after, depending on whether you want to do cold or hot * migration. */ -void MSG_vm_migrate(msg_vm_t vm, m_host_t destination) { +void MSG_vm_migrate(msg_vm_t vm, msg_host_t destination) { unsigned int cpt; - m_process_t process; + msg_process_t process; xbt_dynar_foreach(vm->processes,cpt,process) { MSG_process_migrate(process,destination); } - xbt_swag_remove(vm,vm->location->vms); - xbt_swag_insert_at_tail(vm,destination->vms); + xbt_swag_remove(vm, MSG_host_priv(vm->location)->vms); + xbt_swag_insert_at_tail(vm, MSG_host_priv(destination)->vms); + + #ifdef HAVE_TRACING + TRACE_msg_vm_change_host(vm,vm->location,destination); + #endif + vm->location = destination; } -/** @brief Immediately suspend the execution of all processes within the given VM +/** @brief Immediately suspend the execution of all processes within the given VM. * @ingroup msg_VMs * * No suspension cost occurs. If you want to simulate this too, you want to @@ -105,14 +179,18 @@ void MSG_vm_migrate(msg_vm_t vm, m_host_t destination) { */ void MSG_vm_suspend(msg_vm_t vm) { unsigned int cpt; - m_process_t process; + msg_process_t process; xbt_dynar_foreach(vm->processes,cpt,process) { - XBT_INFO("suspend process %s of host %s",MSG_process_get_name(process),MSG_host_get_name(MSG_process_get_host(process))); + XBT_DEBUG("suspend process %s of host %s",MSG_process_get_name(process),MSG_host_get_name(MSG_process_get_host(process))); MSG_process_suspend(process); } + + #ifdef HAVE_TRACING + TRACE_msg_vm_suspend(vm); + #endif } -/** @brief Immediately resumes the execution of all processes within the given VM +/** @brief Immediately resumes the execution of all processes within the given VM. * @ingroup msg_VMs * * No resume cost occurs. If you want to simulate this too, you want to @@ -121,11 +199,15 @@ void MSG_vm_suspend(msg_vm_t vm) { */ void MSG_vm_resume(msg_vm_t vm) { unsigned int cpt; - m_process_t process; + msg_process_t process; xbt_dynar_foreach(vm->processes,cpt,process) { - XBT_INFO("resume process %s of host %s",MSG_process_get_name(process),MSG_host_get_name(MSG_process_get_host(process))); + XBT_DEBUG("resume process %s of host %s",MSG_process_get_name(process),MSG_host_get_name(MSG_process_get_host(process))); MSG_process_resume(process); } + + #ifdef HAVE_TRACING + TRACE_msg_vm_resume(vm); + #endif } /** @brief Immediately kills all processes within the given VM. Any memory that they allocated will be leaked. @@ -134,10 +216,60 @@ void MSG_vm_resume(msg_vm_t vm) { * No extra delay occurs. If you want to simulate this too, you want to * use a #MSG_process_sleep() or something. I'm not quite sure. */ -void MSG_vm_shutdown(msg_vm_t vm) { +void MSG_vm_shutdown(msg_vm_t vm) +{ + msg_process_t process; + XBT_DEBUG("%lu processes in the VM", xbt_dynar_length(vm->processes)); + while (xbt_dynar_length(vm->processes) > 0) { + process = xbt_dynar_get_as(vm->processes,0,msg_process_t); + MSG_process_kill(process); + } + + #ifdef HAVE_TRACING + TRACE_msg_vm_kill(vm); + #endif + +} +/** + * \ingroup msg_VMs + * \brief Reboot the VM, restarting all the processes in it. + */ +void MSG_vm_reboot(msg_vm_t vm) +{ + xbt_dynar_t new_processes = xbt_dynar_new(sizeof(msg_process_t),NULL); + + msg_process_t process; unsigned int cpt; - m_process_t process; + xbt_dynar_foreach(vm->processes,cpt,process) { - MSG_process_kill(process); + msg_process_t new_process = MSG_process_restart(process); + xbt_dynar_push_as(new_processes,msg_process_t,new_process); + + } + + xbt_dynar_foreach(new_processes, cpt, process) { + MSG_vm_bind(vm,process); } + + xbt_dynar_free(&new_processes); +} +/** @brief Destroy a msg_vm_t. + * @ingroup msg_VMs + */ +void MSG_vm_destroy(msg_vm_t vm) { + unsigned int cpt; + msg_process_t process; + xbt_dynar_foreach(vm->processes,cpt,process) { + //FIXME: Slow ? + simdata_process_t simdata = simcall_process_get_data(process); + simdata->vm = NULL; + } + + #ifdef HAVE_TRACING + TRACE_msg_vm_end(vm); + #endif + + + xbt_dynar_free(&vm->processes); + xbt_free(vm); }