Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Now surf communications come with a maximum rate. Also fixed a bug in network.c ...
authoralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Sat, 15 Jan 2005 00:46:32 +0000 (00:46 +0000)
committeralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Sat, 15 Jan 2005 00:46:32 +0000 (00:46 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@758 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/include/surf/surf.h
src/surf/cpu.c
src/surf/network.c
src/surf/network_private.h
src/surf/workstation.c
src/surf/workstation_KCCFLN05.c

index 6223c5e..6690309 100644 (file)
@@ -69,6 +69,9 @@ typedef struct surf_resource_public {
                               e_surf_action_state_t state);
   void (*action_set_data) (surf_action_t action,
                           void *data);
+  void (*suspend) (surf_action_t action);
+  void (*resume) (surf_action_t action);
+  int (*is_suspended) (surf_action_t action);
   const char *name;
 } s_surf_resource_public_t, *surf_resource_public_t;
 
@@ -95,9 +98,6 @@ typedef struct surf_cpu_resource_extension_private
 typedef struct surf_cpu_resource_extension_public {
   surf_action_t(*execute) (void *cpu, double size);
   surf_action_t(*sleep) (void *cpu, double duration);
-  void (*suspend) (surf_action_t action);
-  void (*resume) (surf_action_t action);
-  int (*is_suspended) (surf_action_t action);
    e_surf_cpu_state_t(*get_state) (void *cpu);
 } s_surf_cpu_resource_extension_public_t,
     *surf_cpu_resource_extension_public_t;
@@ -114,10 +114,8 @@ void surf_cpu_resource_init_Cas01(const char *filename);
 typedef struct surf_network_resource_extension_private
 *surf_network_resource_extension_private_t;
 typedef struct surf_network_resource_extension_public {
-  surf_action_t(*communicate) (void *src, void *dst, double size);
-  void (*suspend) (surf_action_t action);
-  void (*resume) (surf_action_t action);
-  int (*is_suspended) (surf_action_t action);
+  surf_action_t(*communicate) (void *src, void *dst, double size, 
+                              double max_rate);
 } s_surf_network_resource_extension_public_t,
     *surf_network_resource_extension_public_t;
 
@@ -136,12 +134,10 @@ typedef struct surf_workstation_resource_extension_private
 typedef struct surf_workstation_resource_extension_public {
   surf_action_t(*execute) (void *workstation, double size);
   surf_action_t(*sleep) (void *workstation, double duration);
-  void (*suspend) (surf_action_t action);
-  void (*resume) (surf_action_t action);
-  int (*is_suspended) (surf_action_t action);
-   e_surf_cpu_state_t(*get_state) (void *workstation);
-   surf_action_t(*communicate) (void *workstation_src,
-                               void *workstation_dst, double size);
+  e_surf_cpu_state_t(*get_state) (void *workstation);
+  surf_action_t(*communicate) (void *workstation_src,
+                              void *workstation_dst, double size, 
+                              double max_rate);
 } s_surf_workstation_resource_extension_public_t,
     *surf_workstation_resource_extension_public_t;
 
index 1f79ef6..d748240 100644 (file)
@@ -331,11 +331,12 @@ static void surf_cpu_resource_init_internal(void)
       update_resource_state;
   surf_cpu_resource->common_private->finalize = finalize;
 
+  surf_cpu_resource->common_public->suspend = action_suspend;
+  surf_cpu_resource->common_public->resume = action_resume;
+  surf_cpu_resource->common_public->is_suspended = action_is_suspended;
+
   surf_cpu_resource->extension_public->execute = execute;
   surf_cpu_resource->extension_public->sleep = action_sleep;
-  surf_cpu_resource->extension_public->suspend = action_suspend;
-  surf_cpu_resource->extension_public->resume = action_resume;
-  surf_cpu_resource->extension_public->is_suspended = action_is_suspended;
 
   surf_cpu_resource->extension_public->get_state = get_state;
 
