Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
manage more cleanly the SIMIX_STORAGE_LEVEL
[simgrid.git] / src / simix / smx_io.c
index 383510b..07a354c 100644 (file)
@@ -1,10 +1,11 @@
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2013. 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 "smx_private.h"
+#include "surf/storage_private.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
 #include "xbt/dict.h"
@@ -14,62 +15,79 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_io, simix,
                                 "Logging specific to SIMIX (io)");
 
 
-//SIMIX FILE READ
-void SIMIX_pre_file_read(smx_simcall_t simcall, void *ptr, size_t size,
-                        size_t nmemb, smx_file_t stream)
+/**
+ * \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_storage_t SIMIX_storage_create(const char *name, void *storage, void *data)
 {
-  smx_action_t action = SIMIX_file_read(simcall->issuer, ptr, size, nmemb, stream);
-  xbt_fifo_push(action->simcalls, simcall);
-  simcall->issuer->waiting_action = action;
+  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_or_null(storage_lib, name, SIMIX_STORAGE_LEVEL);
 }
 
-smx_action_t SIMIX_file_read(smx_process_t process, void* ptr, size_t size, size_t nmemb, smx_file_t stream)
+/**
+ * \brief Internal function to destroy a SIMIX storage.
+ *
+ * \param s the host to destroy (a smx_storage_t)
+ */
+void SIMIX_storage_destroy(void *s)
 {
-  smx_action_t action;
-  smx_host_t host = process->smx_host;
+  smx_storage_priv_t storage = (smx_storage_priv_t) s;
 
-  /* check if the host is active */
-  if (surf_workstation_model->extension.
-      workstation.get_state(host->host) != SURF_RESOURCE_ON) {
-    THROWF(host_error, 0, "Host %s failed, you cannot call this function",
-           host->name);
-  }
+  xbt_assert((storage != NULL), "Invalid parameters");
+  if (storage->data)
+    free(storage->data);
 
-  action = xbt_mallocator_get(simix_global->action_mallocator);
-  action->type = SIMIX_ACTION_IO;
-  action->name = NULL;
-#ifdef HAVE_TRACING
-  action->category = NULL;
-#endif
+  /* Clean storage structure */
+  free(storage);
+}
 
-  action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.read(host->host, ptr, size, nmemb, stream->surf_file);
+void* SIMIX_pre_file_get_data(smx_simcall_t simcall,smx_file_t fd){
+  return SIMIX_file_get_data(fd);
+}
 
-  surf_workstation_model->action_data_set(action->io.surf_io, action);
-  XBT_DEBUG("Create io action %p", action);
+void* SIMIX_file_get_data(smx_file_t fd){
+  xbt_assert((fd != NULL), "Invalid parameters (simix file is NULL)");
 
-  return action;
+  return fd->data;
 }
 
-//SIMIX FILE WRITE
-void SIMIX_pre_file_write(smx_simcall_t simcall, const void *ptr, size_t size,
-                         size_t nmemb, smx_file_t stream)
+void SIMIX_pre_file_set_data(smx_simcall_t simcall, smx_file_t fd, void *data) {
+  SIMIX_file_set_data(fd, data);
+}
+
+void SIMIX_file_set_data(smx_file_t fd, void *data){
+  xbt_assert((fd != NULL), "Invalid parameter");
+
+  fd->data = data;
+}
+
+//SIMIX FILE READ
+void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_storage_size_t size)
 {
-  smx_action_t action = SIMIX_file_write(simcall->issuer, ptr, size, nmemb, stream);
+  smx_action_t action = SIMIX_file_read(simcall->issuer, fd, size);
   xbt_fifo_push(action->simcalls, simcall);
   simcall->issuer->waiting_action = action;
 }
 
-smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, size_t size, size_t nmemb, smx_file_t stream)
+smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_storage_size_t size)
 {
   smx_action_t action;
   smx_host_t host = process->smx_host;
 
   /* check if the host is active */
   if (surf_workstation_model->extension.
-      workstation.get_state(host->host) != SURF_RESOURCE_ON) {
+      workstation.get_state(host) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
-           host->name);
+           sg_host_name(host));
   }
 
   action = xbt_mallocator_get(simix_global->action_mallocator);
@@ -80,7 +98,8 @@ smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, size_t siz
 #endif
 
   action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.write(host->host, ptr, size, nmemb, stream->surf_file);
