+ if (first_run) {
+ DEBUG0("First Run! Let's \"purge\" events and put resources in the right state");
+ while ((next_event_date = tmgr_history_next_date(history)) != -1.0) {
+ if (next_event_date > NOW)
+ break;
+ while ((event =
+ tmgr_history_get_next_event_leq(history, next_event_date,
+ &value,
+ (void **) &resource_obj))) {
+ resource_obj->resource->common_private->
+ update_resource_state(resource_obj, event, value);
+ }
+ }
+ xbt_dynar_foreach(resource_list, i, resource) {
+ resource->common_private->update_actions_state(NOW, 0.0);
+ }
+ first_run = 0;
+ return 0.0;
+ }
+
+ min = -1.0;
+
+ DEBUG0("Looking for next action end");
+ xbt_dynar_foreach(resource_list, i, resource) {
+ resource_next_action_end =
+ resource->common_private->share_resources(NOW);
+ DEBUG2("Resource [%s] : next action end = %f",resource->common_public->name,
+ resource_next_action_end);
+ if (((min < 0.0) || (resource_next_action_end < min))
+ && (resource_next_action_end >= 0.0))
+ min = resource_next_action_end;
+ }
+ DEBUG1("Next action end : %f", min);
+
+ if (min < 0.0)
+ return -1.0;
+
+ DEBUG0("Looking for next event");
+ while ((next_event_date = tmgr_history_next_date(history)) != -1.0) {
+ DEBUG1("Next event : %f",next_event_date);
+ if (next_event_date > NOW + min)
+ break;
+ DEBUG0("Updating resources");
+ while ((event =
+ tmgr_history_get_next_event_leq(history, next_event_date,
+ &value,
+ (void **) &resource_obj))) {
+ if (resource_obj->resource->common_private->
+ resource_used(resource_obj)) {
+ min = next_event_date - NOW;
+ DEBUG1("This event will modify resource state. Next event set to %f", min);
+ }
+ /* update state of resource_obj according to new value. Does not touch lmm.
+ It will be modified if needed when updating actions */
+ resource_obj->resource->common_private->
+ update_resource_state(resource_obj, event, value);
+ }
+ }
+
+ DEBUG1("Duration set to %f", min);
+
+ xbt_dynar_foreach(resource_list, i, resource) {
+ resource->common_private->update_actions_state(NOW, min);
+ }
+
+ NOW = NOW + min;
+
+ return min;
+}
+
+double surf_get_clock(void)
+{
+ return NOW;
+}