Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
MSG storage API improvements
authorPierre Veyre <pierre.veyre@cc.in2p3.fr>
Wed, 18 Sep 2013 08:55:11 +0000 (10:55 +0200)
committerPierre Veyre <pierre.veyre@cc.in2p3.fr>
Wed, 18 Sep 2013 08:55:11 +0000 (10:55 +0200)
18 files changed:
include/msg/datatypes.h
include/msg/msg.h
include/simdag/datatypes.h
include/simgrid/platf.h
include/simgrid/simix.h
include/surf/surf_routing.h
src/msg/msg_environment.c
src/msg/msg_global.c
src/msg/msg_io.c
src/msg/msg_private.h
src/simdag/private.h
src/simdag/sd_global.c
src/simdag/sd_workstation.c
src/simix/smx_environment.c
src/simix/smx_io.c
src/simix/smx_io_private.h
src/simix/smx_private.h
src/surf/surf_routing.c

index c844ad1..241d649 100644 (file)
@@ -125,15 +125,26 @@ typedef struct msg_file {
 typedef struct msg_file *msg_file_t;
 
 /* ******************************** Storage ************************************ */
-typedef struct simdata_storage *simdata_storage_t;
-
-typedef struct msg_storage {
-  char *name;
-  simdata_storage_t simdata;    /**< @brief simulator data  */
-  void *data;                   /**< @brief user data */
-} s_msg_storage_t;
-
-typedef struct msg_storage *msg_storage_t;
+/* TODO: PV: to comment */
+
+extern int MSG_STORAGE_LEVEL;
+
+typedef xbt_dictelm_t msg_storage_t;
+typedef s_xbt_dictelm_t s_msg_storage_t;
+
+typedef struct msg_storage_priv {
+/* TODO PV: fill it (or not) ! */
+} s_msg_storage_priv_t, *msg_storage_priv_t;
+
+//typedef struct simdata_storage *simdata_storage_t;
+//
+//typedef struct msg_storage {
+//  char *name;
+//  simdata_storage_t simdata;    /**< @brief simulator data  */
+//  void *data;                   /**< @brief user data */
+//} s_msg_storage_t;
+//
+//typedef struct msg_storage *msg_storage_t;
 
 /*************** Begin GPU ***************/
 typedef struct simdata_gpu_task *simdata_gpu_task_t;
index 50104e4..55685ad 100644 (file)
@@ -92,11 +92,15 @@ XBT_PUBLIC(xbt_dict_t) MSG_file_ls(const char *mount, const char *path);
 XBT_PUBLIC(void) __MSG_file_get_info(msg_file_t fd);
 
 /************************** Storage handling ***********************************/
+XBT_PUBLIC(msg_host_t) MSG_get_storage_by_name(const char *name);
+XBT_PUBLIC(const char *) MSG_storage_get_name(msg_storage_t storage);
 XBT_PUBLIC(size_t) MSG_storage_get_free_size(const char* name);
 XBT_PUBLIC(size_t) MSG_storage_get_used_size(const char* name);
 XBT_PUBLIC(msg_storage_t) MSG_storage_get_by_name(const char *name);
 XBT_PUBLIC(xbt_dict_t) MSG_storage_get_properties(msg_storage_t storage);
 XBT_PUBLIC(xbt_dynar_t) MSG_storages_as_dynar(void);
+XBT_PUBLIC(msg_error_t) MSG_storage_set_data(msg_storage_t host, void *data);
+XBT_PUBLIC(void *) MSG_storage_get_data(msg_storage_t storage);
 /************************** AS Router handling ************************************/
 XBT_PUBLIC(const char *) MSG_as_router_get_property_value(const char* asr, const char *name);
 XBT_PUBLIC(xbt_dict_t) MSG_as_router_get_properties(const char* asr);
index 40fa48b..092d30c 100644 (file)
@@ -89,4 +89,12 @@ typedef enum {
 } e_SD_task_kind_t;
 
 
+/** @brief Storage datatype
+    @ingroup SD_datatypes_management
+
+ TODO PV: comment it !
+
+    @see SD_storage_management */
+typedef xbt_dictelm_t SD_storage_t;
+
 #endif
index 9b6d970..9017c61 100644 (file)
@@ -75,6 +75,12 @@ static inline char* sg_host_name(sg_host_t host) {
   return host->key;
 }
 
+typedef xbt_dictelm_t sg_storage_t;
+static inline char* sg_storage_name(sg_storage_t storage) {
+  return storage->key;
+}
+
+
 
 /*
  * Platform creation functions. Instead of passing 123 arguments to the creation functions
index 9692cbd..fdd78b7 100644 (file)
@@ -68,10 +68,12 @@ 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;
 
 /********************************** Storage *************************************/
-typedef struct s_smx_storage *smx_storage_t;
+typedef xbt_dictelm_t smx_storage_t;
+typedef struct s_smx_storage_priv *smx_storage_priv_t;
 
 /********************************** Action *************************************/
 typedef struct s_smx_action *smx_action_t; /* FIXME: replace by specialized action handlers */
@@ -262,6 +264,7 @@ XBT_PUBLIC(void*) SIMIX_host_self_get_data(void);
 XBT_PUBLIC(void*) SIMIX_host_get_data(smx_host_t host);
 XBT_PUBLIC(void) SIMIX_host_set_data(smx_host_t host, void *data);
 XBT_PUBLIC(xbt_dynar_t) SIMIX_host_get_storage_list(smx_host_t host);
+XBT_PUBLIC(const char*) SIMIX_storage_get_name(smx_host_t host);
 
 /********************************* Process ************************************/
 XBT_PUBLIC(int) SIMIX_process_count(void);
@@ -492,6 +495,8 @@ XBT_PUBLIC(xbt_dynar_t) simcall_file_get_info(smx_file_t fd);
 XBT_PUBLIC(size_t) simcall_storage_get_free_size (const char* name);
 XBT_PUBLIC(size_t) simcall_storage_get_used_size (const char* name);
 XBT_PUBLIC(xbt_dict_t) simcall_storage_get_properties(smx_storage_t storage);
+XBT_PUBLIC(void*) SIMIX_storage_get_data(smx_storage_t storage);
+XBT_PUBLIC(void) SIMIX_storage_set_data(smx_storage_t storage, void *data);
 
 /************************** AS router   **********************************/
 XBT_PUBLIC(xbt_dict_t) SIMIX_asr_get_properties(const char *name);
index 86379ba..7b16a41 100644 (file)
@@ -14,9 +14,11 @@ XBT_PUBLIC(xbt_lib_t) host_lib;
 XBT_PUBLIC(int) ROUTING_HOST_LEVEL; //Routing level
 XBT_PUBLIC(int)  SURF_CPU_LEVEL;    //Surf cpu level
 XBT_PUBLIC(int) SURF_WKS_LEVEL;    //Surf workstation level
-XBT_PUBLIC(int) SIMIX_HOST_LEVEL;  //Simix level
+XBT_PUBLIC(int) SIMIX_HOST_LEVEL;  //Simix host level
+XBT_PUBLIC(int) SIMIX_STORAGE_LEVEL;  //Simix storage level
 XBT_PUBLIC(int)  MSG_HOST_LEVEL;    //Msg level
-XBT_PUBLIC(int)  SD_HOST_LEVEL;    //Simdag level
+XBT_PUBLIC(int)  SD_HOST_LEVEL;    //Simdag host level
+XBT_PUBLIC(int)  SD_STORAGE_LEVEL;    //Simdag storage level
 XBT_PUBLIC(int)  COORD_HOST_LEVEL;  //Coordinates level
 XBT_PUBLIC(int) NS3_HOST_LEVEL;    //host node for ns3
 
@@ -34,7 +36,7 @@ XBT_PUBLIC(int) ROUTING_PROP_ASR_LEVEL; //Properties for AS and router
 XBT_PUBLIC(xbt_lib_t) storage_lib;
 XBT_PUBLIC(int) ROUTING_STORAGE_LEVEL;        //Routing storage level
 XBT_PUBLIC(int) ROUTING_STORAGE_HOST_LEVEL;
-XBT_PUBLIC(int) SURF_STORAGE_LEVEL;
+XBT_PUBLIC(int) SURF_STORAGE_LEVEL;  // Surf storage level
 
 XBT_PUBLIC(xbt_lib_t) storage_type_lib;
 XBT_PUBLIC(int) ROUTING_STORAGE_TYPE_LEVEL;   //Routing storage_type level
index 77c8761..730e54f 100644 (file)
@@ -47,6 +47,13 @@ void MSG_post_create_environment(void) {
     if(data[SIMIX_HOST_LEVEL])
       __MSG_host_create(xbt_dict_cursor_get_elm(cursor));
   }
+
+  /* Initialize MSG storages */
+  xbt_lib_foreach(storage_lib, cursor, name, data) {
+    if(data[SIMIX_STORAGE_LEVEL])
+      __MSG_storage_create(xbt_dict_cursor_get_elm(cursor));
+  }
+
 }
 
 msg_as_t MSG_environment_get_routing_root() {
index 0a1f1d6..f57aeaa 100644 (file)
@@ -71,6 +71,7 @@ void MSG_init_nocheck(int *argc, char **argv) {
 
   XBT_DEBUG("ADD MSG LEVELS");
   MSG_HOST_LEVEL = xbt_lib_add_level(host_lib, (void_f_pvoid_t) __MSG_host_destroy);
+  MSG_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, (void_f_pvoid_t) __MSG_storage_destroy);
 
   atexit(MSG_exit);
 }
