From 692f77eb5db9f2be29079deb2cffa5925682acc8 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Fri, 14 Oct 2011 13:57:31 +0000 Subject: [PATCH] remove addresses on client disconnect --- src/ats/gnunet-service-ats_addresses.c | 50 ++++++++++++++++++++----- src/ats/gnunet-service-ats_addresses.h | 2 + src/ats/gnunet-service-ats_scheduling.c | 2 + src/ats/test_ats_api.conf | 2 +- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index 213b43124..e874ca7c4 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c @@ -61,6 +61,13 @@ struct CompareAddressContext struct ATS_Address * result; }; +static void +destroy_address (struct ATS_Address * addr) +{ + GNUNET_free_non_null (addr->ats); + GNUNET_free (addr->plugin); + GNUNET_free (addr); +} static int compare_address_it (void *cls, @@ -107,6 +114,7 @@ find_address (const struct GNUNET_PeerIdentity *peer, static void merge_ats (struct ATS_Address * dest, struct ATS_Address * source) { + /* int c_src = 0; int c_dest = 0; struct GNUNET_TRANSPORT_ATS_Information * a_src = source->ats; @@ -131,6 +139,7 @@ merge_ats (struct ATS_Address * dest, struct ATS_Address * source) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Have %u entries to update and %u new entries\n",bigger->ats_count, new_entries); + */ } void @@ -176,13 +185,36 @@ GAS_address_update (const struct GNUNET_PeerIdentity *peer, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updated existing address for peer `%s' %X \n", GNUNET_i2s (peer), old); - GNUNET_free (aa->ats); - GNUNET_free (aa->plugin); - GNUNET_free (aa); + destroy_address (aa); } } +static int +remove_client (void *cls, + const GNUNET_HashCode * key, + void *value) +{ + struct GNUNET_SERVER_Client *client = cls; + struct ATS_Address * aa = (struct ATS_Address * ) value; + + if (aa->session_client == client) + { + GNUNET_CONTAINER_multihashmap_remove(addresses, key, value); + destroy_address (aa); + } + return GNUNET_OK; +} + + + +void +GAS_address_client_disconnected (struct GNUNET_SERVER_Client *client) +{ + if (addresses != NULL) + GNUNET_CONTAINER_multihashmap_iterate(addresses, &remove_client, client); +} + void GAS_address_destroyed (const struct GNUNET_PeerIdentity *peer, @@ -214,10 +246,8 @@ GAS_address_destroyed (const struct GNUNET_PeerIdentity *peer, GNUNET_i2s (peer)); GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove(addresses, &peer->hashPubKey, res)); - GNUNET_free (res->plugin); - GNUNET_free_non_null (res->ats); - GNUNET_free (res); - + destroy_address (aa); + destroy_address (res); } @@ -258,9 +288,8 @@ free_address_it (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Freeing address for peer `%s' %X\n", GNUNET_i2s (&aa->peer), aa); - GNUNET_free (aa->plugin); - GNUNET_free_non_null (aa->ats); - GNUNET_free (aa); + GNUNET_CONTAINER_multihashmap_remove (addresses, key, value); + destroy_address (aa); return GNUNET_OK; } @@ -274,6 +303,7 @@ GAS_addresses_done () { GNUNET_CONTAINER_multihashmap_iterate (addresses, &free_address_it, NULL); GNUNET_CONTAINER_multihashmap_destroy (addresses); + addresses = NULL; } diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h index 2aed9f84e..dc70bf553 100644 --- a/src/ats/gnunet-service-ats_addresses.h +++ b/src/ats/gnunet-service-ats_addresses.h @@ -61,6 +61,8 @@ GAS_address_destroyed (const struct GNUNET_PeerIdentity *peer, struct GNUNET_SERVER_Client *session_client, uint32_t session_id); +void +GAS_address_client_disconnected (struct GNUNET_SERVER_Client *session_client); // FIXME: this function should likely end up in the LP-subsystem and // not with 'addresses' in the future... diff --git a/src/ats/gnunet-service-ats_scheduling.c b/src/ats/gnunet-service-ats_scheduling.c index 066096bc2..2491529db 100644 --- a/src/ats/gnunet-service-ats_scheduling.c +++ b/src/ats/gnunet-service-ats_scheduling.c @@ -112,6 +112,7 @@ GAS_scheduling_add_client (struct GNUNET_SERVER_Client *client) } + /** * Unregister a client (which may have been a scheduling client, * but this is not assured). @@ -127,6 +128,7 @@ GAS_scheduling_remove_client (struct GNUNET_SERVER_Client *client) if (NULL == sc) return; GNUNET_CONTAINER_DLL_remove (sc_head, sc_tail, sc); + GAS_address_client_disconnected (client); GNUNET_SERVER_client_drop (client); GNUNET_free (sc); } diff --git a/src/ats/test_ats_api.conf b/src/ats/test_ats_api.conf index 79e92af49..de539981b 100644 --- a/src/ats/test_ats_api.conf +++ b/src/ats/test_ats_api.conf @@ -8,7 +8,7 @@ UNIXPATH = /tmp/test-ats-scheduling-arm.sock [ats] DEBUG = YES -#PREFIX = valgrind --leak-check=full +PREFIX = valgrind --leak-check=full AUTOSTART = YES PORT = 12002 HOSTNAME = localhost -- 2.25.1