index 56b4dd8..278237d 100644 (file)
@@ -339,8 +339,12 @@ static void update_resource_state(void *id,
     while (lmm_get_var_from_cnst(maxmin_system, nw_link->constraint, &var)) {
       action = lmm_variable_id(var);
       action->lat_current += delta;
-      lmm_update_variable_bound(maxmin_system, var,
-                               1 / (action->lat_current));
+      if(action->rate<0)
+       lmm_update_variable_bound(maxmin_system, action->variable,
+                                 SG_TCP_CTE_GAMMA / action->lat_current);
+      else 
+       lmm_update_variable_bound(maxmin_system, action->variable,
+                                 min(action->rate,SG_TCP_CTE_GAMMA / action->lat_current));
     }
   } else if (event_type == nw_link->state_event) {
     if (value > 0)
@@ -355,7 +359,7 @@ static void update_resource_state(void *id,
   return;
 }
 
-static surf_action_t communicate(void *src, void *dst, double size)
+static surf_action_t communicate(void *src, void *dst, double size, double rate)
 {
   surf_action_network_t action = NULL;
   network_card_t card_src = src;
@@ -378,6 +382,7 @@ static surf_action_t communicate(void *src, void *dst, double size)
       surf_network_resource->common_public->states.running_action_set;
 
   xbt_swag_insert(action, action->generic_action.state_set);
+  action->rate = rate;
 
   action->latency = 0.0;
   for (i = 0; i < route_size; i++)
@@ -391,8 +396,12 @@ static surf_action_t communicate(void *src, void *dst, double size)
     action->variable = lmm_variable_new(maxmin_system, action, 1.0, -1.0,
                                        route_size);
 
-  lmm_update_variable_bound(maxmin_system, action->variable,
-                           SG_TCP_CTE_GAMMA / action->lat_current);
+  if(action->rate<0)
+    lmm_update_variable_bound(maxmin_system, action->variable,
+                             SG_TCP_CTE_GAMMA / action->lat_current);
+  else 
+    lmm_update_variable_bound(maxmin_system, action->variable,
+                             min(action->rate,SG_TCP_CTE_GAMMA / action->lat_current));
 
   for (i = 0; i < route_size; i++)
     lmm_expand(maxmin_system, route[i]->constraint, action->variable, 1.0);
@@ -493,10 +502,11 @@ static void surf_network_resource_init_internal(void)
       update_resource_state;
   surf_network_resource->common_private->finalize = finalize;
 
+  surf_network_resource->common_public->suspend = action_suspend;
+  surf_network_resource->common_public->resume = action_resume;
+  surf_network_resource->common_public->is_suspended = action_is_suspended;
+
   surf_network_resource->extension_public->communicate = communicate;
-  surf_network_resource->extension_public->suspend = action_suspend;
-  surf_network_resource->extension_public->resume = action_resume;
-  surf_network_resource->extension_public->is_suspended = action_is_suspended;
 
   network_link_set = xbt_dict_new();
   network_card_set = xbt_dict_new();
index 898857b..c9dd0b5 100644 (file)
@@ -42,6 +42,7 @@ typedef struct surf_action_network {
   double latency;
   double lat_current;
   lmm_variable_t variable;
+  double rate;
   int suspended;
   network_card_t src;
   network_card_t dst;
index 4a5cb42..0bfebdb 100644 (file)
@@ -128,36 +128,37 @@ static surf_action_t action_sleep(void *workstation, double duration)
 static void action_suspend(surf_action_t action)
 {
   if(action->resource_type==(surf_resource_t)surf_network_resource) 
-    surf_network_resource->extension_public->suspend(action);
+    surf_network_resource->common_public->suspend(action);
   else if(action->resource_type==(surf_resource_t)surf_cpu_resource) 
-    surf_cpu_resource->extension_public->suspend(action);
+    surf_cpu_resource->common_public->suspend(action);
   else DIE_IMPOSSIBLE;
 }
 
 static void action_resume(surf_action_t action)
 {
   if(action->resource_type==(surf_resource_t)surf_network_resource)
-    surf_network_resource->extension_public->resume(action);
+    surf_network_resource->common_public->resume(action);
   else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
-    surf_cpu_resource->extension_public->resume(action);
+    surf_cpu_resource->common_public->resume(action);
   else DIE_IMPOSSIBLE;
 }
 
 static int action_is_suspended(surf_action_t action)
 {
   if(action->resource_type==(surf_resource_t)surf_network_resource) 
-    return surf_network_resource->extension_public->is_suspended(action);
+    return surf_network_resource->common_public->is_suspended(action);
   if(action->resource_type==(surf_resource_t)surf_cpu_resource) 
-    return surf_cpu_resource->extension_public->is_suspended(action);
+    return surf_cpu_resource->common_public->is_suspended(action);
   DIE_IMPOSSIBLE;
 }
 
 static surf_action_t communicate(void *workstation_src,
-                                void *workstation_dst, double size)
+                                void *workstation_dst, double size,
+                                double rate)
 {
   return surf_network_resource->extension_public->
       communicate(((workstation_t) workstation_src)->network_card,
-                 ((workstation_t) workstation_dst)->network_card, size);
+                 ((workstation_t) workstation_dst)->network_card, size, rate);
 }
 
 static e_surf_cpu_state_t get_state(void *workstation)
@@ -230,11 +231,12 @@ static void surf_workstation_resource_init_internal(void)
       update_resource_state;
   surf_workstation_resource->common_private->finalize = finalize;
 
+  surf_workstation_resource->common_public->suspend = action_suspend;
+  surf_workstation_resource->common_public->resume = action_resume;
+  surf_workstation_resource->common_public->is_suspended = action_is_suspended;
+
   surf_workstation_resource->extension_public->execute = execute;
   surf_workstation_resource->extension_public->sleep = action_sleep;
-  surf_workstation_resource->extension_public->suspend = action_suspend;
-  surf_workstation_resource->extension_public->resume = action_resume;
-  surf_workstation_resource->extension_public->is_suspended = action_is_suspended;
   surf_workstation_resource->extension_public->get_state = get_state;
   surf_workstation_resource->extension_public->communicate = communicate;
 
index f3c9115..fc740c2 100644 (file)
@@ -423,7 +423,8 @@ static void update_actions_network_KCCFLN05_state(double now, double delta)
   return;
 }
 
