From 61c7bb767e33a727603bd55ff94222e895b10c15 Mon Sep 17 00:00:00 2001 From: alebre Date: Thu, 31 Jan 2013 21:56:07 +0100 Subject: [PATCH] Still fixing bugs - Adrien --- buildtools/Cmake/DefinePackages.cmake | 2 + include/msg/datatypes.h | 2 +- include/msg/msg.h | 2 +- src/msg/instr_msg_vm.c | 3 +- src/msg/msg_global.c | 4 +- src/msg/msg_private.h | 2 - src/msg/msg_process.c | 6 - src/msg/msg_vm.c | 329 +++++++++--------- src/simix/smx_vm.c | 467 +------------------------- src/surf/vm_workstation.c | 15 +- 10 files changed, 179 insertions(+), 653 deletions(-) diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index 94c715b4d4..934116cac0 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -215,6 +215,7 @@ set(SURF_SRC src/surf/trace_mgr.c src/surf/workstation.c src/surf/workstation_ptask_L07.c + src/surf/vm_workstation.c src/xbt/xbt_sg_stubs.c ) @@ -232,6 +233,7 @@ set(SIMIX_SRC src/simix/smx_smurf.c src/simix/smx_synchro.c src/simix/smx_user.c + src/simix/smx_vm.c ) set(SIMGRID_SRC diff --git a/include/msg/datatypes.h b/include/msg/datatypes.h index dfb78b10bd..755d900632 100644 --- a/include/msg/datatypes.h +++ b/include/msg/datatypes.h @@ -116,7 +116,7 @@ msg_vm_state_saved, msg_vm_state_restoring, } e_msg_vm_state_t; -static inline msg_vm_priv_t field_of(msg_vm_t vm){ +static inline msg_vm_priv_t MSG_vm_priv(msg_vm_t vm){ return xbt_lib_get_level(vm, MSG_HOST_LEVEL); } diff --git a/include/msg/msg.h b/include/msg/msg.h index 6666ff78ab..deec342424 100644 --- a/include/msg/msg.h +++ b/include/msg/msg.h @@ -343,7 +343,7 @@ XBT_PUBLIC(int) MSG_get_channel_number(void); XBT_PUBLIC(msg_vm_t) MSG_vm_create(msg_host_t location, const char *name, int core_nb, int mem_cap, int net_cap); -XBT_PUBLIC(int) MSG_vm_start(msg_vm_t); +XBT_PUBLIC(void) MSG_vm_start(msg_vm_t); XBT_PUBLIC(int) MSG_vm_is_suspended(msg_vm_t); XBT_PUBLIC(int) MSG_vm_is_running(msg_vm_t); diff --git a/src/msg/instr_msg_vm.c b/src/msg/instr_msg_vm.c index 588841f547..232c440b1e 100644 --- a/src/msg/instr_msg_vm.c +++ b/src/msg/instr_msg_vm.c @@ -13,8 +13,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_msg_vm, instr, "MSG VM"); char *instr_vm_id (msg_vm_t vm, char *str, int len) { - - return instr_vm_id_2 (vm->name, str, len); + return instr_vm_id_2 (MSG_get_vm_name(vm), str, len); } char *instr_vm_id_2 (const char *vm_name, char *str, int len) diff --git a/src/msg/msg_global.c b/src/msg/msg_global.c index f40bf21962..eb53047b01 100644 --- a/src/msg/msg_global.c +++ b/src/msg/msg_global.c @@ -37,7 +37,7 @@ void MSG_init_nocheck(int *argc, char **argv) { xbt_getpid = MSG_process_self_PID; if (!msg_global) { - s_msg_vm_t vm; // to compute the offset + // s_msg_vm_t vm; // to compute the offset SIMIX_global_init(argc, argv); @@ -50,7 +50,7 @@ void MSG_init_nocheck(int *argc, char **argv) { msg_global->sent_msg = 0; msg_global->task_copy_callback = NULL; msg_global->process_data_cleanup = NULL; - msg_global->vms = xbt_swag_new(xbt_swag_offset(vm,all_vms_hookup)); +// msg_global->vms = xbt_swag_new(xbt_swag_offset(vm,all_vms_hookup)); /* initialization of the action module */ _MSG_action_init(); diff --git a/src/msg/msg_private.h b/src/msg/msg_private.h index b7801c9f70..f1c64b39b3 100644 --- a/src/msg/msg_private.h +++ b/src/msg/msg_private.h @@ -70,8 +70,6 @@ typedef struct simdata_process { int argc; /* arguments number if any */ msg_error_t last_errno; /* the last value returned by a MSG_function */ - msg_vm_t vm; /* virtual machine the process is in */ - void* data; /* user data */ } s_simdata_process_t, *simdata_process_t; diff --git a/src/msg/msg_process.c b/src/msg/msg_process.c index cf7ce52b6a..d112e5eb3a 100644 --- a/src/msg/msg_process.c +++ b/src/msg/msg_process.c @@ -50,12 +50,6 @@ void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc) msg_global->process_data_cleanup(msg_proc->data); } - // remove the process from its virtual machine - if (msg_proc->vm) { - int pos = xbt_dynar_search(msg_proc->vm->processes,&smx_proc); - xbt_dynar_remove_at(msg_proc->vm->processes,pos, NULL); - } - // free the MSG process xbt_free(msg_proc); } diff --git a/src/msg/msg_vm.c b/src/msg/msg_vm.c index 429accd11f..eaa697bb70 100644 --- a/src/msg/msg_vm.c +++ b/src/msg/msg_vm.c @@ -67,6 +67,16 @@ msg_vm_t MSG_vm_get_by_name(const char *name){ return MSG_get_host_by_name(name); } +/** \ingroup m_vm_management + * + * \brief Return the name of the #msg_host_t. + * + * This functions checks whether \a host is a valid pointer or not and return + its name. + */ +const char *MSG_vm_get_name(msg_vm_t vm) { + return MSG_host_get_name(vm); +} /** @brief Returns a newly constructed dynar containing all existing VMs in the system. * @ingroup msg_VMs @@ -147,184 +157,167 @@ int MSG_vm_is_running(msg_vm_t vm) { return __MSG_vm_is_state(msg_vm_state_running); } -// TODO complete the different state - -/** @brief Add the given process into the VM. - * @ingroup msg_VMs - * - * Afterward, when the VM is migrated or suspended or whatever, the process will have the corresponding handling, too. - * - */ -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, 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. - * @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, msg_host_t destination) { - unsigned int cpt; - msg_process_t process; - xbt_dynar_foreach(vm->processes,cpt,process) { - MSG_process_migrate(process,destination); - } - 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. - * @ingroup msg_VMs - * - * No suspension cost occurs. If you want to simulate this too, you want to - * use a \ref MSG_file_write() before or after, depending on the exact semantic - * of VM suspend to you. - */ -void MSG_vm_suspend(msg_vm_t vm) { - unsigned int cpt; - msg_process_t process; - xbt_dynar_foreach(vm->processes,cpt,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. - * @ingroup msg_VMs - * - * No resume cost occurs. If you want to simulate this too, you want to - * use a \ref MSG_file_read() before or after, depending on the exact semantic - * of VM resume to you. - */ -void MSG_vm_resume(msg_vm_t vm) { - unsigned int cpt; - msg_process_t process; - xbt_dynar_foreach(vm->processes,cpt,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 -} - +// TODO Implement the functions for the different state void MSG_vm_shutdown(msg_vm_t vm) { /* msg_vm_t equals to msg_host_t */ - char *name = simcall_host_get_name(vm); - smx_host_t smx_host = xbt_lib_get_or_null(host_lib, name, SIMIX_HOST_LEVEL); - smx_process_t smx_process, smx_process_next; - - XBT_DEBUG("%lu processes in the VM", xbt_swag_size(SIMIX_host_priv(smx_host)->process_list)); - - xbt_swag_foreach_safe(smx_process, SIMIX_host_priv(smx_host)->process_list) { - XBT_DEBUG("kill %s", SIMIX_host_get_name(smx_host)); - simcall_process_kill(smx_process); - } + simcall_vm_shutdown(vm); /* taka: not yet confirmed */ #ifdef HAVE_TRACING TRACE_msg_vm_kill(vm); #endif - - /* TODO: update the state of vm */ - -#if 0 - while (xbt_dynar_length(vm->processes) > 0) { - process = xbt_dynar_get_as(vm->processes,0,msg_process_t); - } -#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; - - xbt_dynar_foreach(vm->processes,cpt,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) -{ - simcall_vm_destroy(vm); - -#if 0 - 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); -#endif -} +///** @brief Add the given process into the VM. +// * @ingroup msg_VMs +// * +// * Afterward, when the VM is migrated or suspended or whatever, the process will have the corresponding handling, too. +// * +// */ +//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, 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. +// * @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, msg_host_t destination) { +// unsigned int cpt; +// msg_process_t process; +// xbt_dynar_foreach(vm->processes,cpt,process) { +// MSG_process_migrate(process,destination); +// } +// 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. +// * @ingroup msg_VMs +// * +// * No suspension cost occurs. If you want to simulate this too, you want to +// * use a \ref MSG_file_write() before or after, depending on the exact semantic +// * of VM suspend to you. +// */ +//void MSG_vm_suspend(msg_vm_t vm) { +// unsigned int cpt; +// msg_process_t process; +// xbt_dynar_foreach(vm->processes,cpt,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. +// * @ingroup msg_VMs +// * +// * No resume cost occurs. If you want to simulate this too, you want to +// * use a \ref MSG_file_read() before or after, depending on the exact semantic +// * of VM resume to you. +// */ +//void MSG_vm_resume(msg_vm_t vm) { +// unsigned int cpt; +// msg_process_t process; +// xbt_dynar_foreach(vm->processes,cpt,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 +//} +// +// +///** +// * \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; +// +// xbt_dynar_foreach(vm->processes,cpt,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) +//{ +// simcall_vm_destroy(vm); +// +//#if 0 +// 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); +//#endif +//} diff --git a/src/simix/smx_vm.c b/src/simix/smx_vm.c index 1aff24ed11..37c25aafb4 100644 --- a/src/simix/smx_vm.c +++ b/src/simix/smx_vm.c @@ -68,7 +68,7 @@ void SIMIX_pre_vm_start(smx_simcall_t simcall, smx_host_t vm){ /* ***** set/get state of a VM ***** */ void SIMIX_set_vm_state(smx_host_t vm, int state){ - + surf_vm_workstation_model->extension.vm_workstation.set_state(vm, state); } void SIMIX_prev_set_vm_state(smx_host_t vm, int state){ SIMIX_set_vm_state(vm, state); @@ -96,473 +96,12 @@ void SIMIX_vm_destroy(smx_host_t host) smx_host_priv_t host_priv = SIMIX_host_priv(host); /* this will call the registered callback function, i.e., SIMIX_host_destroy(). */ - xbt_lib_unset(host_lib, name, SIMIX_HOST_LEVEL) + xbt_lib_unset(host_lib, hostname, SIMIX_HOST_LEVEL); /* jump to vm_ws_destroy(). The surf level resource will be freed. */ - surf_vm_workstation_model->extension.vm_workstation.destroy(hostname); + surf_vm_workstation_model->extension.vm_workstation.destroy(host); } void SIMIX_pre_vm_destroy(smx_simcall_t simcall, smx_host_t vm){ SIMIX_vm_start(vm); } - -smx_host_t SIMIX_host_get_by_name(const char *name){ - xbt_assert(((simix_global != NULL) - && (host_lib != NULL)), - "Environment not set yet"); - - return xbt_lib_get_elm_or_null(host_lib, name); -} - -smx_host_t SIMIX_host_self(void) -{ - smx_process_t process = SIMIX_process_self(); - return (process == NULL) ? NULL : SIMIX_process_get_host(process); -} - -const char* SIMIX_pre_host_self_get_name(smx_simcall_t simcall){ - return SIMIX_host_self_get_name(); -} -/* needs to be public and without simcall because it is called - by exceptions and logging events */ -const char* SIMIX_host_self_get_name(void) -{ - smx_host_t host = SIMIX_host_self(); - if (host == NULL || SIMIX_process_self() == simix_global->maestro_process) - return ""; - - return SIMIX_host_get_name(host); -} - -const char* SIMIX_pre_host_get_name(smx_simcall_t simcall, smx_host_t host){ - return SIMIX_host_get_name(host); -} -const char* SIMIX_host_get_name(smx_host_t host){ - xbt_assert((host != NULL), "Invalid parameters"); - - return sg_host_name(host); -} - -xbt_dict_t SIMIX_pre_host_get_properties(smx_simcall_t simcall, smx_host_t host){ - return SIMIX_host_get_properties(host); -} -xbt_dict_t SIMIX_host_get_properties(smx_host_t host){ - xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)"); - - return surf_workstation_model->extension.workstation.get_properties(host); -} - -double SIMIX_pre_host_get_speed(smx_simcall_t simcall, smx_host_t host){ - return SIMIX_host_get_speed(host); -} -double SIMIX_host_get_speed(smx_host_t host){ - xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)"); - - return surf_workstation_model->extension.workstation. - get_speed(host, 1.0); -} - -double SIMIX_pre_host_get_available_speed(smx_simcall_t simcall, smx_host_t host){ - return SIMIX_host_get_available_speed(host); -} -double SIMIX_host_get_available_speed(smx_host_t host){ - xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)"); - - return surf_workstation_model->extension.workstation. - get_available_speed(host); -} - -int SIMIX_pre_host_get_state(smx_simcall_t simcall, smx_host_t host){ - return SIMIX_host_get_state(host); -} -int SIMIX_host_get_state(smx_host_t host){ - xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)"); - - return surf_workstation_model->extension.workstation. - get_state(host); -} - -void* SIMIX_pre_host_self_get_data(smx_simcall_t simcall){ - return SIMIX_host_self_get_data(); -} -void* SIMIX_host_self_get_data(void) -{ - smx_host_t self = SIMIX_host_self(); - return SIMIX_host_get_data(self); -} - -void SIMIX_host_self_set_data(void *data) -{ - smx_host_t self = SIMIX_host_self(); - SIMIX_host_set_data(self, data); -} - -void* SIMIX_pre_host_get_data(smx_simcall_t simcall,smx_host_t host){ - return SIMIX_host_get_data(host); -} -void* SIMIX_host_get_data(smx_host_t host){ - xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)"); - - return SIMIX_host_priv(host)->data; -} -void _SIMIX_host_free_process_arg(void *); -void _SIMIX_host_free_process_arg(void *data) -{ - smx_process_arg_t arg = *(void**)data; - xbt_free(arg->name); - xbt_free(arg); -} -/** - * \brief Add a process to the list of the processes that the host will restart when it comes back - * This function add a process to the list of the processes that will be restarted when the host comes - * back. It is expected that this function is called when the host is down. - * The processes will only be restarted once, meaning that you will have to register the process - * again to restart the process again. - */ -void SIMIX_host_add_auto_restart_process(smx_host_t host, - const char *name, - xbt_main_func_t code, - void *data, - const char *hostname, - double kill_time, - int argc, char **argv, - xbt_dict_t properties, - int auto_restart) -{ - if (!SIMIX_host_priv(host)->auto_restart_processes) { - SIMIX_host_priv(host)->auto_restart_processes = xbt_dynar_new(sizeof(smx_process_arg_t),_SIMIX_host_free_process_arg); - } - smx_process_arg_t arg = xbt_new(s_smx_process_arg_t,1); - arg->name = xbt_strdup(name); - arg->code = code; - arg->data = data; - arg->hostname = hostname; - arg->kill_time = kill_time; - arg->argc = argc; - - arg->argv = xbt_new(char*,argc + 1); - - int i; - for (i = 0; i < argc; i++) { - arg->argv[i] = xbt_strdup(argv[i]); - } - arg->argv[argc] = NULL; - - arg->properties = properties; - arg->auto_restart = auto_restart; - - if( SIMIX_host_get_state(host) == SURF_RESOURCE_OFF - && !xbt_dict_get_or_null(watched_hosts_lib,sg_host_name(host))){ - xbt_dict_set(watched_hosts_lib,sg_host_name(host),host,NULL); - XBT_DEBUG("Have push host %s to watched_hosts_lib because state == SURF_RESOURCE_OFF",sg_host_name(host)); - } - xbt_dynar_push_as(SIMIX_host_priv(host)->auto_restart_processes,smx_process_arg_t,arg); -} -/** - * \brief Restart the list of processes that have been registered to the host - */ -void SIMIX_host_restart_processes(smx_host_t host) -{ - unsigned int cpt; - smx_process_arg_t arg; - xbt_dynar_foreach(SIMIX_host_priv(host)->auto_restart_processes,cpt,arg) { - - smx_process_t process; - - XBT_DEBUG("Restarting Process %s(%s) right now", arg->argv[0], arg->hostname); - if (simix_global->create_process_function) { - simix_global->create_process_function(&process, - arg->argv[0], - arg->code, - NULL, - arg->hostname, - arg->kill_time, - arg->argc, - arg->argv, - arg->properties, - arg->auto_restart); - } - else { - simcall_process_create(&process, - arg->argv[0], - arg->code, - NULL, - arg->hostname, - arg->kill_time, - arg->argc, - arg->argv, - arg->properties, - arg->auto_restart); - - } - } - xbt_dynar_reset(SIMIX_host_priv(host)->auto_restart_processes); -} - -void SIMIX_host_autorestart(smx_host_t host) -{ - if(simix_global->autorestart) - simix_global->autorestart(host); - else - xbt_die("No function for simix_global->autorestart"); -} - -void SIMIX_pre_host_set_data(smx_simcall_t simcall, smx_host_t host, void *data) { - SIMIX_host_set_data(host, data); -} -void SIMIX_host_set_data(smx_host_t host, void *data){ - xbt_assert((host != NULL), "Invalid parameters"); - xbt_assert((SIMIX_host_priv(host)->data == NULL), "Data already set"); - - SIMIX_host_priv(host)->data = data; -} - -smx_action_t SIMIX_pre_host_execute(smx_simcall_t simcall,const char *name, - smx_host_t host, double computation_amount, double priority){ - return SIMIX_host_execute(name, host, computation_amount, priority); -} -smx_action_t SIMIX_host_execute(const char *name, - smx_host_t host, double computation_amount, double priority){ - - /* alloc structures and initialize */ - smx_action_t action = xbt_mallocator_get(simix_global->action_mallocator); - action->type = SIMIX_ACTION_EXECUTE; - action->name = xbt_strdup(name); - action->state = SIMIX_RUNNING; - action->execution.host = host; - -#ifdef HAVE_TRACING - action->category = NULL; -#endif - - /* set surf's action */ - if (!MC_is_active()) { - action->execution.surf_exec = - surf_workstation_model->extension.workstation.execute(host, - computation_amount); - surf_workstation_model->action_data_set(action->execution.surf_exec, action); - surf_workstation_model->set_priority(action->execution.surf_exec, priority); - } - - XBT_DEBUG("Create execute action %p", action); - - return action; -} - -smx_action_t SIMIX_pre_host_parallel_execute(smx_simcall_t simcall, const char *name, - int host_nb, smx_host_t *host_list, - double *computation_amount, double *communication_amount, - double amount, double rate){ - return SIMIX_host_parallel_execute(name, host_nb, host_list, computation_amount, - communication_amount, amount, rate); -} -smx_action_t SIMIX_host_parallel_execute(const char *name, - int host_nb, smx_host_t *host_list, - double *computation_amount, double *communication_amount, - double amount, double rate){ - - void **workstation_list = NULL; - int i; - - /* alloc structures and initialize */ - smx_action_t action = xbt_mallocator_get(simix_global->action_mallocator); - action->type = SIMIX_ACTION_PARALLEL_EXECUTE; - action->name = xbt_strdup(name); - action->state = SIMIX_RUNNING; - action->execution.host = NULL; /* FIXME: do we need the list of hosts? */ - -#ifdef HAVE_TRACING - action->category = NULL; -#endif - - /* set surf's action */ - workstation_list = xbt_new0(void *, host_nb); - for (i = 0; i < host_nb; i++) - workstation_list[i] = host_list[i]; - - /* set surf's action */ - if (!MC_is_active()) { - action->execution.surf_exec = - surf_workstation_model->extension.workstation. - execute_parallel_task(host_nb, workstation_list, computation_amount, - communication_amount, rate); - - surf_workstation_model->action_data_set(action->execution.surf_exec, action); - } - XBT_DEBUG("Create parallel execute action %p", action); - - return action; -} - -void SIMIX_pre_host_execution_destroy(smx_simcall_t simcall, smx_action_t action){ - SIMIX_host_execution_destroy(action); -} -void SIMIX_host_execution_destroy(smx_action_t action){ - XBT_DEBUG("Destroy action %p", action); - - if (action->execution.surf_exec) { - surf_workstation_model->action_unref(action->execution.surf_exec); - action->execution.surf_exec = NULL; - } - xbt_free(action->name); - xbt_mallocator_release(simix_global->action_mallocator, action); -} - -void SIMIX_pre_host_execution_cancel(smx_simcall_t simcall, smx_action_t action){ - SIMIX_host_execution_cancel(action); -} -void SIMIX_host_execution_cancel(smx_action_t action){ - XBT_DEBUG("Cancel action %p", action); - - if (action->execution.surf_exec) - surf_workstation_model->action_cancel(action->execution.surf_exec); -} - -double SIMIX_pre_host_execution_get_remains(smx_simcall_t simcall, smx_action_t action){ - return SIMIX_host_execution_get_remains(action); -} -double SIMIX_host_execution_get_remains(smx_action_t action){ - double result = 0.0; - - if (action->state == SIMIX_RUNNING) - result = surf_workstation_model->get_remains(action->execution.surf_exec); - - return result; -} - -e_smx_state_t SIMIX_pre_host_execution_get_state(smx_simcall_t simcall, smx_action_t action){ - return SIMIX_host_execution_get_state(action); -} -e_smx_state_t SIMIX_host_execution_get_state(smx_action_t action){ - return action->state; -} - -void SIMIX_pre_host_execution_set_priority(smx_simcall_t simcall, smx_action_t action, - double priority){ - return SIMIX_host_execution_set_priority(action, priority); -} -void SIMIX_host_execution_set_priority(smx_action_t action, double priority){ - if(action->execution.surf_exec) - surf_workstation_model->set_priority(action->execution.surf_exec, priority); -} - -void SIMIX_pre_host_execution_wait(smx_simcall_t simcall, smx_action_t action){ - - XBT_DEBUG("Wait for execution of action %p, state %d", action, (int)action->state); - - /* Associate this simcall to the action */ - xbt_fifo_push(action->simcalls, simcall); - simcall->issuer->waiting_action = action; - - /* set surf's action */ - if (MC_is_active()) { - action->state = SIMIX_DONE; - SIMIX_execution_finish(action); - return; - } - - /* If the action is already finished then perform the error handling */ - if (action->state != SIMIX_RUNNING) - SIMIX_execution_finish(action); -} - -void SIMIX_host_execution_suspend(smx_action_t action) -{ - if(action->execution.surf_exec) - surf_workstation_model->suspend(action->execution.surf_exec); -} - -void SIMIX_host_execution_resume(smx_action_t action) -{ - if(action->execution.surf_exec) - surf_workstation_model->resume(action->execution.surf_exec); -} - -void SIMIX_execution_finish(smx_action_t action) -{ - xbt_fifo_item_t item; - smx_simcall_t simcall; - - xbt_fifo_foreach(action->simcalls, item, simcall, smx_simcall_t) { - - switch (action->state) { - - case SIMIX_DONE: - /* do nothing, action done */ - XBT_DEBUG("SIMIX_execution_finished: execution successful"); - break; - - case SIMIX_FAILED: - XBT_DEBUG("SIMIX_execution_finished: host '%s' failed", sg_host_name(simcall->issuer->smx_host)); - simcall->issuer->context->iwannadie = 1; - //SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed"); - break; - - case SIMIX_CANCELED: - XBT_DEBUG("SIMIX_execution_finished: execution canceled"); - SMX_EXCEPTION(simcall->issuer, cancel_error, 0, "Canceled"); - break; - - default: - xbt_die("Internal error in SIMIX_execution_finish: unexpected action state %d", - (int)action->state); - } - /* check if the host is down */ - if (surf_workstation_model->extension. - workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) { - simcall->issuer->context->iwannadie = 1; - } - - simcall->issuer->waiting_action = NULL; - simcall_host_execution_wait__set__result(simcall, action->state); - SIMIX_simcall_answer(simcall); - } - - /* We no longer need it */ - SIMIX_host_execution_destroy(action); -} - -void SIMIX_post_host_execute(smx_action_t action) -{ - if (action->type == SIMIX_ACTION_EXECUTE && /* FIMXE: handle resource failure - * for parallel tasks too */ - surf_workstation_model->extension.workstation.get_state(action->execution.host) == SURF_RESOURCE_OFF) { - /* If the host running the action failed, notice it so that the asking - * process can be killed if it runs on that host itself */ - action->state = SIMIX_FAILED; - } else if (surf_workstation_model->action_state_get(action->execution.surf_exec) == SURF_ACTION_FAILED) { - /* If the host running the action didn't fail, then the action was - * canceled */ - action->state = SIMIX_CANCELED; - } else { - action->state = SIMIX_DONE; - } - - if (action->execution.surf_exec) { - surf_workstation_model->action_unref(action->execution.surf_exec); - action->execution.surf_exec = NULL; - } - - /* If there are simcalls associated with the action, then answer them */ - if (xbt_fifo_size(action->simcalls)) { - SIMIX_execution_finish(action); - } -} - - -#ifdef HAVE_TRACING -void SIMIX_pre_set_category(smx_simcall_t simcall, smx_action_t action, - const char *category){ - SIMIX_set_category(action, category); -} -void SIMIX_set_category(smx_action_t action, const char *category) -{ - if (action->state != SIMIX_RUNNING) return; - if (action->type == SIMIX_ACTION_EXECUTE){ - surf_workstation_model->set_category(action->execution.surf_exec, category); - }else if (action->type == SIMIX_ACTION_COMMUNICATE){ - surf_workstation_model->set_category(action->comm.surf_comm, category); - } -} -#endif - diff --git a/src/surf/vm_workstation.c b/src/surf/vm_workstation.c index 3bd63c33a3..d5ef52aca5 100644 --- a/src/surf/vm_workstation.c +++ b/src/surf/vm_workstation.c @@ -13,7 +13,7 @@ typedef struct workstation_VM2013 { s_surf_resource_t generic_resource; /* Must remain first to add this to a trace */ - surf_resource_t physical_workstation; // Pointer to the host OS + surf_resource_t ind_physical_workstation; // Pointer to the host OS e_msg_vm_state_t current_state; // See include/msg/datatypes.h } s_workstation_VM2013_t, *workstation_VM2013_t; @@ -22,13 +22,14 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_vm_workstation, surf, surf_model_t surf_vm_workstation_model = NULL; -static void vm_ws_create (const char *name, void *phys_workstation) +static void vm_ws_create (const char *name, void *ind_phys_workstation) { workstation_VM2013_t vm_ws = xbt_new0(s_workstation_VM2013_t, 1); // TODO Complete the surf vm workstation model vm_ws->generic_resource.model = surf_vm_workstation_model; vm_ws->generic_resource.name = xbt_strdup(name); - vm_ws->physical_workstation = phys_workstation; + // ind means ''indirect'' that this is a reference on the whole dict_elm structure (i.e not on the surf_resource_private infos) + vm_ws->ind_physical_workstation = ind_phys_workstation; vm_ws->current_state=msg_vm_state_created, xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, vm_ws); } @@ -51,12 +52,12 @@ static void vm_ws_destroy(const char *name) xbt_free(workstation); } -static int vm_ws_get_state(void *vm_ws){ - return ((workstation_VM2013_t)vm_ws)->current_state; +static int vm_ws_get_state(void *ind_vm_ws){ + return ((workstation_VM2013_t) surf_workstation_resource_priv(ind_vm_ws))->current_state; } -static void vm_ws_set_state(void *vm_ws, int state){ - ((workstation_VM2013_t)vm_ws)->current_state=state; +static void vm_ws_set_state(void *ind_vm_ws, int state){ + ((workstation_VM2013_t) surf_workstation_resource_priv(ind_vm_ws))->current_state=state; } static void surf_vm_workstation_model_init_internal(void) { -- 2.20.1