X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/20fc29c9161b5d8356c192fc2ddd031f7fe1fe76..5c35a583c922ec5967b33193d67dad791cbe0e21:/src/surf/HostImpl.cpp?ds=sidebyside diff --git a/src/surf/HostImpl.cpp b/src/surf/HostImpl.cpp index c24abb7d01..1484af951b 100644 --- a/src/surf/HostImpl.cpp +++ b/src/surf/HostImpl.cpp @@ -3,14 +3,7 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include - -#include "src/simix/smx_private.h" -#include "cpu_cas01.hpp" #include "src/surf/HostImpl.hpp" -#include "simgrid/sg_config.h" - -#include "network_interface.hpp" #include "src/plugins/vm/VirtualMachineImpl.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_host, surf, "Logging specific to the SURF host module"); @@ -35,11 +28,11 @@ namespace surf { void HostModel::adjustWeightOfDummyCpuActions() { /* iterate for all virtual machines */ - for (VirtualMachineImpl* ws_vm : VirtualMachineImpl::allVms_) { + for (s4u::VirtualMachine* ws_vm : vm::VirtualMachineImpl::allVms_) { - Cpu* cpu = ws_vm->piface_->pimpl_cpu; + Cpu* cpu = ws_vm->pimpl_cpu; - int is_active = lmm_constraint_used(cpu->getModel()->getMaxminSystem(), cpu->getConstraint()); + int is_active = lmm_constraint_used(cpu->model()->getMaxminSystem(), cpu->constraint()); if (is_active) { /* some tasks exist on this VM */ @@ -47,13 +40,13 @@ void HostModel::adjustWeightOfDummyCpuActions() /* FIXME: we should use lmm_update_variable_weight() ? */ /* FIXME: If we assign 1.05 and 0.05, the system makes apparently wrong values. */ - ws_vm->action_->setPriority(1); + ws_vm->pimpl_vm_->action_->setPriority(1); } else { /* no task exits on this VM */ XBT_DEBUG("set the weight of the dummy CPU action on PM to 0"); - ws_vm->action_->setPriority(0); + ws_vm->pimpl_vm_->action_->setPriority(0); } } } @@ -61,20 +54,21 @@ void HostModel::adjustWeightOfDummyCpuActions() Action* HostModel::executeParallelTask(int host_nb, simgrid::s4u::Host** host_list, double* flops_amount, double* bytes_amount, double rate) { -#define cost_or_zero(array,pos) ((array)?(array)[pos]:0.0) +#ifndef has_cost +#define has_cost(array,pos) ((array)?(array)[pos]:-1.0) Action* action = nullptr; - if ((host_nb == 1) && (cost_or_zero(bytes_amount, 0) == 0.0)) { + if ((host_nb == 1) && (has_cost(bytes_amount, 0) <= 0)) { action = host_list[0]->pimpl_cpu->execution_start(flops_amount[0]); - } else if ((host_nb == 1) && (cost_or_zero(flops_amount, 0) == 0.0)) { + } else if ((host_nb == 1) && (has_cost(flops_amount, 0) <= 0)) { action = surf_network_model->communicate(host_list[0], host_list[0], bytes_amount[0], rate); - } else if ((host_nb == 2) && (cost_or_zero(flops_amount, 0) == 0.0) && (cost_or_zero(flops_amount, 1) == 0.0)) { - int i, nb = 0; + } else if ((host_nb == 2) && (has_cost(flops_amount, 0) <= 0) && (has_cost(flops_amount, 1) <= 0)) { + int nb = 0; double value = 0.0; - for (i = 0; i < host_nb * host_nb; i++) { - if (cost_or_zero(bytes_amount, i) > 0.0) { + for (int i = 0; i < host_nb * host_nb; i++) { + if (has_cost(bytes_amount, i) > 0.0) { nb++; - value = cost_or_zero(bytes_amount, i); + value = has_cost(bytes_amount, i); } } if (nb == 1) { @@ -90,7 +84,8 @@ Action* HostModel::executeParallelTask(int host_nb, simgrid::s4u::Host** host_li xbt_die("This model only accepts one of the following. You should consider using the ptask model for the other " "cases.\n - execution with one host only and no communication\n - Self-comms with one host only\n - " "Communications with two hosts and no computation"); -#undef cost_or_zero +#undef has_cost +#endif xbt_free(host_list); return action; } @@ -98,8 +93,10 @@ Action* HostModel::executeParallelTask(int host_nb, simgrid::s4u::Host** host_li /************ * Resource * ************/ -HostImpl::HostImpl(s4u::Host* host, xbt_dynar_t storage) : storage_(storage), piface_(host) +HostImpl::HostImpl(s4u::Host* host) : piface_(host) { + /* The VM wants to reinstall a new HostImpl, but we don't want to leak the previously existing one */ + delete piface_->pimpl_; piface_->pimpl_ = this; } @@ -112,7 +109,7 @@ simgrid::surf::Storage* HostImpl::findStorageOnMountList(const char* mount) s_mount_t mnt; unsigned int cursor; - XBT_DEBUG("Search for storage name '%s' on '%s'", mount, piface_->name().c_str()); + XBT_DEBUG("Search for storage name '%s' on '%s'", mount, piface_->cname()); xbt_dynar_foreach (storage_, cursor, mnt) { XBT_DEBUG("See '%s'", mnt.name); if (!strcmp(mount, mnt.name)) { @@ -121,7 +118,7 @@ simgrid::surf::Storage* HostImpl::findStorageOnMountList(const char* mount) } } if (!st) - xbt_die("Can't find mount '%s' for '%s'", mount, piface_->name().c_str()); + xbt_die("Can't find mount '%s' for '%s'", mount, piface_->cname()); return st; } @@ -133,7 +130,7 @@ xbt_dict_t HostImpl::getMountedStorageList() char* storage_name = nullptr; xbt_dynar_foreach (storage_, i, mnt) { - storage_name = (char*)static_cast(mnt.storage)->getName(); + storage_name = (char*)static_cast(mnt.storage)->cname(); xbt_dict_set(storage_list, mnt.name, storage_name, nullptr); } return storage_list; @@ -150,8 +147,8 @@ xbt_dynar_t HostImpl::getAttachedStorageList() if (xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL) != nullptr) { simgrid::surf::Storage* storage = static_cast( xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL)); - if (!strcmp((const char*)storage->attach_, piface_->name().c_str())) { - xbt_dynar_push_as(result, void*, (void*)storage->getName()); + if (!strcmp((const char*)storage->attach_, piface_->cname())) { + xbt_dynar_push_as(result, void*, (void*)storage->cname()); } } } @@ -169,7 +166,7 @@ xbt_dynar_t HostImpl::getAttachedStorageList() char* file_mount_name = nullptr; char* mount_name = nullptr; - XBT_DEBUG("Search for storage name for '%s' on '%s'", fullpath, piface_->name().c_str()); + XBT_DEBUG("Search for storage name for '%s' on '%s'", fullpath, piface_->cname()); xbt_dynar_foreach (storage_, cursor, mnt) { XBT_DEBUG("See '%s'", mnt.name); file_mount_name = (char*)xbt_malloc((strlen(mnt.name) + 1)); @@ -192,9 +189,9 @@ xbt_dynar_t HostImpl::getAttachedStorageList() path[strlen(fullpath) - longest_prefix_length] = '\0'; mount_name[longest_prefix_length] = '\0'; } else - xbt_die("Can't find mount point for '%s' on '%s'", fullpath, piface_->name().c_str()); + xbt_die("Can't find mount point for '%s' on '%s'", fullpath, piface_->cname()); - XBT_DEBUG("OPEN %s on disk '%s'", path, st->getName()); + XBT_DEBUG("OPEN %s on disk '%s'", path, st->cname()); Action* action = st->open((const char*)mount_name, (const char*)path); free((char*)path); free((char*)mount_name); @@ -204,21 +201,21 @@ xbt_dynar_t HostImpl::getAttachedStorageList() Action* HostImpl::close(surf_file_t fd) { simgrid::surf::Storage* st = findStorageOnMountList(fd->mount); - XBT_DEBUG("CLOSE %s on disk '%s'", fd->name, st->getName()); + XBT_DEBUG("CLOSE %s on disk '%s'", fd->name, st->cname()); return st->close(fd); } Action* HostImpl::read(surf_file_t fd, sg_size_t size) { simgrid::surf::Storage* st = findStorageOnMountList(fd->mount); - XBT_DEBUG("READ %s on disk '%s'", fd->name, st->getName()); + XBT_DEBUG("READ %s on disk '%s'", fd->name, st->cname()); return st->read(fd, size); } Action* HostImpl::write(surf_file_t fd, sg_size_t size) { simgrid::surf::Storage* st = findStorageOnMountList(fd->mount); - XBT_DEBUG("WRITE %s on disk '%s'", fd->name, st->getName()); + XBT_DEBUG("WRITE %s on disk '%s'", fd->name, st->cname()); return st->write(fd, size); } @@ -232,10 +229,10 @@ xbt_dynar_t HostImpl::getAttachedStorageList() simgrid::surf::Storage* st = findStorageOnMountList(fd->mount); /* Check if the file is on this storage */ if (!xbt_dict_get_or_null(st->content_, fd->name)) { - XBT_WARN("File %s is not on disk %s. Impossible to unlink", fd->name, st->getName()); + XBT_WARN("File %s is not on disk %s. Impossible to unlink", fd->name, st->cname()); return -1; } else { - XBT_DEBUG("UNLINK %s on disk '%s'", fd->name, st->getName()); + XBT_DEBUG("UNLINK %s on disk '%s'", fd->name, st->cname()); st->usedSize_ -= fd->size; // Remove the file from storage @@ -262,7 +259,7 @@ xbt_dynar_t HostImpl::getAttachedStorageList() xbt_dynar_t info = xbt_dynar_new(sizeof(void*), nullptr); xbt_dynar_push_as(info, sg_size_t*, psize); xbt_dynar_push_as(info, void*, fd->mount); - xbt_dynar_push_as(info, void*, (void*)st->getName()); + xbt_dynar_push_as(info, void*, (void*)st->cname()); xbt_dynar_push_as(info, void*, st->typeId_); xbt_dynar_push_as(info, void*, st->contentType_); @@ -296,11 +293,10 @@ xbt_dynar_t HostImpl::getAttachedStorageList() { /* Check if the new full path is on the same mount point */ if (!strncmp((const char*)fd->mount, fullpath, strlen(fd->mount))) { - sg_size_t *psize, *new_psize; - psize = (sg_size_t*)xbt_dict_get_or_null(findStorageOnMountList(fd->mount)->content_, fd->name); - new_psize = xbt_new(sg_size_t, 1); - *new_psize = *psize; + sg_size_t* psize = (sg_size_t*)xbt_dict_get_or_null(findStorageOnMountList(fd->mount)->content_, fd->name); if (psize) { // src file exists + sg_size_t* new_psize = xbt_new(sg_size_t, 1); + *new_psize = *psize; xbt_dict_remove(findStorageOnMountList(fd->mount)->content_, fd->name); char* path = (char*)xbt_malloc((strlen(fullpath) - strlen(fd->mount) + 1)); strncpy(path, fullpath + strlen(fd->mount), strlen(fullpath) - strlen(fd->mount) + 1);