+  action->io.surf_io =
+      surf_workstation_model->extension.workstation.read(host, fd->surf_file, size);
 
   surf_workstation_model->action_data_set(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
@@ -88,25 +107,24 @@ smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, size_t siz
   return action;
 }
 
-//SIMIX FILE OPEN
-void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount,
-                        const char* path, const char* mode)
+//SIMIX FILE WRITE
+void SIMIX_pre_file_write(smx_simcall_t simcall, smx_file_t fd, sg_storage_size_t size)
 {
-  smx_action_t action = SIMIX_file_open(simcall->issuer, mount, path, mode);
+  smx_action_t action = SIMIX_file_write(simcall->issuer, fd,  size);
   xbt_fifo_push(action->simcalls, simcall);
   simcall->issuer->waiting_action = action;
 }
 
-smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount, const char* path, const char* mode)
+smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_storage_size_t size)
 {
   smx_action_t action;
   smx_host_t host = process->smx_host;
 
   /* check if the host is active */
   if (surf_workstation_model->extension.
-      workstation.get_state(host->host) != SURF_RESOURCE_ON) {
+      workstation.get_state(host) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
-           host->name);
+           sg_host_name(host));
   }
 
   action = xbt_mallocator_get(simix_global->action_mallocator);
@@ -117,7 +135,8 @@ smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount, const cha
 #endif
 
   action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.open(host->host, mount, path, mode);
+  action->io.surf_io =
+      surf_workstation_model->extension.workstation.write(host, fd->surf_file, size);
 
   surf_workstation_model->action_data_set(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
@@ -125,24 +144,26 @@ smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount, const cha
   return action;
 }
 
-//SIMIX FILE CLOSE
-void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fp)
+//SIMIX FILE OPEN
+void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount,
+                         const char* path)
 {
-  smx_action_t action = SIMIX_file_close(simcall->issuer, fp);
+  smx_action_t action = SIMIX_file_open(simcall->issuer, mount, path);
   xbt_fifo_push(action->simcalls, simcall);
   simcall->issuer->waiting_action = action;
 }
 
-smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fp)
+smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount,
+                             const char* path)
 {
   smx_action_t action;
   smx_host_t host = process->smx_host;
 
   /* check if the host is active */
   if (surf_workstation_model->extension.
-      workstation.get_state(host->host) != SURF_RESOURCE_ON) {
+      workstation.get_state(host) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
-           host->name);
+           sg_host_name(host));
   }
 
   action = xbt_mallocator_get(simix_global->action_mallocator);
@@ -153,7 +174,8 @@ smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fp)
 #endif
 
   action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.close(host->host, fp->surf_file);
+  action->io.surf_io =
+      surf_workstation_model->extension.workstation.open(host, mount, path);
 
   surf_workstation_model->action_data_set(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
@@ -161,23 +183,24 @@ smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fp)
   return action;
 }
 
-//SIMIX FILE STAT
-void SIMIX_pre_file_stat(smx_simcall_t simcall, smx_file_t fd, s_file_stat_t *buf)
+//SIMIX FILE CLOSE
+void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fd)
 {
-  smx_action_t action = SIMIX_file_stat(simcall->issuer, fd, *buf);
+  smx_action_t action = SIMIX_file_close(simcall->issuer, fd);
   xbt_fifo_push(action->simcalls, simcall);
   simcall->issuer->waiting_action = action;
 }
 
-smx_action_t SIMIX_file_stat(smx_process_t process, smx_file_t fd, s_file_stat_t buf)
+smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fd)
 {
   smx_action_t action;
   smx_host_t host = process->smx_host;
+
   /* check if the host is active */
   if (surf_workstation_model->extension.
-      workstation.get_state(host->host) != SURF_RESOURCE_ON) {
+      workstation.get_state(host) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
-           host->name);
+           sg_host_name(host));
   }
 
   action = xbt_mallocator_get(simix_global->action_mallocator);
