Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Added round trip time contraint to the SDP program, this parameter
[simgrid.git] / src / surf / surf_timer.c
index 7f0dd60..c86ddfe 100644 (file)
@@ -5,15 +5,17 @@
 /* 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 "xbt/ex.h"
 #include "surf_timer_private.h"
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(timer, surf,
-                               "Logging specific to the SURF timer module");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_timer, surf,
+                               "Logging specific to SURF (timer)");
 
 surf_timer_resource_t surf_timer_resource = NULL;
 static tmgr_trace_t empty_trace = NULL;
 static xbt_swag_t command_pending = NULL;
 static xbt_swag_t command_to_run = NULL;
+static xbt_heap_t timer_heap = NULL;
 
 static void timer_free(void *timer)
 {
@@ -68,10 +70,10 @@ static int resource_used(void *resource_id)
   return 1;
 }
 
-static void action_free(surf_action_t action)
+static int action_free(surf_action_t action)
 {
   DIE_IMPOSSIBLE;
-  return;
+  return 1;
 }
 
 static void action_cancel(surf_action_t action)
@@ -95,11 +97,19 @@ static void action_change_state(surf_action_t action,
 
 static double share_resources(double now)
 {
-  return -1.0;
+  if (xbt_heap_size(timer_heap))
+    return (xbt_heap_maxkey(timer_heap));
+  else
+    return -1.0;
 }
 
 static void update_actions_state(double now, double delta)
 {
+  if(xbt_heap_size(timer_heap)) {
+    if(xbt_heap_maxkey(timer_heap)<=now+delta) {
+      xbt_heap_pop(timer_heap);
+    }
+  }
   return;
 }
 
@@ -123,6 +133,7 @@ static void set(double date, void *function, void *arg)
   command = command_new(function, arg);
 
   tmgr_history_add_trace(history, empty_trace, date, 0, command);  
+  xbt_heap_push(timer_heap, NULL , date);
 }
 
 
@@ -158,6 +169,12 @@ static int action_is_suspended(surf_action_t action)
 
 static void finalize(void)
 {
+  xbt_heap_free(timer_heap);
+  timer_heap = NULL;
+
+  tmgr_trace_free(empty_trace);
+  empty_trace = NULL;
+
   xbt_swag_free(command_pending);
   xbt_swag_free(command_to_run);
 
@@ -231,6 +248,7 @@ static void surf_timer_resource_init_internal(void)
   }
 
   empty_trace = tmgr_empty_trace_new();
+  timer_heap = xbt_heap_new(8, NULL);
 
   xbt_assert0(maxmin_system, "surf_init has to be called first!");
 }