Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : MUTEX_UNLOCK is invisible for MC
[simgrid.git] / src / surf / storage_n11.cpp
index c5395d6..0449320 100644 (file)
@@ -6,7 +6,7 @@
 
 #include "storage_n11.hpp"
 #include "surf_private.h"
-
+#include <math.h> /*ceil*/
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_storage);
 
 static int storage_selective_update = 0;
@@ -68,7 +68,7 @@ static void parse_storage_init(sg_platf_storage_cbarg_t storage)
       storage->content_type,
       storage->properties);
 
-  surf_storage_model->createResource(storage->id,
+  surf_storage_model->createStorage(storage->id,
                                      ((storage_type_t) stype)->type_id,
                                      storage->content,
                                      storage->content_type,
@@ -195,7 +195,7 @@ static void storage_define_callbacks()
 
 void storage_register_callbacks() {
 
-  ROUTING_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,xbt_free);
+  ROUTING_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, xbt_free_f);
   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_storage_resource_free);
@@ -234,8 +234,9 @@ StorageN11Model::~StorageN11Model(){
   storage_running_action_set_that_does_not_need_being_checked = NULL;
 }
 
-StoragePtr StorageN11Model::createResource(const char* id, const char* type_id,
-               const char* content_name, const char* content_type, xbt_dict_t properties, const char* attach)
+StoragePtr StorageN11Model::createStorage(const char* id, const char* type_id,
+    const char* content_name, const char* content_type, xbt_dict_t properties,
+    const char* attach)
 {
 
   xbt_assert(!surf_storage_resource_priv(surf_storage_resource_by_name(id)),
@@ -249,10 +250,10 @@ StoragePtr StorageN11Model::createResource(const char* id, const char* type_id,
   double Bconnection   = surf_parse_get_bandwidth((char*)xbt_dict_get(storage_type->model_properties, "Bconnection"));
 
   StoragePtr storage = new StorageN11(this, id, properties, p_maxminSystem,
-                 Bread, Bwrite, Bconnection,
-                 type_id, (char *)content_name, xbt_strdup(content_type), storage_type->size, (char *) attach);
+      Bread, Bwrite, Bconnection, type_id, (char *)content_name,
+      xbt_strdup(content_type), storage_type->size, (char *) attach);
 
-  xbt_lib_set(storage_lib, id, SURF_STORAGE_LEVEL, static_cast<ResourcePtr>(storage));
+  xbt_lib_set(storage_lib, id, SURF_STORAGE_LEVEL, storage);
 
   XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s'\n\t\tproperties '%p'\n\t\tBread '%f'\n",
       id,
@@ -261,7 +262,7 @@ StoragePtr StorageN11Model::createResource(const char* id, const char* type_id,
       Bread);
 
   if(!p_storageList)
-       p_storageList = xbt_dynar_new(sizeof(char *),NULL);
+    p_storageList = xbt_dynar_new(sizeof(char *),NULL);
   xbt_dynar_push(p_storageList, &storage);
 
   return storage;
@@ -305,17 +306,34 @@ void StorageN11Model::updateActionsState(double /*now*/, double delta)
      ; it != itend ; it=itNext) {
     ++itNext;
     action = static_cast<StorageActionPtr>(&*it);
+
     if(action->m_type == WRITE)
     {
       // Update the disk usage
-     // Update the file size
-     // For each action of type write
-      double rate = lmm_variable_getvalue(action->getVariable());
-      /* Hack to avoid rounding differences between x86 and x86_64
-       * (note that the next sizes are of type sg_size_t). */
-      long incr = delta * rate + MAXMIN_PRECISION;
+      // Update the file size
+      // For each action of type write
+      volatile double current_progress =
+          delta * lmm_variable_getvalue(action->getVariable());
+      long int incr = current_progress;
+
+      XBT_DEBUG("%s:\n\t progress =  %.2f, current_progress = %.2f, "
+                "incr = %ld, lrint(1) = %ld, lrint(2) = %ld",
+                action->p_file->name,
+                action->progress,  current_progress, incr,
+                lrint(action->progress + current_progress),
+                lrint(action->progress)+ incr);
+
+      /* take care of rounding error accumulation */
+      if (lrint(action->progress + current_progress) >
+          lrint(action->progress)+ incr)
+        incr++;
+
+      action->progress +=current_progress;
+
       action->p_storage->m_usedSize += incr; // disk usage
-      action->p_file->size += incr; // file size
+      action->p_file->current_position+= incr; // current_position
+      //  which becomes the new file size
+      action->p_file->size = action->p_file->current_position ;
 
       sg_size_t *psize = xbt_new(sg_size_t,1);
       *psize = action->p_file->size;
@@ -353,69 +371,26 @@ void StorageN11Model::updateActionsState(double /*now*/, double delta)
  * Resource *
  ************/
 
-StorageN11::StorageN11(StorageModelPtr model, const char* name, xbt_dict_t properties,
-            lmm_system_t maxminSystem, double bread, double bwrite, double bconnection,
-            const char* type_id, char *content_name, char *content_type, sg_size_t size, char *attach)
+StorageN11::StorageN11(StorageModelPtr model, const char* name,
+    xbt_dict_t properties, lmm_system_t maxminSystem, double bread,
+    double bwrite, double bconnection, const char* type_id, char *content_name,
+    char *content_type, sg_size_t size, char *attach)
  : Storage(model, name, properties,
           maxminSystem, bread, bwrite, bconnection, type_id, content_name, content_type, size, attach) {
   XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%llu'", bconnection, bread, bwrite, size);
 }
 
-StorageActionPtr StorageN11::ls(const char* path)
-{
-  StorageActionPtr action = new StorageN11Action(getModel(), 0, getState() != SURF_RESOURCE_ON, this, LS);
-
-  action->p_lsDict = NULL;
-  xbt_dict_t ls_dict = xbt_dict_new_homogeneous(xbt_free);
-
-  char* key;
-  sg_size_t size = 0;
-  xbt_dict_cursor_t cursor = NULL;
-
-  xbt_dynar_t dyn = NULL;
-  char* file = NULL;
-
-  // for each file in the storage content
-  xbt_dict_foreach(p_content,cursor,key,size){
-    // Search if file start with the prefix 'path'
-    if(xbt_str_start_with(key,path)){
-      file = &key[strlen(path)];
-
-      // Split file with '/'
-      dyn = xbt_str_split(file,"/");
-      file = xbt_dynar_get_as(dyn,0,char*);
-
-      // file
-      if(xbt_dynar_length(dyn) == 1){
-        sg_size_t *psize = xbt_new(sg_size_t, 1);
-        *psize=size;
-        xbt_dict_set(ls_dict, file, psize, NULL);
-      }
-      // Directory
-      else
-      {
-        // if directory does not exist yet in the dictionary
-        if(!xbt_dict_get_or_null(ls_dict,file))
-          xbt_dict_set(ls_dict,file,NULL,NULL);
-      }
-      xbt_dynar_free(&dyn);
-    }
-  }
-
-  action->p_lsDict = ls_dict;
-  return action;
-}
-
 StorageActionPtr StorageN11::open(const char* mount, const char* path)
 {
   XBT_DEBUG("\tOpen file '%s'",path);
+
   sg_size_t size, *psize;
   psize = (sg_size_t*) xbt_dict_get_or_null(p_content, path);
   // if file does not exist create an empty file
   if(psize)
     size = *psize;
   else {
-       psize = xbt_new(sg_size_t,1);
+    psize = xbt_new(sg_size_t,1);
     size = 0;
     *psize = size;
     xbt_dict_set(p_content, path, psize, NULL);
@@ -429,6 +404,7 @@ StorageActionPtr StorageN11::open(const char* mount, const char* path)
 
   StorageActionPtr action = new StorageN11Action(getModel(), 0, getState() != SURF_RESOURCE_ON, this, OPEN);
   action->p_file = file;
+
   return action;
 }
 
@@ -441,7 +417,7 @@ StorageActionPtr StorageN11::close(surf_file_t fd)
   StorageActionPtr write_action;
   unsigned int i;
   xbt_dynar_foreach(p_writeActions, i, _write_action) {
-       write_action = static_cast<StorageActionPtr>(static_cast<ActionPtr>(_write_action));
+       write_action = static_cast<StorageActionPtr>(_write_action);
     if ((write_action->p_file) == fd) {
       xbt_dynar_cursor_rm(p_writeActions, &i);
       write_action->unref();
@@ -456,12 +432,12 @@ StorageActionPtr StorageN11::close(surf_file_t fd)
 
 StorageActionPtr StorageN11::read(surf_file_t fd, sg_size_t size)
 {
-  if(size > fd->size){
-    size = fd->size;
+  if(fd->current_position + size > fd->size){
+    size = fd->size - fd->current_position;
     fd->current_position = fd->size;
   }
   else
-       fd->current_position += size;
+    fd->current_position += size;
 
   StorageActionPtr action = new StorageN11Action(getModel(), size, getState() != SURF_RESOURCE_ON, this, READ);
   return action;
@@ -474,29 +450,16 @@ StorageActionPtr StorageN11::write(surf_file_t fd, sg_size_t size)
 
   StorageActionPtr action = new StorageN11Action(getModel(), size, getState() != SURF_RESOURCE_ON, this, WRITE);
   action->p_file = fd;
-  fd->current_position += size;
-  // If the storage is full
+  /* Substract the part of the file that might disappear from the used sized on
+   * the storage element */
+  m_usedSize -= (fd->size - fd->current_position);
+  // If the storage is full before even starting to write
   if(m_usedSize==m_size) {
     action->setState(SURF_ACTION_FAILED);
   }
   return action;
 }
 
-void StorageN11::rename(const char *src, const char *dest)
-{
-  sg_size_t *psize, *new_psize;
-  psize = (sg_size_t*) xbt_dict_get_or_null(p_content,src);
-  new_psize = xbt_new(sg_size_t, 1);
-  *new_psize = *psize;
-  if (psize){// src file exists
-    xbt_dict_remove(p_content, src);
-    xbt_dict_set(p_content, dest, new_psize,NULL);
-    XBT_DEBUG("Change file name from %s to %s, size '%llu'",src, dest, *psize);
-  }
-  else
-    XBT_DEBUG("File %s doesn't exist",src);
-}
-
 /**********
  * Action *
  **********/
@@ -513,18 +476,19 @@ StorageN11Action::StorageN11Action(ModelPtr model, double cost, bool failed, Sto
   case OPEN:
   case CLOSE:
   case STAT:
-  case LS:
     break;
   case READ:
     lmm_expand(model->getMaxminSystem(), storage->p_constraintRead,
-                  getVariable(), 1.0);
+               getVariable(), 1.0);
     break;
   case WRITE:
     lmm_expand(model->getMaxminSystem(), storage->p_constraintWrite,
-                  getVariable(), 1.0);
-    ActionPtr action = this;
-    xbt_dynar_push(storage->p_writeActions, &action);
-    ref();
+               getVariable(), 1.0);
+
+//TODO there is something annoying with what's below. Have to sort it out...
+//    ActionPtr action = this;
+//    xbt_dynar_push(storage->p_writeActions, &action);
+//    ref();
     break;
   }
   XBT_OUT();