From: navarro Date: Fri, 30 Mar 2012 09:24:15 +0000 (+0200) Subject: Reorganize storage structures (msg, smx and surf) and separate storage parsing from... X-Git-Tag: v3_7~124^2~8 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/582b6f00f1f41d334dbc865dd0b993a7e501f3ba?hp=af0b5e9494ca8988c8dd7d3874c3c7a400a63172 Reorganize storage structures (msg, smx and surf) and separate storage parsing from routing parsing. --- diff --git a/include/simix/datatypes.h b/include/simix/datatypes.h index 340bc1d275..07c05c139d 100644 --- a/include/simix/datatypes.h +++ b/include/simix/datatypes.h @@ -46,14 +46,14 @@ typedef enum { typedef struct s_smx_timer* smx_timer_t; -/* ******************************** File ************************************ */ -typedef struct s_smx_file *smx_file_t; - /* ******************************** Synchro ************************************ */ typedef struct s_smx_mutex *smx_mutex_t; typedef struct s_smx_cond *smx_cond_t; typedef struct s_smx_sem *smx_sem_t; +/********************************** File *************************************/ +typedef struct s_smx_file *smx_file_t; + /********************************** Action *************************************/ typedef struct s_smx_action *smx_action_t; /* FIXME: replace by specialized action handlers */ diff --git a/src/include/surf/datatypes.h b/src/include/surf/datatypes.h index f51895af6e..c24e58ea90 100644 --- a/src/include/surf/datatypes.h +++ b/src/include/surf/datatypes.h @@ -22,7 +22,7 @@ typedef struct surf_model *surf_model_t; * It is represented as a cost, a priority, a duration and a state. */ typedef struct surf_action *surf_action_t; - +typedef struct surf_file *surf_file_t; typedef struct lmm_element *lmm_element_t; typedef struct lmm_variable *lmm_variable_t; diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index 8b7e323d19..113e3b2a81 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -93,7 +93,7 @@ typedef struct surf_action { #ifdef HAVE_TRACING char *category; /**< tracing category for categorized resource utilization monitoring */ #endif - void* file; /**< surf_file_t for storage model */ + surf_file_t file; /**< surf_file_t for storage model */ size_t read_write; } s_surf_action_t; @@ -216,12 +216,6 @@ typedef struct surf_network_model_extension_public { * Public functions specific to the Storage model. */ -typedef struct surf_file { - char *name; /**< @brief host name if any */ - void *simdata; - void *data; /**< @brief user data */ -}s_surf_file_t, *surf_file_t; - typedef struct surf_storage_model_extension_public { surf_action_t(*open) (void *storage, const char* path, const char* mode); surf_action_t(*close) (void *storage, surf_file_t fp); @@ -355,30 +349,6 @@ typedef struct surf_resource { xbt_dict_t properties; } s_surf_resource_t, *surf_resource_t; -/** - * Storage struct - */ -typedef struct s_storage_type { - char *model; - xbt_dict_t content; - char *type_id; - xbt_dict_t properties; -} s_storage_type_t, *storage_type_t; - -typedef struct s_mount { - void *id; - char *name; -} s_mount_t, *mount_t; - -typedef struct s_content { - char *user_rights; - char *user; - char *group; - char *date; - char *time; - size_t size; -} s_content_t, *content_t; - /** * Resource which have a metric handled by a maxmin system */ diff --git a/src/include/surf/surf_resource.h b/src/include/surf/surf_resource.h index aa72c4cfaf..dc66869fdd 100644 --- a/src/include/surf/surf_resource.h +++ b/src/include/surf/surf_resource.h @@ -20,21 +20,6 @@ static XBT_INLINE res->properties = props; return res; } -static XBT_INLINE void routing_storage_type_free(void *r) -{ - storage_type_t stype = r; - free(stype->model); - free(stype->type_id); - xbt_dict_free(&(stype->properties)); - xbt_dict_free(&(stype->content)); - free(stype); -} - -static XBT_INLINE void routing_storage_host_free(void *r) -{ - xbt_dynar_t dyn = r; - xbt_dynar_free(&dyn); -} static XBT_INLINE void surf_resource_free(void *r) { diff --git a/src/msg/msg_io.c b/src/msg/msg_io.c index a9809ac631..0d91bc3a39 100644 --- a/src/msg/msg_io.c +++ b/src/msg/msg_io.c @@ -27,7 +27,7 @@ */ size_t MSG_file_read(const char* storage, void* ptr, size_t size, size_t nmemb, msg_file_t stream) { - return simcall_file_read(storage, ptr, size, nmemb, (smx_file_t)stream); + return simcall_file_read(storage, ptr, size, nmemb, stream->simdata->smx_file); } /** \ingroup m_file_management @@ -42,7 +42,7 @@ size_t MSG_file_read(const char* storage, void* ptr, size_t size, size_t nmemb, */ size_t MSG_file_write(const char* storage, const void* ptr, size_t size, size_t nmemb, msg_file_t stream) { - return simcall_file_write(storage, ptr, size, nmemb, (smx_file_t)stream); + return simcall_file_write(storage, ptr, size, nmemb, stream->simdata->smx_file); } /** \ingroup m_file_management @@ -64,7 +64,11 @@ size_t MSG_file_write(const char* storage, const void* ptr, size_t size, size_t */ msg_file_t MSG_file_open(const char* storage, const char* path, const char* mode) { - return (msg_file_t) simcall_file_open(storage, path, mode); + msg_file_t file = xbt_new(s_msg_file_t,1); + file->name = strdup(path); + file->simdata = xbt_new0(s_simdata_file_t,1); + file->simdata->smx_file = simcall_file_open(storage, path, mode); + return file; } /** \ingroup m_file_management @@ -76,7 +80,7 @@ msg_file_t MSG_file_open(const char* storage, const char* path, const char* mode */ int MSG_file_close(const char* storage, msg_file_t fp) { - return simcall_file_close(storage, (smx_file_t)fp); + return simcall_file_close(storage, fp->simdata->smx_file); } /** \ingroup m_file_management diff --git a/src/msg/msg_private.h b/src/msg/msg_private.h index 317a5d8aae..c43de1e82c 100644 --- a/src/msg/msg_private.h +++ b/src/msg/msg_private.h @@ -45,6 +45,10 @@ typedef struct simdata_task { double *comm_amount; } s_simdata_task_t; +/********************************* File **************************************/ +typedef struct simdata_file { + smx_file_t smx_file; +} s_simdata_file_t; /*************** Begin GPU ***************/ typedef struct simdata_gpu_task { diff --git a/src/simix/smx_io.c b/src/simix/smx_io.c index 53c76d987c..232982e12b 100644 --- a/src/simix/smx_io.c +++ b/src/simix/smx_io.c @@ -48,7 +48,7 @@ smx_action_t SIMIX_file_read(smx_process_t process, const char* storage, void* p #endif action->io.host = host; - action->io.surf_io = surf_workstation_model->extension.workstation.read(host->host, storage, ptr, size, nmemb, (surf_file_t)stream), + action->io.surf_io = surf_workstation_model->extension.workstation.read(host->host, storage, ptr, size, nmemb, stream->surf_file), surf_workstation_model->action_data_set(action->io.surf_io, action); XBT_DEBUG("Create io action %p", action); @@ -90,7 +90,7 @@ smx_action_t SIMIX_file_write(smx_process_t process, const char* storage, const #endif action->io.host = host; - action->io.surf_io = surf_workstation_model->extension.workstation.write(host->host, storage, ptr, size, nmemb, (surf_file_t)stream); + action->io.surf_io = surf_workstation_model->extension.workstation.write(host->host, storage, ptr, size, nmemb, stream->surf_file); surf_workstation_model->action_data_set(action->io.surf_io, action); XBT_DEBUG("Create io action %p", action); @@ -107,7 +107,8 @@ void SIMIX_pre_file_open(smx_simcall_t simcall) simcall->file_open.mode); xbt_fifo_push(action->simcalls, simcall); simcall->issuer->waiting_action = action; - simcall->file_open.result = (action->io.surf_io)->file; + simcall->file_open.result = xbt_new(s_smx_file_t,1); /* FIXME */ + simcall->file_open.result->surf_file = (action->io.surf_io)->file; } smx_action_t SIMIX_file_open(smx_process_t process ,const char* storage, const char* path, const char* mode) @@ -169,7 +170,7 @@ smx_action_t SIMIX_file_close(smx_process_t process ,const char* storage, smx_fi #endif action->io.host = host; - action->io.surf_io = surf_workstation_model->extension.workstation.close(host->host, storage, (surf_file_t)fp); + action->io.surf_io = surf_workstation_model->extension.workstation.close(host->host, storage, fp->surf_file); surf_workstation_model->action_data_set(action->io.surf_io, action); XBT_DEBUG("Create io action %p", action); diff --git a/src/simix/smx_io_private.h b/src/simix/smx_io_private.h index 83cd90257d..03847d9e0c 100644 --- a/src/simix/smx_io_private.h +++ b/src/simix/smx_io_private.h @@ -10,13 +10,6 @@ #include "simix/datatypes.h" #include "smx_smurf_private.h" -/** @brief File datatype */ -typedef struct s_smx_file { - char *name; /**< @brief host name if any */ - void *simdata; - void *data; /**< @brief user data */ -} s_smx_file_t; - void SIMIX_pre_file_read(smx_simcall_t simcall); void SIMIX_pre_file_write(smx_simcall_t simcall); void SIMIX_pre_file_open(smx_simcall_t simcall); diff --git a/src/simix/smx_private.h b/src/simix/smx_private.h index 13dca2f9a2..bc4efc04ae 100644 --- a/src/simix/smx_private.h +++ b/src/simix/smx_private.h @@ -57,6 +57,12 @@ extern unsigned long simix_process_maxpid; #define SMX_THROW() RETHROW +/* ******************************** File ************************************ */ +typedef struct s_smx_file { + surf_file_t surf_file; +} s_smx_file_t; + + /*********************************** Time ************************************/ /** @brief Timer datatype */ @@ -84,6 +90,13 @@ typedef enum { SIMIX_COMM_DONE } e_smx_comm_type_t; +typedef enum { + SIMIX_IO_OPEN, + SIMIX_IO_WRITE, + SIMIX_IO_READ, + SIMIX_IO_STAT +} e_smx_io_type_t; + /** @brief Action datatype */ typedef struct s_smx_action { diff --git a/src/surf/storage.c b/src/surf/storage.c index e59d0c76b3..772423f6e2 100644 --- a/src/surf/storage.c +++ b/src/surf/storage.c @@ -14,6 +14,15 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_storage, surf, "Logging specific to the SURF storage module"); +xbt_lib_t storage_lib; +int ROUTING_STORAGE_LEVEL; //Routing for storagelevel +int ROUTING_STORAGE_HOST_LEVEL; +int SURF_STORAGE_LEVEL; +xbt_lib_t storage_type_lib; +int ROUTING_STORAGE_TYPE_LEVEL; //Routing for storage_type level + +xbt_dynar_t mount_list = NULL; /* temporary store of current mount storage */ + surf_model_t surf_storage_model = NULL; lmm_system_t storage_maxmin_system = NULL; static int storage_selective_update = 0; @@ -52,7 +61,7 @@ static surf_action_t storage_action_open(void *storage, const char* path, const surf_file_t file = xbt_new0(s_surf_file_t,1); file->name = xbt_strdup(path); - file->simdata = content; + file->content = content; surf_action_t action = storage_action_execute(storage,0, DEFAULT); action->file = (void *)file; @@ -63,7 +72,7 @@ static surf_action_t storage_action_close(void *storage, surf_file_t fp) { char *filename = fp->name; free(fp->name); - fp->simdata = NULL; + fp->content = NULL; xbt_free(fp); surf_action_t action = storage_action_execute(storage,0, DEFAULT); XBT_DEBUG("\tClose file '%s'",filename); @@ -73,7 +82,7 @@ static surf_action_t storage_action_close(void *storage, surf_file_t fp) static surf_action_t storage_action_read(void *storage, void* ptr, size_t size, size_t nmemb, surf_file_t stream) { char *filename = stream->name; - content_t content = (content_t)(stream->simdata); + content_t content = stream->content; XBT_DEBUG("\tRead file '%s' size '%Zu/%Zu'",filename,size,content->size); if(size > content->size) size = content->size; @@ -85,7 +94,7 @@ static surf_action_t storage_action_read(void *storage, void* ptr, size_t size, static surf_action_t storage_action_write(void *storage, const void* ptr, size_t size, size_t nmemb, surf_file_t stream) { char *filename = stream->name; - content_t content = (content_t)(stream->simdata); + content_t content = stream->content; XBT_DEBUG("\tWrite file '%s' size '%Zu/%Zu'",filename,size,content->size); surf_action_t action = storage_action_execute(storage,size,WRITE); @@ -399,3 +408,179 @@ void surf_storage_model_init_default(void) xbt_dynar_push(model_list, &surf_storage_model); } + +static void storage_parse_storage(sg_platf_storage_cbarg_t storage) +{ + xbt_assert(!xbt_lib_get_or_null(storage_lib, storage->id,ROUTING_STORAGE_LEVEL), + "Reading a storage, processing unit \"%s\" already exists", storage->id); + + // Verification of an existing type_id +#ifndef NDEBUG + void* storage_type = xbt_lib_get_or_null(storage_type_lib, storage->type_id,ROUTING_STORAGE_TYPE_LEVEL); +#endif + xbt_assert(storage_type,"Reading a storage, type id \"%s\" does not exists", storage->type_id); + + XBT_DEBUG("ROUTING Create a storage name '%s' with type_id '%s'", + storage->id, + storage->type_id); + + xbt_lib_set(storage_lib, + storage->id, + ROUTING_STORAGE_LEVEL, + (void *) xbt_strdup(storage->type_id)); +} + +static void free_storage_content(void *p) +{ + content_t content = p; + free(content->date); + free(content->group); + free(content->time); + free(content->user); + free(content->user_rights); + free(content); +} + +static xbt_dict_t parse_storage_content(const char *filename) +{ + if ((!filename) || (strcmp(filename, "") == 0)) + return NULL; + + xbt_dict_t parse_content = xbt_dict_new_homogeneous(free_storage_content); + FILE *file = NULL; + + file = surf_fopen(filename, "r"); + xbt_assert(file != NULL, "Cannot open file '%s' (path=%s)", filename, + xbt_str_join(surf_path, ":")); + + char *line = NULL; + size_t len = 0; + ssize_t read; + char user_rights[12]; + char user[100]; + char group[100]; + char date[12]; + char time[12]; + char path[1024]; + int nb, size; + + content_t content; + + while ((read = getline(&line, &len, file)) != -1) { + content = xbt_new0(s_content_t,1); + if(sscanf(line,"%s %d %s %s %d %s %s %s",user_rights,&nb,user,group,&size,date,time,path)==8) { + content->date = xbt_strdup(date); + content->group = xbt_strdup(group); + content->size = size; + content->time = xbt_strdup(time); + content->user = xbt_strdup(user); + content->user_rights = xbt_strdup(user_rights); + xbt_dict_set(parse_content,path,content,NULL); + } else { + xbt_die("Be sure of passing a good format for content file.\n"); + // You can generate this kind of file with command line: + // find /path/you/want -type f -exec ls -l {} \; 2>/dev/null > ./content.txt + } + } + if (line) + free(line); + + fclose(file); + return parse_content; +} + +static void storage_parse_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); + + storage_type_t stype = xbt_new0(s_storage_type_t, 1); + stype->model = xbt_strdup(storage_type->model); + stype->properties = storage_type->properties; + stype->content = parse_storage_content(storage_type->content); + stype->type_id = xbt_strdup(storage_type->id); + + XBT_DEBUG("ROUTING Create a storage type id '%s' with model '%s' content '%s' and properties '%p'", + stype->type_id, + stype->model, + storage_type->content, + stype->properties); + + xbt_lib_set(storage_type_lib, + stype->type_id, + ROUTING_STORAGE_TYPE_LEVEL, + (void *) stype); +} +static void storage_parse_mstorage(sg_platf_mstorage_cbarg_t mstorage) +{ + THROW_UNIMPLEMENTED; +// mount_t mnt = xbt_new0(s_mount_t, 1); +// mnt->id = xbt_strdup(mstorage->type_id); +// mnt->name = xbt_strdup(mstorage->name); +// +// if(!mount_list){ +// XBT_DEBUG("Creata a Mount list for %s",A_surfxml_host_id); +// mount_list = xbt_dynar_new(sizeof(char *), NULL); +// } +// xbt_dynar_push(mount_list,(void *) mnt); +// free(mnt->id); +// free(mnt->name); +// xbt_free(mnt); +// XBT_DEBUG("ROUTING Mount a storage name '%s' with type_id '%s'",mstorage->name, mstorage->id); +} + +static void mount_free(void *p) +{ + mount_t mnt = p; + xbt_free(mnt->name); +} + +static void storage_parse_mount(sg_platf_mount_cbarg_t mount) +{ + // Verification of an existing storage +#ifndef NDEBUG + void* storage = xbt_lib_get_or_null(storage_lib, mount->id,ROUTING_STORAGE_LEVEL); +#endif + xbt_assert(storage,"Disk id \"%s\" does not exists", mount->id); + + XBT_DEBUG("ROUTING Mount '%s' on '%s'",mount->id, mount->name); + + s_mount_t mnt; + mnt.id = surf_storage_resource_by_name(mount->id); + mnt.name = xbt_strdup(mount->name); + + if(!mount_list){ + XBT_DEBUG("Create a Mount list for %s",A_surfxml_host_id); + mount_list = xbt_dynar_new(sizeof(s_mount_t), mount_free); + } + xbt_dynar_push(mount_list,&mnt); +} + +static XBT_INLINE void routing_storage_type_free(void *r) +{ + storage_type_t stype = r; + free(stype->model); + free(stype->type_id); + xbt_dict_free(&(stype->properties)); + xbt_dict_free(&(stype->content)); + free(stype); +} + +static XBT_INLINE void routing_storage_host_free(void *r) +{ + xbt_dynar_t dyn = r; + xbt_dynar_free(&dyn); +} + +void storage_register_callbacks() { + + ROUTING_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,xbt_free); + ROUTING_STORAGE_HOST_LEVEL = xbt_lib_add_level(storage_lib,routing_storage_host_free); + ROUTING_STORAGE_TYPE_LEVEL = xbt_lib_add_level(storage_type_lib,routing_storage_type_free); + SURF_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,surf_resource_free); + + sg_platf_storage_add_cb(storage_parse_storage); + sg_platf_mstorage_add_cb(storage_parse_mstorage); + sg_platf_storage_type_add_cb(storage_parse_storage_type); + sg_platf_mount_add_cb(storage_parse_mount); +} diff --git a/src/surf/storage_private.h b/src/surf/storage_private.h index ca7b6cdf94..63e9d2c8e4 100644 --- a/src/surf/storage_private.h +++ b/src/surf/storage_private.h @@ -8,6 +8,33 @@ #ifndef STORAGE_PRIVATE_H_ #define STORAGE_PRIVATE_H_ +typedef struct s_storage_type { + char *model; + xbt_dict_t content; + char *type_id; + xbt_dict_t properties; +} s_storage_type_t, *storage_type_t; + +typedef struct s_mount { + void *id; + char *name; +} s_mount_t, *mount_t; + +typedef struct s_content { + char *user_rights; + char *user; + char *group; + char *date; + char *time; + size_t size; +} s_content_t, *content_t; + + +typedef struct surf_file { + char *name; + content_t content; +} s_surf_file_t; + typedef struct storage { s_surf_resource_t generic_resource; /*< Structure with generic data. Needed at begin to interate with SURF */ e_surf_resource_state_t state_current; /*< STORAGE current state (ON or OFF) */ diff --git a/src/surf/surf.c b/src/surf/surf.c index 49eb817151..709eb290fe 100644 --- a/src/surf/surf.c +++ b/src/surf/surf.c @@ -308,15 +308,11 @@ void surf_init(int *argc, char **argv) XBT_DEBUG("ADD ROUTING LEVEL"); ROUTING_HOST_LEVEL = xbt_lib_add_level(host_lib,routing_asr_host_free); ROUTING_ASR_LEVEL = xbt_lib_add_level(as_router_lib,routing_asr_host_free); - ROUTING_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,xbt_free); - ROUTING_STORAGE_HOST_LEVEL = xbt_lib_add_level(storage_lib,routing_storage_host_free); - ROUTING_STORAGE_TYPE_LEVEL = xbt_lib_add_level(storage_type_lib,routing_storage_type_free); XBT_DEBUG("ADD SURF LEVELS"); SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free); SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free); SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_resource_free); - SURF_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,surf_resource_free); xbt_init(argc, argv); if (!model_list) diff --git a/src/surf/surf_private.h b/src/surf/surf_private.h index a50e6ccfc6..ff8b6b0cb0 100644 --- a/src/surf/surf_private.h +++ b/src/surf/surf_private.h @@ -185,6 +185,7 @@ struct s_routing_global { XBT_PUBLIC(void) routing_model_create(size_t size_of_link, void *loopback); XBT_PUBLIC(void) routing_exit(void); +XBT_PUBLIC(void) storage_register_callbacks(void); XBT_PUBLIC(void) routing_register_callbacks(void); XBT_PUBLIC(void) generic_free_route(route_t route); // FIXME rename to routing_route_free // FIXME: make previous function private to routing again? diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 6ce1552706..737a545e9d 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -43,21 +43,14 @@ int NS3_ASR_LEVEL; //host node for ns3 static xbt_dict_t random_value = NULL; -xbt_lib_t storage_lib; -int ROUTING_STORAGE_LEVEL; //Routing for storagelevel -int ROUTING_STORAGE_HOST_LEVEL; -int SURF_STORAGE_LEVEL; - -xbt_lib_t storage_type_lib; -int ROUTING_STORAGE_TYPE_LEVEL; //Routing for storage_type level - /* Global vars */ routing_global_t global_routing = NULL; AS_t current_routing = NULL; /* global parse functions */ xbt_dynar_t parsed_link_list = NULL; /* temporary store of current list link of a route */ -xbt_dynar_t mount_list = NULL; /* temporary store of current mount storage */ +extern xbt_dynar_t mount_list; + static const char *src = NULL; /* temporary store the source name of a route */ static const char *dst = NULL; /* temporary store the destination name of a route */ static char *gw_src = NULL; /* temporary store the gateway source name of a route */ @@ -747,153 +740,6 @@ void routing_model_create(size_t size_of_links, void *loopback) /* ************************************************************************** */ /* ************************* GENERIC PARSE FUNCTIONS ************************ */ -static void routing_parse_storage(sg_platf_storage_cbarg_t storage) -{ - xbt_assert(!xbt_lib_get_or_null(storage_lib, storage->id,ROUTING_STORAGE_LEVEL), - "Reading a storage, processing unit \"%s\" already exists", storage->id); - - // Verification of an existing type_id -#ifndef NDEBUG - void* storage_type = xbt_lib_get_or_null(storage_type_lib, storage->type_id,ROUTING_STORAGE_TYPE_LEVEL); -#endif - xbt_assert(storage_type,"Reading a storage, type id \"%s\" does not exists", storage->type_id); - - XBT_DEBUG("ROUTING Create a storage name '%s' with type_id '%s'", - storage->id, - storage->type_id); - - xbt_lib_set(storage_lib, - storage->id, - ROUTING_STORAGE_LEVEL, - (void *) xbt_strdup(storage->type_id)); -} - -static void free_storage_content(void *p) -{ - content_t content = p; - free(content->date); - free(content->group); - free(content->time); - free(content->user); - free(content->user_rights); - free(content); -} - -static xbt_dict_t parse_storage_content(const char *filename) -{ - if ((!filename) || (strcmp(filename, "") == 0)) - return NULL; - - xbt_dict_t parse_content = xbt_dict_new_homogeneous(free_storage_content); - FILE *file = NULL; - - file = surf_fopen(filename, "r"); - xbt_assert(file != NULL, "Cannot open file '%s' (path=%s)", filename, - xbt_str_join(surf_path, ":")); - - char *line = NULL; - size_t len = 0; - ssize_t read; - char user_rights[12]; - char user[100]; - char group[100]; - char date[12]; - char time[12]; - char path[1024]; - int nb, size; - - content_t content; - - while ((read = getline(&line, &len, file)) != -1) { - content = xbt_new0(s_content_t,1); - if(sscanf(line,"%s %d %s %s %d %s %s %s",user_rights,&nb,user,group,&size,date,time,path)==8) { - content->date = xbt_strdup(date); - content->group = xbt_strdup(group); - content->size = size; - content->time = xbt_strdup(time); - content->user = xbt_strdup(user); - content->user_rights = xbt_strdup(user_rights); - xbt_dict_set(parse_content,path,content,NULL); - } else { - xbt_die("Be sure of passing a good format for content file.\n"); - // You can generate this kind of file with command line: - // find /path/you/want -type f -exec ls -l {} \; 2>/dev/null > ./content.txt - } - } - if (line) - free(line); - - fclose(file); - return parse_content; -} - -static void routing_parse_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); - - storage_type_t stype = xbt_new0(s_storage_type_t, 1); - stype->model = xbt_strdup(storage_type->model); - stype->properties = storage_type->properties; - stype->content = parse_storage_content(storage_type->content); - stype->type_id = xbt_strdup(storage_type->id); - - XBT_DEBUG("ROUTING Create a storage type id '%s' with model '%s' content '%s' and properties '%p'", - stype->type_id, - stype->model, - storage_type->content, - stype->properties); - - xbt_lib_set(storage_type_lib, - stype->type_id, - ROUTING_STORAGE_TYPE_LEVEL, - (void *) stype); -} -static void routing_parse_mstorage(sg_platf_mstorage_cbarg_t mstorage) -{ - THROW_UNIMPLEMENTED; -// mount_t mnt = xbt_new0(s_mount_t, 1); -// mnt->id = xbt_strdup(mstorage->type_id); -// mnt->name = xbt_strdup(mstorage->name); -// -// if(!mount_list){ -// XBT_DEBUG("Creata a Mount list for %s",A_surfxml_host_id); -// mount_list = xbt_dynar_new(sizeof(char *), NULL); -// } -// xbt_dynar_push(mount_list,(void *) mnt); -// free(mnt->id); -// free(mnt->name); -// xbt_free(mnt); -// XBT_DEBUG("ROUTING Mount a storage name '%s' with type_id '%s'",mstorage->name, mstorage->id); -} - -static void mount_free(void *p) -{ - mount_t mnt = p; - xbt_free(mnt->name); -} - -static void routing_parse_mount(sg_platf_mount_cbarg_t mount) -{ - // Verification of an existing storage -#ifndef NDEBUG - void* storage = xbt_lib_get_or_null(storage_lib, mount->id,ROUTING_STORAGE_LEVEL); -#endif - xbt_assert(storage,"Disk id \"%s\" does not exists", mount->id); - - XBT_DEBUG("ROUTING Mount '%s' on '%s'",mount->id, mount->name); - - s_mount_t mnt; - mnt.id = surf_storage_resource_by_name(mount->id); - mnt.name = xbt_strdup(mount->name); - - if(!mount_list){ - XBT_DEBUG("Create a Mount list for %s",A_surfxml_host_id); - mount_list = xbt_dynar_new(sizeof(s_mount_t), mount_free); - } - xbt_dynar_push(mount_list,&mnt); -} - static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster) { char *host_id, *groups, *link_id = NULL; @@ -1314,11 +1160,6 @@ void routing_register_callbacks() sg_platf_peer_add_cb(routing_parse_peer); sg_platf_postparse_add_cb(routing_parse_postparse); - sg_platf_storage_add_cb(routing_parse_storage); - sg_platf_mstorage_add_cb(routing_parse_mstorage); - sg_platf_storage_type_add_cb(routing_parse_storage_type); - sg_platf_mount_add_cb(routing_parse_mount); - /* we care about the ASes while parsing the platf. Incredible, isnt it? */ sg_platf_AS_end_add_cb(routing_AS_end); sg_platf_AS_begin_add_cb(routing_AS_begin); diff --git a/src/surf/surfxml_parseplatf.c b/src/surf/surfxml_parseplatf.c index ca7cd6658d..4e5a4a770c 100644 --- a/src/surf/surfxml_parseplatf.c +++ b/src/surf/surfxml_parseplatf.c @@ -138,6 +138,7 @@ void parse_platform_file(const char *file) /* Register classical callbacks */ surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties); + storage_register_callbacks(); routing_register_callbacks(); /* init the flex parser */