@@ -188,7 +211,7 @@ smx_action_t SIMIX_file_stat(smx_process_t process, smx_file_t fd, s_file_stat_t
 #endif
 
   action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.stat(host->host, fd->surf_file);
+  action->io.surf_io = surf_workstation_model->extension.workstation.close(host, fd->surf_file);
 
   surf_workstation_model->action_data_set(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
@@ -196,39 +219,28 @@ smx_action_t SIMIX_file_stat(smx_process_t process, smx_file_t fd, s_file_stat_t
   return action;
 }
 
+
 //SIMIX FILE UNLINK
-void SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd)
+int SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd)
 {
-  smx_action_t action = SIMIX_file_unlink(simcall->issuer, fd);
-  xbt_fifo_push(action->simcalls, simcall);
-  simcall->issuer->waiting_action = action;
+  return SIMIX_file_unlink(simcall->issuer, fd);
 }
 
-smx_action_t SIMIX_file_unlink(smx_process_t process, smx_file_t fd)
+int SIMIX_file_unlink(smx_process_t process, smx_file_t fd)
 {
-  smx_action_t action;
   smx_host_t host = process->smx_host;
   /* check if the host is active */
   if (surf_workstation_model->extension.
-      workstation.get_state(host->host) != SURF_RESOURCE_ON) {
+      workstation.get_state(host) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
-           host->name);
+           sg_host_name(host));
   }
 
-  action = xbt_mallocator_get(simix_global->action_mallocator);
-  action->type = SIMIX_ACTION_IO;
-  action->name = NULL;
-#ifdef HAVE_TRACING
-  action->category = NULL;
-#endif
-
-  action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.unlink(host->host, fd->surf_file);
-
-  surf_workstation_model->action_data_set(action->io.surf_io, action);
-  XBT_DEBUG("Create io action %p", action);
-
-  return action;
+  if (surf_workstation_model->extension.workstation.unlink(host, fd->surf_file)){
+    xbt_free(fd);
+    return 1;
+  } else
+    return 0;
 }
 
 //SIMIX FILE LS
@@ -244,9 +256,9 @@ smx_action_t SIMIX_file_ls(smx_process_t process, const char* mount, const char
   smx_action_t action;
   smx_host_t host = process->smx_host;
   /* check if the host is active */
-  if (surf_workstation_model->extension.workstation.get_state(host->host) != SURF_RESOURCE_ON) {
+  if (surf_workstation_model->extension.workstation.get_state(host) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
-           host->name);
+           sg_host_name(host));
   }
 
   action = xbt_mallocator_get(simix_global->action_mallocator);
