From dd33438d4578b82a960cade03329ca99f2bbc53a Mon Sep 17 00:00:00 2001 From: Frederic Suter Date: Mon, 24 Apr 2017 22:07:38 +0200 Subject: [PATCH] one xbt_lib less in storage still clumsy --- src/surf/sg_platf.cpp | 48 +++++++++++++++------------------- src/surf/storage_interface.cpp | 2 -- src/surf/storage_n11.cpp | 17 ++---------- src/surf/surf_interface.cpp | 13 +++++++-- 4 files changed, 34 insertions(+), 46 deletions(-) diff --git a/src/surf/sg_platf.cpp b/src/surf/sg_platf.cpp index ef4864e0ae..bc3b670dda 100644 --- a/src/surf/sg_platf.cpp +++ b/src/surf/sg_platf.cpp @@ -46,6 +46,7 @@ extern std::map host_list; } static int surf_parse_models_setup_already_called = 0; +std::map storage_types; /** The current AS in the parsing */ static simgrid::kernel::routing::NetZoneImpl* current_routing = nullptr; @@ -366,37 +367,29 @@ void sg_platf_new_storage(sg_platf_storage_cbarg_t storage) xbt_assert(!xbt_lib_get_or_null(storage_lib, storage->id,ROUTING_STORAGE_LEVEL), "Refusing to add a second storage named \"%s\"", storage->id); - void* stype = xbt_lib_get_or_null(storage_type_lib, storage->type_id,ROUTING_STORAGE_TYPE_LEVEL); - xbt_assert(stype,"No storage type '%s'", storage->type_id); + xbt_assert(storage_types.find(storage->type_id) != storage_types.end(), "No storage type '%s'", storage->type_id); + storage_type_t stype = storage_types.at(storage->type_id); - XBT_DEBUG("ROUTING Create a storage name '%s' with type_id '%s' and content '%s'", - storage->id, - storage->type_id, - storage->content); + XBT_DEBUG("ROUTING Create a storage name '%s' with type_id '%s' and content '%s'", storage->id, storage->type_id, + storage->content); xbt_lib_set(storage_lib, storage->id, ROUTING_STORAGE_LEVEL, (void *) xbt_strdup(storage->type_id)); // if storage content is not specified use the content of storage_type if any - if(!strcmp(storage->content,"") && strcmp(((storage_type_t) stype)->content,"")){ - storage->content = ((storage_type_t) stype)->content; - storage->content_type = ((storage_type_t) stype)->content_type; - XBT_DEBUG("For disk '%s' content is empty, inherit the content (of type %s) from storage type '%s' ", - storage->id,((storage_type_t) stype)->content_type, - ((storage_type_t) stype)->type_id); + if (!strcmp(storage->content, "") && strcmp(stype->content, "")) { + storage->content = stype->content; + storage->content_type = stype->content_type; + XBT_DEBUG("For disk '%s' content is empty, inherit the content (of type %s) from storage type '%s' ", storage->id, + stype->content_type, stype->type_id); } XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s' " - "\n\t\tmodel '%s' \n\t\tcontent '%s'\n\t\tcontent_type '%s' " - "\n\t\tproperties '%p''\n", - storage->id, - ((storage_type_t) stype)->model, - ((storage_type_t) stype)->type_id, - storage->content, - storage->content_type, - storage->properties); - - auto s = surf_storage_model->createStorage(storage->id, ((storage_type_t)stype)->type_id, storage->content, - storage->content_type, storage->attach); + "\n\t\tmodel '%s' \n\t\tcontent '%s'\n\t\tcontent_type '%s' " + "\n\t\tproperties '%p''\n", + storage->id, stype->model, stype->type_id, storage->content, storage->content_type, storage->properties); + + auto s = surf_storage_model->createStorage(storage->id, stype->type_id, storage->content, storage->content_type, + storage->attach); if (storage->properties) { xbt_dict_cursor_t cursor = nullptr; @@ -407,10 +400,11 @@ void sg_platf_new_storage(sg_platf_storage_cbarg_t storage) xbt_dict_free(&storage->properties); } } -void sg_platf_new_storage_type(sg_platf_storage_type_cbarg_t storage_type){ - xbt_assert(!xbt_lib_get_or_null(storage_type_lib, storage_type->id,ROUTING_STORAGE_TYPE_LEVEL), - "Reading a storage type, processing unit \"%s\" already exists", storage_type->id); +void sg_platf_new_storage_type(sg_platf_storage_type_cbarg_t storage_type) +{ + xbt_assert(storage_types.find(storage_type->id) == storage_types.end(), + "Reading a storage type, processing unit \"%s\" already exists", storage_type->id); storage_type_t stype = xbt_new0(s_storage_type_t, 1); stype->model = xbt_strdup(storage_type->model); @@ -424,7 +418,7 @@ void sg_platf_new_storage_type(sg_platf_storage_type_cbarg_t storage_type){ XBT_DEBUG("ROUTING Create a storage type id '%s' with model '%s', content '%s', and content_type '%s'", stype->type_id, stype->model, storage_type->content, storage_type->content_type); - xbt_lib_set(storage_type_lib, stype->type_id, ROUTING_STORAGE_TYPE_LEVEL, (void*)stype); + storage_types.insert({std::string(stype->type_id), stype}); } void sg_platf_new_mount(sg_platf_mount_cbarg_t mount){ diff --git a/src/surf/storage_interface.cpp b/src/surf/storage_interface.cpp index 48e46401d0..a2ef0ebc59 100644 --- a/src/surf/storage_interface.cpp +++ b/src/surf/storage_interface.cpp @@ -19,8 +19,6 @@ int SIMIX_STORAGE_LEVEL = -1; // Simix storage level int MSG_STORAGE_LEVEL = -1; // Msg storage level int ROUTING_STORAGE_LEVEL = -1; // Routing for storage level int SURF_STORAGE_LEVEL = -1; -xbt_lib_t storage_type_lib; -int ROUTING_STORAGE_TYPE_LEVEL = -1; //Routing for storage_type level simgrid::surf::StorageModel *surf_storage_model = nullptr; namespace simgrid { diff --git a/src/surf/storage_n11.cpp b/src/surf/storage_n11.cpp index 31b8fe3863..e54a651b42 100644 --- a/src/surf/storage_n11.cpp +++ b/src/surf/storage_n11.cpp @@ -15,18 +15,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_storage); /************* * CallBacks * *************/ - -static inline void routing_storage_type_free(void *r) -{ - storage_type_t stype = (storage_type_t) r; - free(stype->model); - free(stype->type_id); - free(stype->content); - free(stype->content_type); - xbt_dict_free(&(stype->properties)); - delete stype->model_properties; - free(stype); -} +extern std::map storage_types; static void check_disk_attachment() { @@ -50,7 +39,6 @@ void storage_register_callbacks() instr_routing_define_callbacks(); ROUTING_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, xbt_free_f); - ROUTING_STORAGE_TYPE_LEVEL = xbt_lib_add_level(storage_type_lib, routing_storage_type_free); SURF_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, [](void *self) { delete static_cast(self); }); @@ -76,8 +64,7 @@ Storage* StorageN11Model::createStorage(const char* id, const char* type_id, con xbt_assert(!surf_storage_resource_priv(surf_storage_resource_by_name(id)), "Storage '%s' declared several times in the platform file", id); - storage_type_t storage_type = - (storage_type_t)xbt_lib_get_or_null(storage_type_lib, type_id, ROUTING_STORAGE_TYPE_LEVEL); + storage_type_t storage_type = storage_types.at(type_id); double Bread = surf_parse_get_bandwidth(storage_type->model_properties->at("Bread").c_str(), "property Bread, storage", type_id); diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp index a77bc13a11..6c00e7caca 100644 --- a/src/surf/surf_interface.cpp +++ b/src/surf/surf_interface.cpp @@ -32,6 +32,7 @@ simgrid::trace_mgr::future_evt_set *future_evt_set = nullptr; std::vector surf_path; std::vector host_that_restart; xbt_dict_t watched_hosts_lib; +extern std::map storage_types; namespace simgrid { namespace surf { @@ -352,7 +353,6 @@ void surf_init(int *argc, char **argv) USER_HOST_LEVEL = simgrid::s4u::Host::extension_create(nullptr); storage_lib = xbt_lib_new(); - storage_type_lib = xbt_lib_new(); watched_hosts_lib = xbt_dict_new_homogeneous(nullptr); XBT_DEBUG("Add SURF levels"); @@ -380,8 +380,17 @@ void surf_exit() sg_host_exit(); xbt_lib_free(&storage_lib); sg_link_exit(); - xbt_lib_free(&storage_type_lib); xbt_dict_free(&watched_hosts_lib); + for (auto e : storage_types) { + storage_type_t stype = e.second; + free(stype->model); + free(stype->type_id); + free(stype->content); + free(stype->content_type); + xbt_dict_free(&(stype->properties)); + delete stype->model_properties; + free(stype); + } for (auto model : *all_existing_models) delete model; -- 2.20.1