X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/49e85177c669d793e84242983a1b1f430e47184e..0bac7d0f735ac8ba47a46e1db4f6d7a7164fe0f2:/src/simdag/sd_workstation.c diff --git a/src/simdag/sd_workstation.c b/src/simdag/sd_workstation.c index 730ef9893e..3b5c2ea7be 100644 --- a/src/simdag/sd_workstation.c +++ b/src/simdag/sd_workstation.c @@ -1,16 +1,16 @@ -/* Copyright (c) 2006-2014. The SimGrid Team. +/* Copyright (c) 2006-2015. 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 "private.h" -#include "simdag/simdag.h" +#include "simgrid/simdag.h" #include "xbt/dict.h" #include "xbt/lib.h" #include "xbt/sysdep.h" #include "surf/surf.h" -#include "surf/surf_resource.h" +#include "simgrid/msg.h" //FIXME: why? XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_workstation, sd, "Logging specific to SimDag (workstation)"); @@ -25,14 +25,15 @@ SD_workstation_t __SD_workstation_create(void *surf_workstation, const char *name; workstation = xbt_new(s_SD_workstation_priv_t, 1); - workstation->data = data; /* user data */ workstation->access_mode = SD_WORKSTATION_SHARED_ACCESS; /* default mode is shared */ workstation->task_fifo = NULL; workstation->current_task = NULL; name = surf_resource_name(surf_workstation); - xbt_lib_set(host_lib,name,SD_HOST_LEVEL,workstation); - return xbt_lib_get_elm_or_null(host_lib,name); + sg_host_t sg_host = sg_host_by_name(name); + sg_host_sd_set(sg_host,workstation); + sg_host_user_set(sg_host,data); + return sg_host; } /* Creates a storage and registers it in SD. @@ -45,8 +46,8 @@ SD_storage_t __SD_storage_create(void *surf_storage, void *data) storage = xbt_new(s_SD_storage_priv_t, 1); storage->data = data; /* user data */ - name = surf_resource_name(surf_storage); + storage->host = surf_storage_get_host(surf_storage_resource_by_name(name)); xbt_lib_set(storage_lib,name, SD_STORAGE_LEVEL, storage); return xbt_lib_get_elm_or_null(storage_lib, name); } @@ -71,37 +72,24 @@ void __SD_storage_destroy(void *storage) */ SD_workstation_t SD_workstation_get_by_name(const char *name) { - return xbt_lib_get_elm_or_null(host_lib, name); + return sg_host_by_name(name); } /** * \brief Returns the workstation list * * Use SD_workstation_get_number() to know the array size. - * + * * \return an array of \ref SD_workstation_t containing all workstations + * \remark The workstation order in the returned array is generally different from the workstation creation/declaration order in the XML platform (we use a hash table internally). * \see SD_workstation_get_number() */ -const SD_workstation_t *SD_workstation_get_list(void) -{ - - xbt_lib_cursor_t cursor; - char *key; - void **data; - int i; - +const SD_workstation_t *SD_workstation_get_list(void) { xbt_assert(SD_workstation_get_number() > 0, "There is no workstation!"); - if (sd_global->workstation_list == NULL) { /* this is the first time the function is called */ - sd_global->workstation_list = - xbt_new(SD_workstation_t, xbt_lib_length(host_lib)); + if (sd_global->workstation_list == NULL) /* this is the first time the function is called */ + sd_global->workstation_list = xbt_dynar_to_array(sg_hosts_as_dynar()); - i = 0; - xbt_lib_foreach(host_lib, cursor, key, data) { - if(data[SD_HOST_LEVEL]) - sd_global->workstation_list[i++] = xbt_dict_cursor_get_elm(cursor); - } - } return sd_global->workstation_list; } @@ -113,7 +101,7 @@ const SD_workstation_t *SD_workstation_get_list(void) */ int SD_workstation_get_number(void) { - return xbt_lib_length(host_lib); + return sg_host_count(); } /** @@ -125,7 +113,7 @@ int SD_workstation_get_number(void) */ void *SD_workstation_get_data(SD_workstation_t workstation) { - return SD_workstation_priv(workstation)->data; + return sg_host_user(workstation); } /** @@ -140,7 +128,7 @@ void *SD_workstation_get_data(SD_workstation_t workstation) */ void SD_workstation_set_data(SD_workstation_t workstation, void *data) { - SD_workstation_priv(workstation)->data = data; + sg_host_user_set(workstation, data); } /** @@ -151,7 +139,7 @@ void SD_workstation_set_data(SD_workstation_t workstation, void *data) */ const char *SD_workstation_get_name(SD_workstation_t workstation) { - return sg_host_name(workstation); + return sg_host_get_name(workstation); } /** @@ -176,7 +164,7 @@ const char *SD_workstation_get_property_value(SD_workstation_t ws, */ xbt_dict_t SD_workstation_get_properties(SD_workstation_t workstation) { - return surf_resource_get_properties(surf_workstation_resource_priv(workstation)); + return surf_host_get_properties(surf_host_resource_priv(workstation)); } @@ -191,7 +179,7 @@ void SD_workstation_dump(SD_workstation_t ws) XBT_INFO("Displaying workstation %s", SD_workstation_get_name(ws)); XBT_INFO(" - power: %.0f", SD_workstation_get_power(ws)); XBT_INFO(" - available power: %.2f", SD_workstation_get_available_power(ws)); - switch (SD_workstation_priv(ws)->access_mode){ + switch (sg_host_sd(ws)->access_mode){ case SD_WORKSTATION_SHARED_ACCESS: XBT_INFO(" - access mode: Space shared"); break; @@ -233,7 +221,6 @@ const SD_link_t *SD_route_get_list(SD_workstation_t src, void *surf_src; void *surf_dst; xbt_dynar_t surf_route; - const char *link_name; void *surf_link; unsigned int cpt; @@ -245,13 +232,11 @@ const SD_link_t *SD_route_get_list(SD_workstation_t src, surf_src = src; surf_dst = dst; - surf_route = surf_workstation_model_get_route((surf_workstation_model_t)surf_workstation_model, + surf_route = surf_host_model_get_route((surf_host_model_t)surf_host_model, surf_src, surf_dst); xbt_dynar_foreach(surf_route, cpt, surf_link) { - link_name = surf_resource_name(surf_link); - sd_global->recyclable_route[cpt] = - xbt_lib_get_or_null(link_lib, link_name, SD_LINK_LEVEL); + sd_global->recyclable_route[cpt] = surf_link; } return sd_global->recyclable_route; } @@ -266,8 +251,8 @@ const SD_link_t *SD_route_get_list(SD_workstation_t src, */ int SD_route_get_size(SD_workstation_t src, SD_workstation_t dst) { - return xbt_dynar_length(surf_workstation_model_get_route( - (surf_workstation_model_t)surf_workstation_model, src, dst)); + return xbt_dynar_length(surf_host_model_get_route( + (surf_host_model_t)surf_host_model, src, dst)); } /** @@ -279,7 +264,16 @@ int SD_route_get_size(SD_workstation_t src, SD_workstation_t dst) */ double SD_workstation_get_power(SD_workstation_t workstation) { - return surf_workstation_get_speed(workstation, 1.0); + return surf_host_get_speed(workstation, 1.0); +} +/** + * \brief Returns the amount of cores of a workstation + * + * \param workstation a workstation + * \return the amount of cores of this workstation + */ +int SD_workstation_get_cores(SD_workstation_t workstation) { + return surf_host_get_core(workstation); } /** @@ -291,22 +285,22 @@ double SD_workstation_get_power(SD_workstation_t workstation) */ double SD_workstation_get_available_power(SD_workstation_t workstation) { - return surf_workstation_get_available_speed(workstation); + return surf_host_get_available_speed(workstation); } /** * \brief Returns an approximative estimated time for the given computation amount on a workstation * * \param workstation a workstation - * \param computation_amount the computation amount you want to evaluate (in flops) + * \param flops_amount the computation amount you want to evaluate (in flops) * \return an approximative estimated computation time for the given computation amount on this workstation (in seconds) */ double SD_workstation_get_computation_time(SD_workstation_t workstation, - double computation_amount) + double flops_amount) { - xbt_assert(computation_amount >= 0, - "computation_amount must be greater than or equal to zero"); - return computation_amount / SD_workstation_get_power(workstation); + xbt_assert(flops_amount >= 0, + "flops_amount must be greater than or equal to zero"); + return flops_amount / SD_workstation_get_power(workstation); } /** @@ -376,13 +370,13 @@ double SD_route_get_current_bandwidth(SD_workstation_t src, * * \param src the first workstation * \param dst the second workstation - * \param communication_amount the communication amount you want to evaluate (in bytes) - * \return an approximative estimated computation time for the given communication amount + * \param bytes_amount the communication amount you want to evaluate (in bytes) + * \return an approximative estimated communication time for the given bytes amount * between the workstations (in seconds) */ double SD_route_get_communication_time(SD_workstation_t src, SD_workstation_t dst, - double communication_amount) + double bytes_amount) { @@ -395,12 +389,10 @@ double SD_route_get_communication_time(SD_workstation_t src, double latency; int i; - xbt_assert(communication_amount >= 0, - "communication_amount must be greater than or equal to zero"); - + xbt_assert(bytes_amount >= 0, "bytes_amount must be greater than or equal to zero"); - if (communication_amount == 0.0) + if (bytes_amount == 0.0) return 0.0; links = SD_route_get_list(src, dst); @@ -415,7 +407,7 @@ double SD_route_get_communication_time(SD_workstation_t src, min_bandwidth = bandwidth; } - return latency + (communication_amount / min_bandwidth); + return latency + (bytes_amount / min_bandwidth); } /** @@ -430,7 +422,7 @@ double SD_route_get_communication_time(SD_workstation_t src, e_SD_workstation_access_mode_t SD_workstation_get_access_mode(SD_workstation_t workstation) { - return SD_workstation_priv(workstation)->access_mode; + return sg_host_sd(workstation)->access_mode; } /** @@ -456,17 +448,17 @@ void SD_workstation_set_access_mode(SD_workstation_t workstation, access_mode != SD_WORKSTATION_SHARED_ACCESS, "Trying to set an invalid access mode"); - if (access_mode == SD_workstation_priv(workstation)->access_mode) { + if (access_mode == sg_host_sd(workstation)->access_mode) { return; // nothing is changed } - SD_workstation_priv(workstation)->access_mode = access_mode; + sg_host_sd(workstation)->access_mode = access_mode; if (access_mode == SD_WORKSTATION_SHARED_ACCESS) { - xbt_fifo_free(SD_workstation_priv(workstation)->task_fifo); - SD_workstation_priv(workstation)->task_fifo = NULL; + xbt_fifo_free(sg_host_sd(workstation)->task_fifo); + sg_host_sd(workstation)->task_fifo = NULL; } else { - SD_workstation_priv(workstation)->task_fifo = xbt_fifo_new(); + sg_host_sd(workstation)->task_fifo = xbt_fifo_new(); } } @@ -476,8 +468,29 @@ void SD_workstation_set_access_mode(SD_workstation_t workstation, * \param workstation a workstation * \return a dynar containing all mounted storages on the workstation */ -xbt_dict_t SD_workstation_get_storage_list(SD_workstation_t workstation){ - return surf_workstation_get_storage_list(workstation); +xbt_dict_t SD_workstation_get_mounted_storage_list(SD_workstation_t workstation){ + return surf_host_get_mounted_storage_list(workstation); +} + +/** + * \brief Return the list of mounted storages on a workstation. + * + * \param workstation a workstation + * \return a dynar containing all mounted storages on the workstation + */ +xbt_dynar_t SD_workstation_get_attached_storage_list(SD_workstation_t workstation){ + return surf_host_get_attached_storage_list(workstation); +} + +/** + * \brief Returns the host name the storage is attached to + * + * This functions checks whether a storage is a valid pointer or not and return its name. + */ +const char *SD_storage_get_host(msg_storage_t storage) { + xbt_assert((storage != NULL), "Invalid parameters"); + SD_storage_priv_t priv = SD_storage_priv(storage); + return priv->host; } /* Returns whether a task can start now on a workstation*/ @@ -499,17 +512,17 @@ int __SD_workstation_is_busy(SD_workstation_t workstation) XBT_DEBUG ("Workstation '%s' access mode: '%s', current task: %s, fifo size: %d", SD_workstation_get_name(workstation), - (SD_workstation_priv(workstation)->access_mode == + (sg_host_sd(workstation)->access_mode == SD_WORKSTATION_SHARED_ACCESS) ? "SHARED" : "FIFO", - (SD_workstation_priv(workstation)->current_task ? - SD_task_get_name(SD_workstation_priv(workstation)->current_task) + (sg_host_sd(workstation)->current_task ? + SD_task_get_name(sg_host_sd(workstation)->current_task) : "none"), - (SD_workstation_priv(workstation)->task_fifo ? xbt_fifo_size(SD_workstation_priv(workstation)->task_fifo) : + (sg_host_sd(workstation)->task_fifo ? xbt_fifo_size(sg_host_sd(workstation)->task_fifo) : 0)); - return SD_workstation_priv(workstation)->access_mode == SD_WORKSTATION_SEQUENTIAL_ACCESS && - (SD_workstation_priv(workstation)->current_task != NULL - || xbt_fifo_size(SD_workstation_priv(workstation)->task_fifo) > 0); + return sg_host_sd(workstation)->access_mode == SD_WORKSTATION_SEQUENTIAL_ACCESS && + (sg_host_sd(workstation)->current_task != NULL + || xbt_fifo_size(sg_host_sd(workstation)->task_fifo) > 0); } /* Destroys a workstation. @@ -517,6 +530,8 @@ int __SD_workstation_is_busy(SD_workstation_t workstation) void __SD_workstation_destroy(void *workstation) { + if (workstation==NULL) + return; SD_workstation_priv_t w; /* workstation->surf_workstation is freed by surf_exit and workstation->data is freed by the user */ @@ -535,11 +550,11 @@ void __SD_workstation_destroy(void *workstation) * \param workstation a workstation */ SD_task_t SD_workstation_get_current_task(SD_workstation_t workstation) { - xbt_assert(SD_workstation_priv(workstation)->access_mode == SD_WORKSTATION_SEQUENTIAL_ACCESS, + xbt_assert(sg_host_sd(workstation)->access_mode == SD_WORKSTATION_SEQUENTIAL_ACCESS, "Access mode must be set to SD_WORKSTATION_SEQUENTIAL_ACCESS" " to use this function"); - return (SD_workstation_priv(workstation)->current_task); + return (sg_host_sd(workstation)->current_task); } /**