@@ -257,32 +269,118 @@ smx_action_t SIMIX_file_ls(smx_process_t process, const char* mount, const char
 #endif
 
   action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.ls(host->host,mount,path);
+  action->io.surf_io = surf_workstation_model->extension.workstation.ls(host,mount,path);
 
   surf_workstation_model->action_data_set(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
   return action;
 }
 
-static void free_file_stat(void *p)
+sg_storage_size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd)
+{
+  return SIMIX_file_get_size(simcall->issuer, fd);
+}
+
+sg_storage_size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd)
+{
+  smx_host_t host = process->smx_host;
+  return  surf_workstation_model->extension.workstation.get_size(host,
+      fd->surf_file);
+}
+
+xbt_dynar_t SIMIX_pre_file_get_info(smx_simcall_t simcall, smx_file_t fd)
 {
-  file_stat_t fs = p;
-  xbt_free(fs->date);
-  xbt_free(fs->group);
-  xbt_free(fs->time);
-  xbt_free(fs->user);
-  xbt_free(fs->user_rights);
-  xbt_free(fs);
+  return SIMIX_file_get_info(simcall->issuer, fd);
+}
+
+xbt_dynar_t SIMIX_file_get_info(smx_process_t process, smx_file_t fd)
+{
+  smx_host_t host = process->smx_host;
+  return  surf_workstation_model->extension.workstation.get_info(host,
+      fd->surf_file);
+}
+
+sg_storage_size_t SIMIX_pre_storage_get_free_size(smx_simcall_t simcall, const char* name)
+{
+  return SIMIX_storage_get_free_size(simcall->issuer, name);
+}
+
+sg_storage_size_t SIMIX_storage_get_free_size(smx_process_t process, const char* name)
+{
+  smx_host_t host = process->smx_host;
+  return  surf_workstation_model->extension.workstation.get_free_size(host,name);
+}
+
+sg_storage_size_t SIMIX_pre_storage_get_used_size(smx_simcall_t simcall, const char* name)
+{
+  return SIMIX_storage_get_used_size(simcall->issuer, name);
+}
+
+sg_storage_size_t SIMIX_storage_get_used_size(smx_process_t process, const char* name)
+{
+  smx_host_t host = process->smx_host;
+  return  surf_workstation_model->extension.workstation.get_used_size(host,name);
+}
+
+xbt_dict_t SIMIX_pre_storage_get_properties(smx_simcall_t simcall, smx_storage_t storage){
+  return SIMIX_storage_get_properties(storage);
+}
+xbt_dict_t SIMIX_storage_get_properties(smx_storage_t storage){
+  xbt_assert((storage != NULL), "Invalid parameters (simix storage is NULL)");
+  return surf_storage_model->extension.storage.get_properties(storage);
+}
+
+const char* SIMIX_pre_storage_get_name(smx_simcall_t simcall, smx_storage_t storage){
+   return SIMIX_storage_get_name(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;
+}
+
+xbt_dict_t SIMIX_pre_storage_get_content(smx_simcall_t simcall, smx_storage_t storage){
+  return SIMIX_storage_get_content(storage);
+}
+
+xbt_dict_t SIMIX_storage_get_content(smx_storage_t storage){
+  xbt_assert((storage != NULL), "Invalid parameters (simix storage is NULL)");
+  return surf_storage_model->extension.storage.get_content(storage);
+}
+
+sg_storage_size_t SIMIX_storage_get_size(smx_storage_t storage){
+  xbt_assert((storage != NULL), "Invalid parameters (simix storage is NULL)");
+  return surf_storage_model->extension.storage.get_size(storage);
 }
 
 void SIMIX_post_io(smx_action_t action)
 {
   xbt_fifo_item_t i;
   smx_simcall_t simcall;
-  char* key;
-  xbt_dict_cursor_t cursor = NULL;
-  s_file_stat_t *dst = NULL;
-  s_file_stat_t *src = NULL;
+//  char* key;
+//  xbt_dict_cursor_t cursor = NULL;
+//  s_file_stat_t *dst = NULL;
+//  s_file_stat_t *src = NULL;
 
   xbt_fifo_foreach(action->simcalls,i,simcall,smx_simcall_t) {
     switch (simcall->call) {
@@ -293,7 +391,7 @@ void SIMIX_post_io(smx_action_t action)
       break;
 
     case SIMCALL_FILE_CLOSE:
-      xbt_free(simcall_file_close__get__fp(simcall));
+      xbt_free(simcall_file_close__get__fd(simcall));
       simcall_file_close__set__result(simcall, 0);
       break;
 
@@ -305,30 +403,17 @@ void SIMIX_post_io(smx_action_t action)
       simcall_file_read__set__result(simcall, (action->io.surf_io)->cost);
       break;
 
-    case SIMCALL_FILE_STAT:
-      simcall_file_stat__set__result(simcall, 0);
-      dst = simcall_file_stat__get__buf(simcall);
-      src = &((action->io.surf_io)->stat);
-      file_stat_copy(src,dst);
-      break;
-
-    case SIMCALL_FILE_UNLINK:
-      xbt_free(simcall_file_unlink__get__fd(simcall));
-      simcall_file_unlink__set__result(simcall, 0);
-      break;
-
     case SIMCALL_FILE_LS:
-      xbt_dict_foreach((action->io.surf_io)->ls_dict,cursor,key, src){
-        // if there is a stat we have to duplicate it
-        if(src){
-          dst = xbt_new0(s_file_stat_t,1);
-          file_stat_copy(src, dst);
-          xbt_dict_set((action->io.surf_io)->ls_dict,key,dst,free_file_stat);
-        }
-      }
+//      xbt_dict_foreach((action->io.surf_io)->ls_dict,cursor,key, src){
+//        // if there is a stat we have to duplicate it
+//        if(src){
+//          dst = xbt_new0(s_file_stat_t,1);
+//          file_stat_copy(src, dst);
+//          xbt_dict_set((action->io.surf_io)->ls_dict,key,dst,xbt_free);
+//        }
+//      }
       simcall_file_ls__set__result(simcall, (action->io.surf_io)->ls_dict);
       break;
-
     default:
       break;
     }
@@ -387,7 +472,7 @@ void SIMIX_io_finish(smx_action_t action)
     }
 
     if (surf_workstation_model->extension.
-        workstation.get_state(simcall->issuer->smx_host->host) != SURF_RESOURCE_ON) {
+        workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) {
       simcall->issuer->context->iwannadie = 1;
     }