aboutsummaryrefslogtreecommitdiff
path: root/src/ats
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-07-04 12:29:29 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-07-04 12:29:29 +0000
commit97290b21585defdb0ff86c67029eb995dac6565b (patch)
tree79d88db431c56eb22947e8d165cee6b1d2e3bfdc /src/ats
parent844518059cbe62b8fb491eeb635da5df7433a2ed (diff)
downloadgnunet-97290b21585defdb0ff86c67029eb995dac6565b.tar.gz
gnunet-97290b21585defdb0ff86c67029eb995dac6565b.zip
correct order of address deletion:
remove, notify, free
Diffstat (limited to 'src/ats')
-rw-r--r--src/ats/gnunet-service-ats_addresses.c63
1 files changed, 25 insertions, 38 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index 21c6443c1..6adb44798 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -551,28 +551,6 @@ create_address (const struct GNUNET_PeerIdentity *peer,
551} 551}
552 552
553 553
554/**
555 * Destroy the given address.
556 *
557 * @param handle the address handle
558 * @param addr address to destroy
559 * @return GNUNET_YES if bandwidth allocations should be recalcualted
560 */
561static int
562destroy_address (struct GAS_Addresses_Handle *handle, struct ATS_Address *addr)
563{
564 int ret;
565
566 ret = GNUNET_NO;
567 GNUNET_assert (GNUNET_YES ==
568 GNUNET_CONTAINER_multihashmap_remove (handle->addresses,
569 &addr->peer.hashPubKey,
570 addr));
571 free_address (addr);
572 return ret;
573}
574
575
576struct CompareAddressContext 554struct CompareAddressContext
577{ 555{
578 const struct ATS_Address *search; 556 const struct ATS_Address *search;
@@ -1008,13 +986,16 @@ destroy_by_session_id (void *cls, const struct GNUNET_HashCode * key, void *valu
1008 (0 == memcmp (des->addr, aa->addr, aa->addr_len))) 986 (0 == memcmp (des->addr, aa->addr, aa->addr_len)))
1009 { 987 {
1010 988
1011 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 989 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1012 "Deleting full address for peer `%s' session %u %p\n", 990 "Deleting full address for peer `%s' session %u %p\n",
1013 GNUNET_i2s (&aa->peer), aa->session_id, aa); 991 GNUNET_i2s (&aa->peer), aa->session_id, aa);
1014 992
1015 /* Notify solver about deletion */ 993 /* Notify solver about deletion */
994 GNUNET_assert (GNUNET_YES ==
995 GNUNET_CONTAINER_multihashmap_remove (handle->addresses,
996 &aa->peer.hashPubKey, aa));
1016 handle->s_del (handle->solver, aa, GNUNET_NO); 997 handle->s_del (handle->solver, aa, GNUNET_NO);
1017 destroy_address (handle, aa); 998 free_address (aa);
1018 dc->result = GNUNET_NO; 999 dc->result = GNUNET_NO;
1019 return GNUNET_OK; /* Continue iteration */ 1000 return GNUNET_OK; /* Continue iteration */
1020 } 1001 }
@@ -1028,7 +1009,7 @@ destroy_by_session_id (void *cls, const struct GNUNET_HashCode * key, void *valu
1028 if ((aa->session_id != 0) && 1009 if ((aa->session_id != 0) &&
1029 (0 != strcmp (des->plugin, aa->plugin))) 1010 (0 != strcmp (des->plugin, aa->plugin)))
1030 { 1011 {
1031 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1012 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1032 "Different plugins during removal: `%s' vs `%s' \n", 1013 "Different plugins during removal: `%s' vs `%s' \n",
1033 des->plugin, aa->plugin); 1014 des->plugin, aa->plugin);
1034 GNUNET_break (0); 1015 GNUNET_break (0);
@@ -1043,8 +1024,11 @@ destroy_by_session_id (void *cls, const struct GNUNET_HashCode * key, void *valu
1043 GNUNET_i2s (&aa->peer), aa->plugin, aa->session_id); 1024 GNUNET_i2s (&aa->peer), aa->plugin, aa->session_id);
1044 1025
1045 /* Notify solver about deletion */ 1026 /* Notify solver about deletion */
1027 GNUNET_assert (GNUNET_YES ==
1028 GNUNET_CONTAINER_multihashmap_remove (handle->addresses,
1029 &aa->peer.hashPubKey, aa));
1046 handle->s_del (handle->solver, aa, GNUNET_NO); 1030 handle->s_del (handle->solver, aa, GNUNET_NO);
1047 destroy_address (handle, aa); 1031 free_address (aa);
1048 dc->result = GNUNET_NO; 1032 dc->result = GNUNET_NO;
1049 return GNUNET_OK; /* Continue iteration */ 1033 return GNUNET_OK; /* Continue iteration */
1050 } 1034 }
@@ -1084,19 +1068,12 @@ GAS_addresses_destroy (struct GAS_Addresses_Handle *handle,
1084{ 1068{
1085 struct ATS_Address *ea; 1069 struct ATS_Address *ea;
1086 struct DestroyContext dc; 1070 struct DestroyContext dc;
1087
1088 if (GNUNET_NO == handle->running) 1071 if (GNUNET_NO == handle->running)
1089 return; 1072 return;
1090 1073
1091 /* Get existing address */ 1074 /* Get existing address */
1092 ea = lookup_address (handle, peer, plugin_name, plugin_addr, plugin_addr_len, 1075 ea = lookup_address (handle, peer, plugin_name, plugin_addr, plugin_addr_len,
1093 session_id, NULL, 0); 1076 session_id, NULL, 0);
1094
1095 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1096 "Received `%s' for peer `%s' address %p session %u\n",
1097 "ADDRESS DESTROY",
1098 GNUNET_i2s (peer), ea, session_id);
1099
1100 if (ea == NULL) 1077 if (ea == NULL)
1101 { 1078 {
1102 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Tried to destroy unknown address for peer `%s' `%s' session id %u\n", 1079 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Tried to destroy unknown address for peer `%s' `%s' session id %u\n",
@@ -1104,6 +1081,11 @@ GAS_addresses_destroy (struct GAS_Addresses_Handle *handle,
1104 return; 1081 return;
1105 } 1082 }
1106 1083
1084 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1085 "Received `%s' for peer `%s' address %p session %u\n",
1086 "ADDRESS DESTROY",
1087 GNUNET_i2s (peer), ea, session_id);
1088
1107 GNUNET_break (0 < strlen (plugin_name)); 1089 GNUNET_break (0 < strlen (plugin_name));
1108 dc.handle = handle; 1090 dc.handle = handle;
1109 dc.aa = create_address (peer, plugin_name, plugin_addr, plugin_addr_len, session_id); 1091 dc.aa = create_address (peer, plugin_name, plugin_addr, plugin_addr_len, session_id);
@@ -1740,7 +1722,7 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
1740 1722
1741 1723
1742/** 1724/**
1743 * Free memory of address. 1725 * Destroy all addresses iterator
1744 * 1726 *
1745 * @param cls NULL 1727 * @param cls NULL
1746 * @param key peer identity (unused) 1728 * @param key peer identity (unused)
@@ -1748,12 +1730,18 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
1748 * @return GNUNET_OK (continue to iterate) 1730 * @return GNUNET_OK (continue to iterate)
1749 */ 1731 */
1750static int 1732static int
1751free_address_it (void *cls, const struct GNUNET_HashCode * key, void *value) 1733destroy_all_address_it (void *cls, const struct GNUNET_HashCode * key, void *value)
1752{ 1734{
1753 struct GAS_Addresses_Handle *handle = cls; 1735 struct GAS_Addresses_Handle *handle = cls;
1754 struct ATS_Address *aa = value; 1736 struct ATS_Address *aa = value;
1737
1738 /* Remove */
1739 GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (handle->addresses, key, value));
1740 /* Notify */
1755 handle->s_del (handle->solver, aa, GNUNET_NO); 1741 handle->s_del (handle->solver, aa, GNUNET_NO);
1756 destroy_address (handle, aa); 1742 /* Destroy */
1743 free_address (aa);
1744
1757 return GNUNET_OK; 1745 return GNUNET_OK;
1758} 1746}
1759 1747
@@ -1772,9 +1760,8 @@ GAS_addresses_destroy_all (struct GAS_Addresses_Handle *handle)
1772 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1760 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1773 "Received `%s'\n", 1761 "Received `%s'\n",
1774 "DESTROY ALL"); 1762 "DESTROY ALL");
1775
1776 if (handle->addresses != NULL) 1763 if (handle->addresses != NULL)
1777 GNUNET_CONTAINER_multihashmap_iterate (handle->addresses, &free_address_it, handle); 1764 GNUNET_CONTAINER_multihashmap_iterate (handle->addresses, &destroy_all_address_it, handle);
1778} 1765}
1779 1766
1780 1767