From 520999f11d36ffc1e152ce39b98bd6a184cdf157 Mon Sep 17 00:00:00 2001 From: Samuel Lepetit Date: Thu, 14 Jun 2012 16:33:33 +0200 Subject: [PATCH] Fix the cloud API, nicely this time. --- .../msg/cloud/masterslave_virtual_machines.c | 5 ++--- src/msg/msg_private.h | 3 +++ src/msg/msg_process.c | 6 ++++++ src/msg/msg_vm.c | 19 ++++++++++++++++--- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/examples/msg/cloud/masterslave_virtual_machines.c b/examples/msg/cloud/masterslave_virtual_machines.c index 0ed5b9069d..7db2605879 100644 --- a/examples/msg/cloud/masterslave_virtual_machines.c +++ b/examples/msg/cloud/masterslave_virtual_machines.c @@ -87,7 +87,7 @@ int master(int argc, char *argv[]) { XBT_INFO("Sleep long enough for everyone to be done with previous batch of work"); MSG_process_sleep(1000-MSG_get_clock()); - XBT_INFO("Add one more process per VM, and dispatch a batch of work to everyone"); + XBT_INFO("Add one more process per VM"); for (i=0;iprocess_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 b31536f187..7469ef06a8 100644 --- a/src/msg/msg_vm.c +++ b/src/msg/msg_vm.c @@ -65,6 +65,19 @@ int MSG_vm_is_running(msg_vm_t vm) { * @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) { + /* 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_dynar_push_as(vm->processes,m_process_t,process); } /** @brief Removes the given process from the given VM, and kill it @@ -107,7 +120,7 @@ void MSG_vm_suspend(msg_vm_t vm) { unsigned int cpt; m_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); } } @@ -123,7 +136,7 @@ void MSG_vm_resume(msg_vm_t vm) { unsigned int cpt; m_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); } } @@ -138,6 +151,6 @@ void MSG_vm_shutdown(msg_vm_t vm) { unsigned int cpt; m_process_t process; xbt_dynar_foreach(vm->processes,cpt,process) { - MSG_process_kill(process); + MSG_process_kill(process); } } -- 2.20.1