remove addresses on client disconnect
authorMatthias Wachs <wachs@net.in.tum.de>
Fri, 14 Oct 2011 13:57:31 +0000 (13:57 +0000)
committerMatthias Wachs <wachs@net.in.tum.de>
Fri, 14 Oct 2011 13:57:31 +0000 (13:57 +0000)
src/ats/gnunet-service-ats_addresses.c
src/ats/gnunet-service-ats_addresses.h
src/ats/gnunet-service-ats_scheduling.c
src/ats/test_ats_api.conf

index 213b43124529bb9330871f3170ebd1f6f79e9457..e874ca7c442ed8b8168e3111fde4442a0230b8f6 100644 (file)
@@ -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;
 }
 
 
index 2aed9f84e98905a3e6279bda0339fc4c7d9bb66d..dc70bf553c0701976c0643451c66ae52fca673ca 100644 (file)
@@ -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...
index 066096bc238fbf065f6c9930eabd766f2ff0a779..2491529db8630dd08d660a6f03f0cdced3527e01 100644 (file)
@@ -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);
 }
index 79e92af49655a713357e55a5e38b3e0d213f12d1..de539981baa4a2745569f5d591f98553f37612b9 100644 (file)
@@ -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