- fixes
authorMatthias Wachs <wachs@net.in.tum.de>
Thu, 19 Apr 2012 15:11:54 +0000 (15:11 +0000)
committerMatthias Wachs <wachs@net.in.tum.de>
Thu, 19 Apr 2012 15:11:54 +0000 (15:11 +0000)
src/ats/gnunet-service-ats_addresses_mlp.c
src/ats/gnunet-service-ats_addresses_mlp.h
src/ats/perf_ats_mlp.c
src/ats/test_ats_mlp.c
src/ats/test_ats_mlp_averaging.c

index 85113ea8e5ba8b3fa741542a6965d66cb100ae39..512d5fb3959d9a7e9ff26ed64b0598d9496683fc 100644 (file)
@@ -976,6 +976,7 @@ mlp_solve_mlp_problem (struct GAS_MLP_Handle *mlp, struct GAS_MLP_SolutionContex
 
 int GAS_mlp_solve_problem (struct GAS_MLP_Handle *mlp, struct GAS_MLP_SolutionContext *ctx);
 
+
 static void
 mlp_scheduler (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
@@ -993,6 +994,7 @@ mlp_scheduler (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
     GAS_mlp_solve_problem(mlp, &ctx);
 }
 
+
 /**
  * Solves the MLP problem
  *
@@ -1003,6 +1005,19 @@ int
 GAS_mlp_solve_problem (struct GAS_MLP_Handle *mlp, struct GAS_MLP_SolutionContext *ctx)
 {
   int res;
+  /* Check if solving is already running */
+  if (GNUNET_YES == mlp->semaphore)
+  {
+    if (mlp->mlp_task != GNUNET_SCHEDULER_NO_TASK)
+    {
+      GNUNET_SCHEDULER_cancel(mlp->mlp_task);
+      mlp->mlp_task = GNUNET_SCHEDULER_NO_TASK;
+    }
+    mlp->mlp_task = GNUNET_SCHEDULER_add_delayed (mlp->exec_interval, &mlp_scheduler, mlp);
+    return GNUNET_SYSERR;
+  }
+  mlp->semaphore = GNUNET_YES;
+
   mlp->last_execution = GNUNET_TIME_absolute_get ();
 
   ctx->lp_result = GNUNET_SYSERR;
@@ -1025,6 +1040,7 @@ GAS_mlp_solve_problem (struct GAS_MLP_Handle *mlp, struct GAS_MLP_SolutionContex
   if (res != GNUNET_OK)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "LP Problem solving failed\n");
+    mlp->semaphore = GNUNET_NO;
     return GNUNET_SYSERR;
   }
 
@@ -1041,6 +1057,7 @@ GAS_mlp_solve_problem (struct GAS_MLP_Handle *mlp, struct GAS_MLP_SolutionContex
   if (res != GNUNET_OK)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "MLP Problem solving failed\n");
+    mlp->semaphore = GNUNET_NO;
     return GNUNET_SYSERR;
   }
 #if WRITE_MLP
@@ -1085,7 +1102,8 @@ GAS_mlp_solve_problem (struct GAS_MLP_Handle *mlp, struct GAS_MLP_SolutionContex
     GNUNET_SCHEDULER_cancel(mlp->mlp_task);
     mlp->mlp_task = GNUNET_SCHEDULER_NO_TASK;
   }
-  //mlp->mlp_task = GNUNET_SCHEDULER_add_delayed (mlp->exec_interval, &mlp_scheduler, mlp);
+  mlp->mlp_task = GNUNET_SCHEDULER_add_delayed (mlp->exec_interval, &mlp_scheduler, mlp);
+  mlp->semaphore = GNUNET_NO;
   return res;
 }
 
@@ -1360,7 +1378,7 @@ GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
   mlp->b_min = b_min;
   mlp->n_min = n_min;
   mlp->m_q = GNUNET_ATS_QualityPropertiesCount;
-
+  mlp->semaphore = GNUNET_NO;
   return mlp;
 }
 
index 14684d3bae6218efd4be132eae70e68206364abe..24be54e8f1a709262bcc40c804bc85d9557a3c90 100644 (file)
@@ -139,6 +139,8 @@ struct GAS_MLP_Handle
    */
   int auto_solve;
 
+  int semaphore;
+
   /* state information */
 
   /**
index e25610c74802b8343e2ae399f788fd0b54622611..ec7234fccb753a26e7dc2b2aeba931ba01304017 100644 (file)
@@ -41,6 +41,7 @@
 static unsigned int peers;
 static unsigned int addresses;
 static unsigned int numeric;
+static unsigned int updates;
 
 static int start;
 static int end;
index 14df2d0dfafdd8ddd22b1bf4f43c2b5ea62aaaaf..4e8a68591a3a7d1749a00fd2b0483e04a1350a44 100644 (file)
@@ -75,6 +75,7 @@ check (void *cls, char *const *args, const char *cfgfile,
 #endif
   struct ATS_Address addr[10];
   struct ATS_PreferedAddress *res[10];
+  struct GAS_MLP_SolutionContext ctx;
 
   stats = GNUNET_STATISTICS_create("ats", cfg);
 
@@ -140,7 +141,9 @@ check (void *cls, char *const *args, const char *cfgfile,
   GAS_mlp_address_update (mlp, addresses, &addr[2]);
   GNUNET_assert (mlp->addr_in_problem == 3);
 
-  GNUNET_assert (GNUNET_OK == GAS_mlp_solve_problem(mlp));
+  GNUNET_assert (GNUNET_OK == GAS_mlp_solve_problem(mlp, &ctx));
+  GNUNET_assert (GNUNET_OK == ctx.lp_result);
+  GNUNET_assert (GNUNET_OK == ctx.mlp_result);
 
   res[0] = GAS_mlp_get_preferred_address(mlp, addresses, &p[0]);
   GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Preferred address `%s' outbound bandwidth: %u Bps\n",res[0]->address->plugin, res[0]->bandwidth_out);
index f7b7b1d8f033a350eb7b9b738dd511eed070ee83..d9a46f68d8f8756759174a45b7f7f46f7883d056 100644 (file)
@@ -76,6 +76,7 @@ check (void *cls, char *const *args, const char *cfgfile,
   struct ATS_Address addr[10];
   struct ATS_PreferedAddress *res[10];
   struct MLP_information *mlpi;
+  struct GAS_MLP_SolutionContext ctx;
 
   stats = GNUNET_STATISTICS_create("ats", cfg);
 
@@ -129,7 +130,9 @@ check (void *cls, char *const *args, const char *cfgfile,
   GNUNET_assert (mlp->addr_in_problem == 1);
 
 
-  GNUNET_assert (GNUNET_OK == GAS_mlp_solve_problem(mlp));
+  GNUNET_assert (GNUNET_OK == GAS_mlp_solve_problem(mlp, &ctx));
+  GNUNET_assert (GNUNET_OK == ctx.lp_result);
+  GNUNET_assert (GNUNET_OK == ctx.mlp_result);
 
   res[0] = GAS_mlp_get_preferred_address(mlp, addresses, &p[0]);
   GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Preferred address `%s' outbound bandwidth: %u Bps\n",res[0]->address->plugin, res[0]->bandwidth_out);