-static surf_action_t communicate_KCCFLN05(void *src, void *dst, double size)
+static surf_action_t communicate_KCCFLN05(void *src, void *dst, double size,
+                                         double rate)
 {
   surf_action_network_KCCFLN05_t action = NULL;
   workstation_KCCFLN05_t card_src = src;
@@ -446,8 +447,12 @@ static surf_action_t communicate_KCCFLN05(void *src, void *dst, double size)
 
   xbt_swag_insert(action, action->generic_action.state_set);
 
-  action->variable = lmm_variable_new(maxmin_system_network_KCCFLN05, action, 1.0, -1.0,
-                                     route->size);
+  if(rate>0)
+    action->variable = lmm_variable_new(maxmin_system_network_KCCFLN05, action, 1.0, rate,
+                                       route->size);
+  else
+    action->variable = lmm_variable_new(maxmin_system_network_KCCFLN05, action, 1.0, -1.0,
+                                       route->size);
 
   for (i = 0; i < route->size; i++)
     lmm_expand(maxmin_system_network_KCCFLN05, route->links[i]->constraint, 
@@ -462,6 +467,23 @@ static surf_action_t communicate_KCCFLN05(void *src, void *dst, double size)
   return (surf_action_t) action;
 }
 
+static void network_KCCFLN05_action_suspend(surf_action_t action)
+{
+  lmm_update_variable_weight(maxmin_system_network_KCCFLN05,
+                            ((surf_action_network_KCCFLN05_t) action)->variable, 0.0);
+}
+
+static void network_KCCFLN05_action_resume(surf_action_t action)
+{
+  lmm_update_variable_weight(maxmin_system_network_KCCFLN05,
+                            ((surf_action_network_KCCFLN05_t) action)->variable, 1.0);
+}
+
+static int network_KCCFLN05_action_is_suspended(surf_action_t action)
+{
+  return (lmm_get_variable_weight(((surf_action_network_KCCFLN05_t) action)->variable) == 0.0);
+}
+
 /***************** CPU ****************/
 static void action_cpu_KCCFLN05_free(surf_action_t action)
 {
@@ -618,33 +640,19 @@ static surf_action_t execute_KCCFLN05(void *cpu, double size)
 
 static void cpu_KCCFLN05_action_suspend(surf_action_t action)
 {
-  if(action->resource_type==(surf_resource_t)surf_network_resource) 
-    lmm_update_variable_weight(maxmin_system_network_KCCFLN05,
-                              ((surf_action_network_KCCFLN05_t) action)->variable, 0.0);
-  else if(action->resource_type==(surf_resource_t)surf_cpu_resource) 
-    lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05,
-                              ((surf_action_cpu_KCCFLN05_t) action)->variable, 0.0);
-  else DIE_IMPOSSIBLE;
+  lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05,
+                            ((surf_action_cpu_KCCFLN05_t) action)->variable, 0.0);
 }
 
 static void cpu_KCCFLN05_action_resume(surf_action_t action)
 {
-  if(action->resource_type==(surf_resource_t)surf_network_resource) 
-    lmm_update_variable_weight(maxmin_system_network_KCCFLN05,
-                              ((surf_action_network_KCCFLN05_t) action)->variable, 1.0);
-  else if(action->resource_type==(surf_resource_t)surf_cpu_resource) 
-    lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05,
-                              ((surf_action_cpu_KCCFLN05_t) action)->variable, 1.0);
-  else DIE_IMPOSSIBLE;
+  lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05,
+                            ((surf_action_cpu_KCCFLN05_t) action)->variable, 1.0);
 }
 
 static int cpu_KCCFLN05_action_is_suspended(surf_action_t action)
 {
-  if(action->resource_type==(surf_resource_t)surf_network_resource) 
-    return (lmm_get_variable_weight(((surf_action_cpu_KCCFLN05_t) action)->variable) == 0.0);
-  if(action->resource_type==(surf_resource_t)surf_cpu_resource) 
-    return (lmm_get_variable_weight(((surf_action_network_KCCFLN05_t) action)->variable) == 0.0);
-  DIE_IMPOSSIBLE;
+  return (lmm_get_variable_weight(((surf_action_cpu_KCCFLN05_t) action)->variable) == 0.0);
 }
 
 /************* workstation ************/