index 1c1fdd6..10a6d67 100644 (file)
@@ -186,6 +186,43 @@ xbt_dict_t MSG_file_ls(const char *mount, const char *path)
  *
  */
 
+
+/* TODO: PV: to comment */
+msg_storage_t __MSG_storage_create(smx_storage_t storage)
+{
+  const char *name = SIMIX_storage_get_name(storage);
+  xbt_lib_set(storage_lib,name,MSG_HOST_LEVEL,storage);
+  return xbt_lib_get_elm_or_null(storage_lib, name);
+}
+
+/*
+ * \brief Destroys a storage (internal call only)
+ */
+void __MSG_storage_destroy(msg_storage_priv_t storage) {
+
+  free(storage);
+}
+
+/** \ingroup msg_storage_management
+ *
+ * \brief Returns the name of the #msg_storage_t.
+ *
+ * This functions checks whether a storage is a valid pointer or not and return its name.
+ */
+const char *MSG_storage_get_name(msg_storage_t storage) {
+  return SIMIX_storage_get_name(storage);
+}
+
+/** \ingroup msg_storage_management
+ * \brief Finds a msg_storage_t using its name.
+ * \param name the name of a storage.
+ * \return the corresponding storage
+ */
+msg_host_t MSG_get_storage_by_name(const char *name)
+{
+  return (msg_storage_t) xbt_lib_get_elm_or_null(storage_lib,name);
+}
+
 /** \ingroup msg_storage_management
  * \brief Returns the free space size of a storage element
  * \param the storage name (#char*)
@@ -212,7 +249,7 @@ size_t MSG_storage_get_used_size(const char* name){
 xbt_dict_t MSG_storage_get_properties(msg_storage_t storage)
 {
   xbt_assert((storage != NULL), "Invalid parameters (storage is NULL)");
-  return (simcall_storage_get_properties(storage->simdata->smx_storage));
+  return (simcall_storage_get_properties(storage));
 }
 
 /** \ingroup msg_storage_management
@@ -228,9 +265,6 @@ msg_storage_t MSG_storage_get_by_name(const char *name)
 /** \ingroup msg_storage_management
  * \brief Returns a dynar containing all the storage elements declared at a given point of time
  *
- *
- *
- * @TODO implement a new msg_storage_t structure that hides members (use xbt_dict)
  */
 xbt_dynar_t MSG_storages_as_dynar(void) {
 
@@ -238,19 +272,49 @@ xbt_dynar_t MSG_storages_as_dynar(void) {
   char *key;
   void **data;
   xbt_dynar_t res = xbt_dynar_new(sizeof(msg_storage_t),NULL);
-  msg_storage_t storage;
+
   xbt_lib_foreach(storage_lib, cursor, key, data) {
-    if(routing_get_network_element_type(key) == ROUTING_STORAGE_LEVEL) {
+    if(routing_get_network_element_type(key) == MSG_STORAGE_LEVEL) {
       xbt_dictelm_t elm = xbt_dict_cursor_get_elm(cursor);
-      storage = xbt_new(s_msg_storage_t, 1);
-      storage->name = elm->key;
-      storage->simdata = xbt_new0(s_simdata_storage_t,1);
-      smx_storage_t simix_storage = xbt_lib_get_or_null(storage_lib, elm->key, SURF_STORAGE_LEVEL);
-      storage->simdata->smx_storage = simix_storage;
-      storage->data = NULL;
-      xbt_dynar_push(res, &storage);
+      xbt_dynar_push(res, &elm);
     }
   }
 
   return res;
 }
+
+/** \ingroup msg_storage_management
+ *
+ * \brief Set the user data of a #msg_storage_t.
+ * This functions checks whether some data has already been associated to \a storage
+   or not and attach \a data to \a storage if it is possible.
+ */
+msg_error_t MSG_storage_set_data(msg_storage_t storage, void *data)
+{
+  SIMIX_storage_set_data(storage,data);
+
+  return MSG_OK;
+}
+
+
+
+/** \ingroup msg_host_management
+ *
+ * \brief Return the user data of a #msg_storage_t.
+ *
+ * This functions checks whether \a storage is a valid pointer or not and return
+   the user data associated to \a storage if it is possible.
+ */
+void *MSG_storage_get_data(msg_storage_t storage)
+{
+  return SIMIX_storage_get_data(storage);
+}
+
+
+
+
+
+
+
+
+
index f9edb11..412e6a7 100644 (file)
@@ -141,7 +141,9 @@ XBT_PUBLIC_DATA(MSG_Global_t) msg_global;
 #endif
 
 msg_host_t __MSG_host_create(smx_host_t workstation);
+msg_storage_t __MSG_storage_create(smx_storage_t storage);
 void __MSG_host_destroy(msg_host_priv_t host);
+void __MSG_storage_destroy(msg_storage_priv_t host);
 
 void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc);
 void MSG_process_create_from_SIMIX(smx_process_t *process, const char *name,
index e48de28..19a9022 100644 (file)
@@ -69,6 +69,13 @@ static inline SD_workstation_priv_t SD_workstation_priv(SD_workstation_t host){
   return xbt_lib_get_level(host, SD_HOST_LEVEL);
 }
 
+/* Storage */
+typedef s_xbt_dictelm_t s_SD_storage_t;
+typedef struct SD_storage {
+  void *data;                   /* user data */
+} s_SD_storage_priv_t, *SD_storage_priv_t;
+
+
 /* Task */
 typedef struct SD_task {
   s_xbt_swag_hookup_t state_hookup;
@@ -199,6 +206,11 @@ static XBT_INLINE int __SD_task_is_running(SD_task_t task)
 {
   return task->state_set == sd_global->running_task_set;
 }
+
+/********** Storage **********/
+SD_storage_t __SD_storage_create(void *surf_storage, void *data);
+void __SD_storage_destroy(void *storage);
+
 /********** Tracing **********/
 /* declaration of instrumentation functions from sd_task_instr.c */
 void TRACE_sd_task_create(SD_task_t task);
index 98de7a6..8329d4f 100644 (file)
@@ -95,6 +95,7 @@ void SD_init(int *argc, char **argv)
   XBT_DEBUG("ADD SD LEVELS");
   SD_HOST_LEVEL = xbt_lib_add_level(host_lib,__SD_workstation_destroy);
   SD_LINK_LEVEL = xbt_lib_add_level(link_lib,__SD_link_destroy);
+  SD_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,__SD_storage_destroy);
 }
 
 /** \brief set a configuration variable
@@ -204,10 +205,11 @@ void SD_create_environment(const char *platform_file)
   char *name = NULL;
   void **surf_workstation = NULL;
   void **surf_link = NULL;
+  void **surf_storage = NULL;
 
   parse_platform_file(platform_file);
 
-  /* now let's create the SD wrappers for workstations and links */
+  /* now let's create the SD wrappers for workstations, storages and links */
   xbt_lib_foreach(host_lib, cursor, name, surf_workstation){
     if(surf_workstation[SURF_WKS_LEVEL])
       __SD_workstation_create(surf_workstation[SURF_WKS_LEVEL], NULL);
@@ -218,6 +220,12 @@ void SD_create_environment(const char *platform_file)
     __SD_link_create(surf_link[SURF_LINK_LEVEL], NULL);
   }
 
+  xbt_lib_foreach(storage_lib, cursor, name, surf_storage) {
+  if(surf_storage[SURF_LINK_LEVEL])
+    __SD_storage_create(surf_link[SURF_STORAGE_LEVEL], NULL);
+  }
+
+
   XBT_DEBUG("Workstation number: %d, link number: %d",
          SD_workstation_get_number(), SD_link_get_number());
 #ifdef HAVE_JEDULE
index 3dbc6c0..1936cb7 100644 (file)
@@ -37,6 +37,29 @@ SD_workstation_t __SD_workstation_create(void *surf_workstation,
   return xbt_lib_get_elm_or_null(host_lib,name);
 }
 
+/* Creates a storage and registers it in SD.
+ */
+SD_storage_t __SD_storage_create(void *surf_storage, void *data)
+{
+
+  SD_storage_priv_t storage;
+  const char *name;
+
+  storage = xbt_new(s_SD_storage_priv_t, 1);
+  storage->data = data;     /* user data */
+
+  name = surf_resource_name(surf_storage);
+  xbt_lib_set(storage_lib,name, SD_STORAGE_LEVEL, storage);
+  return xbt_lib_get_elm_or_null(storage_lib, name);
+}
+
+/* Destroys a storage.
+ */
+void __SD_storage_destroy(void *storage)
+{
+  xbt_free(storage);
+}
+
 /**
  * \brief Returns a workstation given its name
  *
index dd4709a..82ceb98 100644 (file)
@@ -45,12 +45,21 @@ void SIMIX_create_environment(const char *file)
 void SIMIX_post_create_environment(void) {
 
   void **workstation = NULL;
+  void **storage = NULL;
   xbt_lib_cursor_t cursor = NULL;
   char *name = NULL;
 
+  /* Create host at SIMIX level */
   xbt_lib_foreach(host_lib, cursor, name, workstation) {
     if(workstation[SURF_WKS_LEVEL])
       SIMIX_host_create(name, workstation[SURF_WKS_LEVEL], NULL);
   }
+
+  /* Create storage at SIMIX level */
+  xbt_lib_foreach(storage_lib, cursor, name, storage) {
+    if(storage[SURF_STORAGE_LEVEL])
+      SIMIX_storage_create(name, storage[SURF_STORAGE_LEVEL], NULL);
+  }
+
   surf_presolve();
 }
