diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-07-04 12:29:29 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-07-04 12:29:29 +0000 |
commit | 97290b21585defdb0ff86c67029eb995dac6565b (patch) | |
tree | 79d88db431c56eb22947e8d165cee6b1d2e3bfdc /src/ats | |
parent | 844518059cbe62b8fb491eeb635da5df7433a2ed (diff) | |
download | gnunet-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.c | 63 |
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 | */ | ||
561 | static int | ||
562 | destroy_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 | |||
576 | struct CompareAddressContext | 554 | struct 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 | */ |
1750 | static int | 1732 | static int |
1751 | free_address_it (void *cls, const struct GNUNET_HashCode * key, void *value) | 1733 | destroy_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 | ||