@@ -688,30 +696,31 @@ static void update_resource_state(void *id,
 
 static void action_suspend(surf_action_t action)
 {
-  xbt_assert0(action->resource_type ==
-             ((surf_resource_t) surf_cpu_resource),
-             "Resource type mismatch");
-  surf_cpu_resource->extension_public->suspend(action);
+  if(action->resource_type==(surf_resource_t)surf_network_resource) 
+    surf_network_resource->common_public->suspend(action);
+  else if(action->resource_type==(surf_resource_t)surf_cpu_resource) 
+    surf_cpu_resource->common_public->suspend(action);
+  else DIE_IMPOSSIBLE;
 }
 
 static void action_resume(surf_action_t action)
 {
-  xbt_assert0(action->resource_type ==
-             ((surf_resource_t) surf_cpu_resource),
-             "Resource type mismatch");
-  surf_cpu_resource->extension_public->resume(action);
+  if(action->resource_type==(surf_resource_t)surf_network_resource)
+    surf_network_resource->common_public->resume(action);
+  else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
+    surf_cpu_resource->common_public->resume(action);
+  else DIE_IMPOSSIBLE;
 }
 
 static int action_is_suspended(surf_action_t action)
 {
   if(action->resource_type==(surf_resource_t)surf_network_resource) 
-    return 0;
+    return surf_network_resource->common_public->is_suspended(action);
   if(action->resource_type==(surf_resource_t)surf_cpu_resource) 
-    return surf_cpu_resource->extension_public->is_suspended(action);
+    return surf_cpu_resource->common_public->is_suspended(action);
   DIE_IMPOSSIBLE;
 }
 
-
 /**************************************/
 /********* Module  creation ***********/
 /**************************************/
@@ -781,9 +790,10 @@ static void cpu_KCCFLN05_resource_init_internal(void)
 
   surf_cpu_resource->extension_public->execute = execute_KCCFLN05;
 /*FIXME*//*   surf_cpu_resource->extension_public->sleep = action_sleep; */
-  surf_cpu_resource->extension_public->suspend = cpu_KCCFLN05_action_suspend;
-  surf_cpu_resource->extension_public->resume = cpu_KCCFLN05_action_resume;
-  surf_cpu_resource->extension_public->is_suspended = cpu_KCCFLN05_action_is_suspended;
+
+  surf_cpu_resource->common_public->suspend = cpu_KCCFLN05_action_suspend;
+  surf_cpu_resource->common_public->resume = cpu_KCCFLN05_action_resume;
+  surf_cpu_resource->common_public->is_suspended = cpu_KCCFLN05_action_is_suspended;
 
   surf_cpu_resource->extension_public->get_state = get_state;
 
@@ -866,7 +876,11 @@ static void network_KCCFLN05_resource_init_internal(void)
     update_network_KCCFLN05_state;
   surf_network_resource->common_private->finalize = network_KCCFLN05_finalize;
 
- surf_network_resource->extension_public->communicate = communicate_KCCFLN05;
+  surf_network_resource->common_public->suspend = network_KCCFLN05_action_suspend;
+  surf_network_resource->common_public->resume = network_KCCFLN05_action_resume;
+  surf_network_resource->common_public->is_suspended = network_KCCFLN05_action_is_suspended;
+
+  surf_network_resource->extension_public->communicate = communicate_KCCFLN05;
 
   network_link_set = xbt_dict_new();
 
@@ -929,11 +943,13 @@ static void workstation_KCCFLN05_resource_init_internal(void)
   surf_workstation_resource->common_private->update_resource_state = update_resource_state;
   surf_workstation_resource->common_private->finalize = workstation_KCCFLN05_finalize;
 
+
+  surf_workstation_resource->common_public->suspend = action_suspend;
+  surf_workstation_resource->common_public->resume = action_resume;
+  surf_workstation_resource->common_public->is_suspended = action_is_suspended;
+
   surf_workstation_resource->extension_public->execute = execute_KCCFLN05;
 /*FIXME*//*  surf_workstation_resource->extension_public->sleep = action_sleep; */
-  surf_workstation_resource->extension_public->suspend = action_suspend;
-  surf_workstation_resource->extension_public->resume = action_resume;
-  surf_workstation_resource->extension_public->is_suspended = action_is_suspended;
   surf_workstation_resource->extension_public->get_state = get_state;
   surf_workstation_resource->extension_public->communicate = communicate_KCCFLN05;
 }