From e930d9d48fc6e1f97b2cd3202767245f8327319b Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Tue, 24 Apr 2012 10:18:09 +0000 Subject: [PATCH] - fixing mantis 2282 --- src/ats/gnunet-service-ats.c | 6 ++++++ src/ats/gnunet-service-ats_addresses.c | 29 ++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/ats/gnunet-service-ats.c b/src/ats/gnunet-service-ats.c index a68ec416b..5e6871096 100644 --- a/src/ats/gnunet-service-ats.c +++ b/src/ats/gnunet-service-ats.c @@ -39,6 +39,9 @@ */ struct GNUNET_STATISTICS_Handle *GSA_stats; +static struct GNUNET_SERVER_Handle *GSA_server; + + /** * We have received a 'ClientStartMessage' from a client. Find out which * type of client it is and notify the respective subsystem. @@ -107,6 +110,8 @@ client_disconnect_handler (void *cls, struct GNUNET_SERVER_Client *client) static void cleanup_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { + GNUNET_SERVER_destroy (GSA_server); + GSA_server = NULL; GAS_addresses_done (); GAS_scheduling_done (); GAS_performance_done (); @@ -152,6 +157,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_CHANGE, 0}, {NULL, NULL, 0, 0} }; + GSA_server = server; GSA_stats = GNUNET_STATISTICS_create ("ats", cfg); GAS_reservations_init (); GAS_performance_init (server); diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index ca161d6b9..f81b4c282 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c @@ -66,6 +66,8 @@ static unsigned int active_addr_count; static int ats_mode; +static int running; + static void send_bw_notification (struct ATS_Address *aa) @@ -339,6 +341,11 @@ GAS_addresses_update (const struct GNUNET_PeerIdentity *peer, struct ATS_Address *old; uint32_t i; + if (GNUNET_NO == running) + return; + + GNUNET_assert (NULL != addresses); + aa = create_address (peer, plugin_name, plugin_addr, plugin_addr_len, @@ -510,6 +517,9 @@ GAS_addresses_destroy (const struct GNUNET_PeerIdentity *peer, { struct ATS_Address *aa; + if (GNUNET_NO == running) + return; + GNUNET_break (0 < strlen (plugin_name)); aa = create_address (peer, plugin_name, plugin_addr, plugin_addr_len, session_id); @@ -580,6 +590,8 @@ GAS_addresses_in_use (const struct GNUNET_PeerIdentity *peer, struct ATS_Address *aa; struct ATS_Address *old; + if (GNUNET_NO == running) + return; aa = create_address(peer, plugin_name, plugin_addr, plugin_addr_len, session_id); old = find_exact_address (peer, aa); @@ -677,6 +689,9 @@ void request_address_simple (const struct GNUNET_PeerIdentity *peer) void GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) { + if (GNUNET_NO == running) + return; + if (ats_mode == SIMPLE) { request_address_simple (peer); @@ -695,6 +710,8 @@ GAS_addresses_change_preference (const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, float score) { + if (GNUNET_NO == running) + return; #if HAVE_LIBGLPK if (ats_mode == MLP) GAS_mlp_address_change_preference (mlp, peer, kind, score); @@ -718,6 +735,11 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, char *quota_wan_in_str; char *quota_wan_out_str; + running = GNUNET_NO; + + addresses = GNUNET_CONTAINER_multihashmap_create (128); + GNUNET_assert (NULL != addresses); + if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string(cfg, "ats", "WAN_QUOTA_IN", "a_wan_in_str)) { if (0 == strcmp(quota_wan_in_str, "unlimited") || @@ -746,7 +768,6 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, wan_quota_out = (UINT32_MAX) /10; } - mode = GNUNET_CONFIGURATION_get_value_yesno (cfg, "ats", "MLP"); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "MLP mode %u", mode); switch (mode) @@ -788,7 +809,7 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, break; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ATS started with %s mode\n", (SIMPLE == ats_mode) ? "SIMPLE" : "MLP"); - addresses = GNUNET_CONTAINER_multihashmap_create (128); + running = GNUNET_YES; } @@ -813,6 +834,9 @@ free_address_it (void *cls, const GNUNET_HashCode * key, void *value) void GAS_addresses_destroy_all () { + if (GNUNET_NO == running) + return; + if (addresses != NULL) GNUNET_CONTAINER_multihashmap_iterate (addresses, &free_address_it, NULL); GNUNET_assert (active_addr_count == 0); @@ -825,6 +849,7 @@ GAS_addresses_destroy_all () void GAS_addresses_done () { + running = GNUNET_NO; GAS_addresses_destroy_all (); GNUNET_CONTAINER_multihashmap_destroy (addresses); addresses = NULL; -- 2.25.1