index 3561716..daa80e5 100644 (file)
@@ -15,6 +15,24 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_io, simix,
                                 "Logging specific to SIMIX (io)");
 
 
+/**
+ * \brief Internal function to create a SIMIX storage.
+ * \param name name of the storage to create
+ * \param storage the SURF storage to encapsulate
+ * \param data some user data (may be NULL)
+ */
+smx_host_t SIMIX_storage_create(const char *name, void *storage, void *data)
+{
+  smx_storage_priv_t smx_storage = xbt_new0(s_smx_storage_priv_t, 1);
+
+  smx_storage->data = data;
+
+  /* Update global variables */
+  xbt_lib_set(storage_lib,name,SIMIX_STORAGE_LEVEL,smx_storage);
+  return xbt_lib_get_elm_or_null(storage_lib, name);
+}
+
+
 void* SIMIX_pre_file_get_data(smx_simcall_t simcall,smx_file_t fd){
   return SIMIX_file_get_data(fd);
 }
@@ -301,6 +319,31 @@ xbt_dict_t SIMIX_storage_get_properties(smx_storage_t storage){
   return surf_storage_model->extension.storage.get_properties(storage);
 }
 
+const char* SIMIX_storage_get_name(smx_storage_t storage){
+  xbt_assert((storage != NULL), "Invalid parameters");
+
+  return sg_storage_name(storage);
+}
+
+void SIMIX_pre_storage_set_data(smx_simcall_t simcall, smx_storage_t storage, void *data) {
+  SIMIX_storage_set_data(storage, data);
+}
+void SIMIX_storage_set_data(smx_storage_t storage, void *data){
+  xbt_assert((storage != NULL), "Invalid parameters");
+  xbt_assert((SIMIX_storage_priv(storage)->data == NULL), "Data already set");
+
+  SIMIX_storage_priv(storage)->data = data;
+}
+
+void* SIMIX_pre_storage_get_data(smx_simcall_t simcall,smx_storage_t storage){
+  return SIMIX_storage_get_data(storage);
+}
+void* SIMIX_storage_get_data(smx_storage_t storage){
+  xbt_assert((storage != NULL), "Invalid parameters (simix storage is NULL)");
+
+  return SIMIX_storage_priv(storage)->data;
+}
+
 void SIMIX_post_io(smx_action_t action)
 {
   xbt_fifo_item_t i;
index 584adc4..f2496b9 100644 (file)
 #include "simgrid/simix.h"
 #include "smx_smurf_private.h"
 
+static inline smx_storage_priv_t SIMIX_storage_priv(smx_storage_t storage){
+  return xbt_lib_get_level(storage, SIMIX_STORAGE_LEVEL);
+}
+
+smx_storage_t SIMIX_storage_create(const char *name, void *storage, void *data);
 void* SIMIX_pre_file_get_data(smx_simcall_t simcall,smx_file_t fd);
 void SIMIX_pre_file_set_data(smx_simcall_t simcall, smx_file_t fd, void *data);
 void SIMIX_pre_file_read(smx_simcall_t simcall, size_t size, smx_file_t fd);
@@ -47,6 +52,9 @@ size_t SIMIX_storage_get_used_size(smx_process_t process,const char* name);
 xbt_dict_t SIMIX_storage_get_properties(smx_storage_t storage);
 xbt_dict_t SIMIX_pre_storage_get_properties(smx_simcall_t, smx_storage_t);
 
+void SIMIX_pre_storage_set_data(smx_simcall_t, smx_storage_t, void*);
+void* SIMIX_pre_storage_get_data(smx_simcall_t, smx_storage_t);
+
 void SIMIX_post_io(smx_action_t action);
 void SIMIX_io_destroy(smx_action_t action);
 void SIMIX_io_finish(smx_action_t action);
index ef74169..b0845e6 100644 (file)
@@ -76,10 +76,10 @@ typedef struct s_smx_file {
   void* data;                   /**< @brief user data */
 } s_smx_file_t;
 
-/* ******************************** Storage ************************************ */
-typedef struct s_smx_storage {
-  surf_storage_t surf_storage;
-} s_smx_storage_t;
+/* ******************************** Storage ************************************/
+typedef struct s_smx_storage_priv {
+  void *data;              /**< @brief user data */
+} s_smx_storage_priv_t;
 
 /*********************************** Time ************************************/
 
index e10de03..5d6b8b5 100644 (file)
@@ -19,10 +19,12 @@ xbt_lib_t host_lib;
 int ROUTING_HOST_LEVEL;         //Routing level
 int SURF_CPU_LEVEL;             //Surf cpu level
 int SURF_WKS_LEVEL;             //Surf workstation level
-int SIMIX_HOST_LEVEL;           //Simix level
-int SIMIX_STORAGE_LEVEL;           //Simix level
+int SIMIX_HOST_LEVEL;           //Simix host level
+int SIMIX_STORAGE_LEVEL;        //Simix storage level
 int MSG_HOST_LEVEL;             //Msg host level
-int SD_HOST_LEVEL;              //Simdag level
+int MSG_STORAGE_LEVEL;          //Msg storage level
+int SD_HOST_LEVEL;              //Simdag host level
+int SD_STORAGE_LEVEL;           //Simdag storage level
 int COORD_HOST_LEVEL=0;         //Coordinates level
 int NS3_HOST_LEVEL;             //host node for ns3