X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9bfa71c7201013012f9aba67044617f1739bd358..fa900b346af7c55195fd90c3345cc4107c2afc6d:/src/msg/msg_io.cpp diff --git a/src/msg/msg_io.cpp b/src/msg/msg_io.cpp index d7548f79e1..a013379644 100644 --- a/src/msg/msg_io.cpp +++ b/src/msg/msg_io.cpp @@ -1,16 +1,17 @@ -/* Copyright (c) 2004-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2004-2016. The SimGrid Team. All rights reserved. */ /* 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 "msg_private.h" -#include "xbt/log.h" +#include "simgrid/s4u/host.hpp" +#include "src/msg/msg_private.h" +#include "src/surf/storage_interface.hpp" +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_io, msg, "Logging specific to MSG (io)"); +SG_BEGIN_DECL() + /** @addtogroup msg_file * (#msg_file_t) and the functions for managing it. * @@ -34,6 +35,24 @@ void __MSG_file_get_info(msg_file_t fd){ xbt_dynar_free_container(&info); } +static int MSG_host_get_file_descriptor_id(msg_host_t host) +{ + simgrid::MsgHostExt* priv = host->extension(); + if (priv->file_descriptor_table == nullptr) { + priv->file_descriptor_table = new std::vector(sg_storage_max_file_descriptors); + std::iota(priv->file_descriptor_table->rbegin(), priv->file_descriptor_table->rend(), 0); // Fill with ..., 1, 0. + } + xbt_assert(!priv->file_descriptor_table->empty(), "Too much files are opened! Some have to be closed."); + int desc = priv->file_descriptor_table->back(); + priv->file_descriptor_table->pop_back(); + return desc; +} + +static void MSG_host_release_file_descriptor_id(msg_host_t host, int id) +{ + host->extension()->file_descriptor_table->push_back(id); +} + /** \ingroup msg_file * * \brief Set the user data of a #msg_file_t. @@ -199,7 +218,7 @@ msg_file_t MSG_file_open(const char* fullpath, void* data) priv->fullpath = xbt_strdup(fullpath); priv->simdata = xbt_new0(s_simdata_file_t,1); priv->simdata->smx_file = simcall_file_open(fullpath, MSG_host_self()); - priv->desc_id = __MSG_host_get_file_descriptor_id(MSG_host_self()); + priv->desc_id = MSG_host_get_file_descriptor_id(MSG_host_self()); name = bprintf("%s:%s:%d", priv->fullpath, MSG_host_self()->cname(), priv->desc_id); @@ -226,7 +245,7 @@ int MSG_file_close(msg_file_t fd) int res = simcall_file_close(priv->simdata->smx_file, MSG_host_self()); name = bprintf("%s:%s:%d", priv->fullpath, MSG_host_self()->cname(), priv->desc_id); - __MSG_host_release_file_descriptor_id(MSG_host_self(), priv->desc_id); + MSG_host_release_file_descriptor_id(MSG_host_self(), priv->desc_id); xbt_lib_unset(file_lib, name, MSG_FILE_LEVEL, 1); xbt_free(name); return res; @@ -425,12 +444,14 @@ void __MSG_file_destroy(msg_file_priv_t file) { msg_storage_t __MSG_storage_create(smx_storage_t storage) { - const char *name = SIMIX_storage_get_name(storage); - const char *host = SIMIX_storage_get_host(storage); msg_storage_priv_t storage_private = xbt_new0(s_msg_storage_priv_t, 1); - storage_private->hostname = host; - xbt_lib_set(storage_lib,name,MSG_STORAGE_LEVEL,storage_private); - return xbt_lib_get_elm_or_null(storage_lib, name); + + storage_private->name = SIMIX_storage_get_name(storage); + storage_private->hostname = surf_storage_get_host(storage); + storage_private->size = surf_storage_get_size(storage); + + xbt_lib_set(storage_lib, storage_private->name, MSG_STORAGE_LEVEL, storage_private); + return xbt_lib_get_elm_or_null(storage_lib, storage_private->name); } /** @@ -448,7 +469,8 @@ void __MSG_storage_destroy(msg_storage_priv_t storage) { */ const char *MSG_storage_get_name(msg_storage_t storage) { xbt_assert((storage != nullptr), "Invalid parameters"); - return SIMIX_storage_get_name(storage); + msg_storage_priv_t priv = MSG_storage_priv(storage); + return priv->name; } /** \ingroup msg_storage_management @@ -565,7 +587,14 @@ void *MSG_storage_get_data(msg_storage_t storage) */ xbt_dict_t MSG_storage_get_content(msg_storage_t storage) { - return SIMIX_storage_get_content(storage); + std::map* content = + static_cast(surf_storage_resource_priv(storage))->getContent(); + xbt_dict_t content_dict = xbt_dict_new_homogeneous(nullptr); + + for (auto entry : *content) { + xbt_dict_set(content_dict, entry.first.c_str(), entry.second, nullptr); + } + return content_dict; } /** \ingroup msg_storage_management @@ -576,7 +605,8 @@ xbt_dict_t MSG_storage_get_content(msg_storage_t storage) */ sg_size_t MSG_storage_get_size(msg_storage_t storage) { - return SIMIX_storage_get_size(storage); + msg_storage_priv_t priv = MSG_storage_priv(storage); + return priv->size; } /** \ingroup msg_storage_management @@ -590,3 +620,5 @@ const char *MSG_storage_get_host(msg_storage_t storage) { msg_storage_priv_t priv = MSG_storage_priv(storage); return priv->hostname; } + +SG_END_DECL()