+
+ xbt_dynar_free(&storage_list);
+
+ xbt_swag_free
+ (storage_running_action_set_that_does_not_need_being_checked);
+ storage_running_action_set_that_does_not_need_being_checked = NULL;
+}
+
+static void storage_update_actions_state(double now, double delta)
+{
+ surf_action_storage_t action = NULL;
+ surf_action_storage_t next_action = NULL;
+ xbt_swag_t running_actions = surf_storage_model->states.running_action_set;
+
+ // Update the disk usage
+ // Update the file size
+ // For each action of type write
+ xbt_swag_foreach_safe(action, next_action, running_actions) {
+ if(action->type == WRITE)
+ {
+ double rate = lmm_variable_getvalue(GENERIC_LMM_ACTION(action).variable);
+ /* Hack to avoid rounding differences between x86 and x86_64
+ * (note that the next sizes are of type size_t). */
+ long incr = delta * rate + MAXMIN_PRECISION;
+ ((storage_t)(action->storage))->used_size += incr; // disk usage
+ ((surf_action_t)action)->file->size += incr; // file size
+ }
+ }
+
+ xbt_swag_foreach_safe(action, next_action, running_actions) {
+
+ double_update(&(GENERIC_ACTION(action).remains),
+ lmm_variable_getvalue(GENERIC_LMM_ACTION(action).variable) * delta);
+
+ if (GENERIC_LMM_ACTION(action).generic_action.max_duration != NO_MAX_DURATION)
+ double_update(&(GENERIC_ACTION(action).max_duration), delta);
+
+ if(GENERIC_ACTION(action).remains > 0 &&
+ lmm_get_variable_weight(GENERIC_LMM_ACTION(action).variable) > 0 &&
+ ((storage_t)action->storage)->used_size == ((storage_t)action->storage)->size)
+ {
+ GENERIC_ACTION(action).finish = surf_get_clock();
+ storage_action_state_set((surf_action_t) action, SURF_ACTION_FAILED);
+ } else if ((GENERIC_ACTION(action).remains <= 0) &&
+ (lmm_get_variable_weight(GENERIC_LMM_ACTION(action).variable) > 0))
+ {
+ GENERIC_ACTION(action).finish = surf_get_clock();
+ storage_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
+ } else if ((GENERIC_ACTION(action).max_duration != NO_MAX_DURATION) &&
+ (GENERIC_ACTION(action).max_duration <= 0))
+ {
+ GENERIC_ACTION(action).finish = surf_get_clock();
+ storage_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
+ }
+ }
+
+ return;
+}
+
+static double storage_share_resources(double NOW)
+{
+ XBT_DEBUG("storage_share_resources %f",NOW);
+ s_surf_action_storage_t action;
+ unsigned int i,j;
+ storage_t storage;
+ surf_action_storage_t write_action;
+
+ double min_completion = generic_maxmin_share_resources(surf_storage_model->states.running_action_set,
+ xbt_swag_offset(action, generic_lmm_action.variable),
+ storage_maxmin_system, lmm_solve);
+
+ double rate;
+ // Foreach disk
+ xbt_dynar_foreach(storage_list,i,storage)
+ {
+ rate = 0;
+ // Foreach write action on disk
+ xbt_dynar_foreach(storage->write_actions,j,write_action)
+ {
+ rate += lmm_variable_getvalue(write_action->generic_lmm_action.variable);
+ }
+ if(rate > 0)
+ min_completion = MIN(min_completion, (storage->size-storage->used_size)/rate);
+ }
+
+ return min_completion;
+}
+
+static int storage_resource_used(void *resource_id)
+{
+ THROW_UNIMPLEMENTED;
+ return 0;
+}
+
+static void storage_resources_state(void *id, tmgr_trace_event_t event_type,
+ double value, double time)
+{
+ THROW_UNIMPLEMENTED;
+}
+
+static int storage_action_unref(surf_action_t action)
+{
+ action->refcount--;
+ if (!action->refcount) {
+ xbt_swag_remove(action, action->state_set);
+ if (((surf_action_lmm_t) action)->variable)
+ lmm_variable_free(storage_maxmin_system,
+ ((surf_action_lmm_t) action)->variable);
+#ifdef HAVE_TRACING
+ xbt_free(action->category);
+#endif
+ surf_action_free(&action);
+ return 1;
+ }
+ return 0;
+}
+
+static void storage_action_cancel(surf_action_t action)
+{
+ surf_action_state_set(action, SURF_ACTION_FAILED);
+ return;
+}
+
+static void storage_action_state_set(surf_action_t action, e_surf_action_state_t state)
+{
+ surf_action_state_set(action, state);
+ return;
+}
+
+static void storage_action_suspend(surf_action_t action)
+{
+ XBT_IN("(%p)", action);
+ if (((surf_action_lmm_t) action)->suspended != 2) {
+ lmm_update_variable_weight(storage_maxmin_system,
+ ((surf_action_lmm_t) action)->variable,
+ 0.0);
+ ((surf_action_lmm_t) action)->suspended = 1;
+ }
+ XBT_OUT();
+}
+
+static void storage_action_resume(surf_action_t action)
+{
+ THROW_UNIMPLEMENTED;
+}
+
+static int storage_action_is_suspended(surf_action_t action)
+{
+ return (((surf_action_lmm_t) action)->suspended == 1);
+}
+
+static void storage_action_set_max_duration(surf_action_t action, double duration)
+{
+ THROW_UNIMPLEMENTED;
+}
+
+static void storage_action_set_priority(surf_action_t action, double priority)
+{
+ THROW_UNIMPLEMENTED;