From 20f538f06d2852ddaad7f6f631eede8c39234da4 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Thu, 19 Apr 2012 15:11:54 +0000 Subject: [PATCH] - fixes --- src/ats/gnunet-service-ats_addresses_mlp.c | 22 ++++++++++++++++++++-- src/ats/gnunet-service-ats_addresses_mlp.h | 2 ++ src/ats/perf_ats_mlp.c | 1 + src/ats/test_ats_mlp.c | 5 ++++- src/ats/test_ats_mlp_averaging.c | 5 ++++- 5 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/ats/gnunet-service-ats_addresses_mlp.c b/src/ats/gnunet-service-ats_addresses_mlp.c index 85113ea8e..512d5fb39 100644 --- a/src/ats/gnunet-service-ats_addresses_mlp.c +++ b/src/ats/gnunet-service-ats_addresses_mlp.c @@ -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; } diff --git a/src/ats/gnunet-service-ats_addresses_mlp.h b/src/ats/gnunet-service-ats_addresses_mlp.h index 14684d3ba..24be54e8f 100644 --- a/src/ats/gnunet-service-ats_addresses_mlp.h +++ b/src/ats/gnunet-service-ats_addresses_mlp.h @@ -139,6 +139,8 @@ struct GAS_MLP_Handle */ int auto_solve; + int semaphore; + /* state information */ /** diff --git a/src/ats/perf_ats_mlp.c b/src/ats/perf_ats_mlp.c index e25610c74..ec7234fcc 100644 --- a/src/ats/perf_ats_mlp.c +++ b/src/ats/perf_ats_mlp.c @@ -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; diff --git a/src/ats/test_ats_mlp.c b/src/ats/test_ats_mlp.c index 14df2d0df..4e8a68591 100644 --- a/src/ats/test_ats_mlp.c +++ b/src/ats/test_ats_mlp.c @@ -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); diff --git a/src/ats/test_ats_mlp_averaging.c b/src/ats/test_ats_mlp_averaging.c index f7b7b1d8f..d9a46f68d 100644 --- a/src/ats/test_ats_mlp_averaging.c +++ b/src/ats/test_ats_mlp_averaging.c @@ -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); -- 2.25.1