aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-10-07 18:19:32 +0000
committerChristian Grothoff <christian@grothoff.org>2012-10-07 18:19:32 +0000
commita60b958f984d08525b636a2c7eae564ebec54ae6 (patch)
tree6dcbbf91d734834f804b2fd9ab790244e2d60e6c
parentdecf459805cdb3f6811f979df4831bc2ce9a2858 (diff)
downloadgnunet-a60b958f984d08525b636a2c7eae564ebec54ae6.tar.gz
gnunet-a60b958f984d08525b636a2c7eae564ebec54ae6.zip
-chaning multihashmap API to allow option for avoiding key allocation
-rw-r--r--src/ats/gnunet-service-ats_addresses.c2
-rw-r--r--src/ats/gnunet-service-ats_reservations.c2
-rw-r--r--src/ats/perf_ats_mlp.c2
-rw-r--r--src/ats/test_ats_mlp.c2
-rw-r--r--src/ats/test_ats_mlp_averaging.c2
-rw-r--r--src/chat/gnunet-service-chat.c2
-rw-r--r--src/core/core_api.c2
-rw-r--r--src/core/gnunet-service-core_clients.c4
-rw-r--r--src/core/gnunet-service-core_neighbours.c2
-rw-r--r--src/core/gnunet-service-core_sessions.c2
-rw-r--r--src/dht/dht_api.c2
-rw-r--r--src/dht/gnunet-service-dht_clients.c2
-rw-r--r--src/dht/gnunet-service-dht_hello.c2
-rw-r--r--src/dht/gnunet-service-dht_neighbours.c2
-rw-r--r--src/dht/gnunet-service-dht_routing.c2
-rw-r--r--src/dv/dv_api.c2
-rw-r--r--src/dv/gnunet-service-dv.c4
-rw-r--r--src/dv/test_transport_api_dv.c2
-rw-r--r--src/exit/gnunet-daemon-exit.c6
-rw-r--r--src/fs/fs_api.c4
-rw-r--r--src/fs/fs_download.c2
-rw-r--r--src/fs/fs_namespace.c3
-rw-r--r--src/fs/fs_search.c4
-rw-r--r--src/fs/fs_sharetree.c4
-rw-r--r--src/fs/gnunet-auto-share.c2
-rw-r--r--src/fs/gnunet-service-fs_cp.c4
-rw-r--r--src/fs/gnunet-service-fs_indexing.c2
-rw-r--r--src/fs/gnunet-service-fs_pe.c4
-rw-r--r--src/fs/gnunet-service-fs_pr.c2
-rw-r--r--src/include/gnunet_container_lib.h12
-rw-r--r--src/integration-tests/connection_watchdog.c2
-rw-r--r--src/lockmanager/gnunet-service-lockmanager.c2
-rw-r--r--src/lockmanager/lockmanager_api.c2
-rw-r--r--src/mesh/gnunet-service-mesh.c30
-rw-r--r--src/mesh/mesh_tunnel_tree.c2
-rw-r--r--src/namestore/gnunet-service-namestore.c2
-rw-r--r--src/nse/gnunet-service-nse.c2
-rw-r--r--src/peerinfo/gnunet-service-peerinfo.c4
-rw-r--r--src/testbed/gnunet-service-testbed.c2
-rw-r--r--src/testing_old/testing_group.c12
-rw-r--r--src/topology/gnunet-daemon-topology.c2
-rw-r--r--src/transport/gnunet-service-transport_blacklist.c3
-rw-r--r--src/transport/gnunet-service-transport_neighbours.c2
-rw-r--r--src/transport/gnunet-service-transport_validation.c3
-rw-r--r--src/transport/gnunet-transport.c2
-rw-r--r--src/transport/plugin_transport_tcp.c74
-rw-r--r--src/transport/plugin_transport_udp.c2
-rw-r--r--src/transport/plugin_transport_unix.c2
-rw-r--r--src/transport/transport_api.c4
-rw-r--r--src/util/container_multihashmap.c12
-rw-r--r--src/util/peer.c4
-rw-r--r--src/util/test_container_multihashmap.c2
-rw-r--r--src/vpn/gnunet-service-vpn.c4
53 files changed, 150 insertions, 115 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index 72176fc76..075324762 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -929,7 +929,7 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
929 929
930 running = GNUNET_NO; 930 running = GNUNET_NO;
931 931
932 addresses = GNUNET_CONTAINER_multihashmap_create (128); 932 addresses = GNUNET_CONTAINER_multihashmap_create (128, GNUNET_NO);
933 GNUNET_assert (NULL != addresses); 933 GNUNET_assert (NULL != addresses);
934 934
935 if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string(cfg, "ats", "WAN_QUOTA_IN", &quota_wan_in_str)) 935 if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string(cfg, "ats", "WAN_QUOTA_IN", &quota_wan_in_str))
diff --git a/src/ats/gnunet-service-ats_reservations.c b/src/ats/gnunet-service-ats_reservations.c
index daacbbec0..3354c4e41 100644
--- a/src/ats/gnunet-service-ats_reservations.c
+++ b/src/ats/gnunet-service-ats_reservations.c
@@ -122,7 +122,7 @@ GAS_reservations_set_bandwidth (const struct GNUNET_PeerIdentity *peer,
122void 122void
123GAS_reservations_init () 123GAS_reservations_init ()
124{ 124{
125 trackers = GNUNET_CONTAINER_multihashmap_create (128); 125 trackers = GNUNET_CONTAINER_multihashmap_create (128, GNUNET_NO);
126} 126}
127 127
128 128
diff --git a/src/ats/perf_ats_mlp.c b/src/ats/perf_ats_mlp.c
index c8ecda685..51f910256 100644
--- a/src/ats/perf_ats_mlp.c
+++ b/src/ats/perf_ats_mlp.c
@@ -213,7 +213,7 @@ check (void *cls, char *const *args, const char *cfgfile,
213 p = GNUNET_malloc (peers * sizeof (struct ATS_Peer)); 213 p = GNUNET_malloc (peers * sizeof (struct ATS_Peer));
214 a = GNUNET_malloc (peers * addresses * sizeof (struct ATS_Address)); 214 a = GNUNET_malloc (peers * addresses * sizeof (struct ATS_Address));
215 215
216 amap = GNUNET_CONTAINER_multihashmap_create(addresses * peers); 216 amap = GNUNET_CONTAINER_multihashmap_create(addresses * peers, GNUNET_NO);
217 217
218 mlp->auto_solve = GNUNET_NO; 218 mlp->auto_solve = GNUNET_NO;
219 if (start == 0) 219 if (start == 0)
diff --git a/src/ats/test_ats_mlp.c b/src/ats/test_ats_mlp.c
index c4672103d..3e449dbd2 100644
--- a/src/ats/test_ats_mlp.c
+++ b/src/ats/test_ats_mlp.c
@@ -76,7 +76,7 @@ check (void *cls, char *const *args, const char *cfgfile,
76 76
77 stats = GNUNET_STATISTICS_create("ats", cfg); 77 stats = GNUNET_STATISTICS_create("ats", cfg);
78 78
79 addresses = GNUNET_CONTAINER_multihashmap_create (10); 79 addresses = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
80 80
81 mlp = GAS_mlp_init (cfg, NULL, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS); 81 mlp = GAS_mlp_init (cfg, NULL, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS);
82 mlp->auto_solve = GNUNET_NO; 82 mlp->auto_solve = GNUNET_NO;
diff --git a/src/ats/test_ats_mlp_averaging.c b/src/ats/test_ats_mlp_averaging.c
index bf219df22..2f70137df 100644
--- a/src/ats/test_ats_mlp_averaging.c
+++ b/src/ats/test_ats_mlp_averaging.c
@@ -77,7 +77,7 @@ check (void *cls, char *const *args, const char *cfgfile,
77 77
78 stats = GNUNET_STATISTICS_create("ats", cfg); 78 stats = GNUNET_STATISTICS_create("ats", cfg);
79 79
80 addresses = GNUNET_CONTAINER_multihashmap_create (10); 80 addresses = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
81 81
82 mlp = GAS_mlp_init (cfg, NULL, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS); 82 mlp = GAS_mlp_init (cfg, NULL, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS);
83 mlp->auto_solve = GNUNET_NO; 83 mlp->auto_solve = GNUNET_NO;
diff --git a/src/chat/gnunet-service-chat.c b/src/chat/gnunet-service-chat.c
index 580851557..ec988e8fd 100644
--- a/src/chat/gnunet-service-chat.c
+++ b/src/chat/gnunet-service-chat.c
@@ -1706,7 +1706,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
1706 cfg = c; 1706 cfg = c;
1707 nc = GNUNET_SERVER_notification_context_create (server, 16); 1707 nc = GNUNET_SERVER_notification_context_create (server, 16);
1708 connected_peers = 1708 connected_peers =
1709 GNUNET_CONTAINER_multihashmap_create (EXPECTED_NEIGHBOUR_COUNT); 1709 GNUNET_CONTAINER_multihashmap_create (EXPECTED_NEIGHBOUR_COUNT, GNUNET_NO);
1710 GNUNET_SERVER_add_handlers (server, handlers); 1710 GNUNET_SERVER_add_handlers (server, handlers);
1711 core = 1711 core =
1712 GNUNET_CORE_connect (cfg, NULL, &core_init, 1712 GNUNET_CORE_connect (cfg, NULL, &core_init,
diff --git a/src/core/core_api.c b/src/core/core_api.c
index 46105a466..4d1a5493f 100644
--- a/src/core/core_api.c
+++ b/src/core/core_api.c
@@ -1173,7 +1173,7 @@ GNUNET_CORE_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
1173 h->handlers = handlers; 1173 h->handlers = handlers;
1174 h->hcnt = 0; 1174 h->hcnt = 0;
1175 h->currently_down = GNUNET_YES; 1175 h->currently_down = GNUNET_YES;
1176 h->peers = GNUNET_CONTAINER_multihashmap_create (128); 1176 h->peers = GNUNET_CONTAINER_multihashmap_create (128, GNUNET_NO);
1177 h->retry_backoff = GNUNET_TIME_UNIT_MILLISECONDS; 1177 h->retry_backoff = GNUNET_TIME_UNIT_MILLISECONDS;
1178 if (NULL != handlers) 1178 if (NULL != handlers)
1179 while (handlers[h->hcnt].callback != NULL) 1179 while (handlers[h->hcnt].callback != NULL)
diff --git a/src/core/gnunet-service-core_clients.c b/src/core/gnunet-service-core_clients.c
index 91f1ae65a..56ebcc423 100644
--- a/src/core/gnunet-service-core_clients.c
+++ b/src/core/gnunet-service-core_clients.c
@@ -298,7 +298,7 @@ handle_client_init (void *cls, struct GNUNET_SERVER_Client *client,
298 c->options = ntohl (im->options); 298 c->options = ntohl (im->options);
299 all_client_options |= c->options; 299 all_client_options |= c->options;
300 c->types = (const uint16_t *) &c[1]; 300 c->types = (const uint16_t *) &c[1];
301 c->connectmap = GNUNET_CONTAINER_multihashmap_create (16); 301 c->connectmap = GNUNET_CONTAINER_multihashmap_create (16, GNUNET_NO);
302 GNUNET_assert (GNUNET_YES == 302 GNUNET_assert (GNUNET_YES ==
303 GNUNET_CONTAINER_multihashmap_put (c->connectmap, 303 GNUNET_CONTAINER_multihashmap_put (c->connectmap,
304 &GSC_my_identity.hashPubKey, 304 &GSC_my_identity.hashPubKey,
@@ -349,7 +349,7 @@ handle_client_send_request (void *cls, struct GNUNET_SERVER_Client *client,
349 return; 349 return;
350 } 350 }
351 if (c->requests == NULL) 351 if (c->requests == NULL)
352 c->requests = GNUNET_CONTAINER_multihashmap_create (16); 352 c->requests = GNUNET_CONTAINER_multihashmap_create (16, GNUNET_NO);
353 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 353 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
354 "Client asked for transmission to `%s'\n", 354 "Client asked for transmission to `%s'\n",
355 GNUNET_i2s (&req->peer)); 355 GNUNET_i2s (&req->peer));
diff --git a/src/core/gnunet-service-core_neighbours.c b/src/core/gnunet-service-core_neighbours.c
index 3b1357425..aa77fe47e 100644
--- a/src/core/gnunet-service-core_neighbours.c
+++ b/src/core/gnunet-service-core_neighbours.c
@@ -464,7 +464,7 @@ GSC_NEIGHBOURS_transmit (const struct GNUNET_PeerIdentity *target,
464int 464int
465GSC_NEIGHBOURS_init () 465GSC_NEIGHBOURS_init ()
466{ 466{
467 neighbours = GNUNET_CONTAINER_multihashmap_create (128); 467 neighbours = GNUNET_CONTAINER_multihashmap_create (128, GNUNET_NO);
468 transport = 468 transport =
469 GNUNET_TRANSPORT_connect (GSC_cfg, &GSC_my_identity, NULL, 469 GNUNET_TRANSPORT_connect (GSC_cfg, &GSC_my_identity, NULL,
470 &handle_transport_receive, 470 &handle_transport_receive,
diff --git a/src/core/gnunet-service-core_sessions.c b/src/core/gnunet-service-core_sessions.c
index 87fa91189..3a603bc81 100644
--- a/src/core/gnunet-service-core_sessions.c
+++ b/src/core/gnunet-service-core_sessions.c
@@ -782,7 +782,7 @@ GSC_SESSIONS_add_to_typemap (const struct GNUNET_PeerIdentity *peer,
782void 782void
783GSC_SESSIONS_init () 783GSC_SESSIONS_init ()
784{ 784{
785 sessions = GNUNET_CONTAINER_multihashmap_create (128); 785 sessions = GNUNET_CONTAINER_multihashmap_create (128, GNUNET_NO);
786} 786}
787 787
788 788
diff --git a/src/dht/dht_api.c b/src/dht/dht_api.c
index 46436755b..023ffe60d 100644
--- a/src/dht/dht_api.c
+++ b/src/dht/dht_api.c
@@ -915,7 +915,7 @@ GNUNET_DHT_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
915 handle->cfg = cfg; 915 handle->cfg = cfg;
916 handle->uid_gen = 916 handle->uid_gen =
917 GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX); 917 GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX);
918 handle->active_requests = GNUNET_CONTAINER_multihashmap_create (ht_len); 918 handle->active_requests = GNUNET_CONTAINER_multihashmap_create (ht_len, GNUNET_NO);
919 if (GNUNET_NO == try_connect (handle)) 919 if (GNUNET_NO == try_connect (handle))
920 { 920 {
921 GNUNET_DHT_disconnect (handle); 921 GNUNET_DHT_disconnect (handle);
diff --git a/src/dht/gnunet-service-dht_clients.c b/src/dht/gnunet-service-dht_clients.c
index a67155b89..314cae7c9 100644
--- a/src/dht/gnunet-service-dht_clients.c
+++ b/src/dht/gnunet-service-dht_clients.c
@@ -1351,7 +1351,7 @@ GDS_CLIENTS_init (struct GNUNET_SERVER_Handle *server)
1351 sizeof (struct GNUNET_DHT_MonitorStartStopMessage)}, 1351 sizeof (struct GNUNET_DHT_MonitorStartStopMessage)},
1352 {NULL, NULL, 0, 0} 1352 {NULL, NULL, 0, 0}
1353 }; 1353 };
1354 forward_map = GNUNET_CONTAINER_multihashmap_create (1024); 1354 forward_map = GNUNET_CONTAINER_multihashmap_create (1024, GNUNET_NO);
1355 retry_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); 1355 retry_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
1356 GNUNET_SERVER_add_handlers (server, plugin_handlers); 1356 GNUNET_SERVER_add_handlers (server, plugin_handlers);
1357 GNUNET_SERVER_disconnect_notify (server, &handle_client_disconnect, NULL); 1357 GNUNET_SERVER_disconnect_notify (server, &handle_client_disconnect, NULL);
diff --git a/src/dht/gnunet-service-dht_hello.c b/src/dht/gnunet-service-dht_hello.c
index b4c5150c9..19da79e23 100644
--- a/src/dht/gnunet-service-dht_hello.c
+++ b/src/dht/gnunet-service-dht_hello.c
@@ -99,7 +99,7 @@ void
99GDS_HELLO_init () 99GDS_HELLO_init ()
100{ 100{
101 pnc = GNUNET_PEERINFO_notify (GDS_cfg, &process_hello, NULL); 101 pnc = GNUNET_PEERINFO_notify (GDS_cfg, &process_hello, NULL);
102 peer_to_hello = GNUNET_CONTAINER_multihashmap_create (256); 102 peer_to_hello = GNUNET_CONTAINER_multihashmap_create (256, GNUNET_NO);
103} 103}
104 104
105 105
diff --git a/src/dht/gnunet-service-dht_neighbours.c b/src/dht/gnunet-service-dht_neighbours.c
index 7401eb8ac..198b64f53 100644
--- a/src/dht/gnunet-service-dht_neighbours.c
+++ b/src/dht/gnunet-service-dht_neighbours.c
@@ -2018,7 +2018,7 @@ GDS_NEIGHBOURS_init ()
2018 GNUNET_NO, core_handlers); 2018 GNUNET_NO, core_handlers);
2019 if (coreAPI == NULL) 2019 if (coreAPI == NULL)
2020 return GNUNET_SYSERR; 2020 return GNUNET_SYSERR;
2021 all_known_peers = GNUNET_CONTAINER_multihashmap_create (256); 2021 all_known_peers = GNUNET_CONTAINER_multihashmap_create (256, GNUNET_NO);
2022 return GNUNET_OK; 2022 return GNUNET_OK;
2023} 2023}
2024 2024
diff --git a/src/dht/gnunet-service-dht_routing.c b/src/dht/gnunet-service-dht_routing.c
index 796991b5b..4c2e69b36 100644
--- a/src/dht/gnunet-service-dht_routing.c
+++ b/src/dht/gnunet-service-dht_routing.c
@@ -429,7 +429,7 @@ void
429GDS_ROUTING_init () 429GDS_ROUTING_init ()
430{ 430{
431 recent_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); 431 recent_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
432 recent_map = GNUNET_CONTAINER_multihashmap_create (DHT_MAX_RECENT * 4 / 3); 432 recent_map = GNUNET_CONTAINER_multihashmap_create (DHT_MAX_RECENT * 4 / 3, GNUNET_NO);
433} 433}
434 434
435 435
diff --git a/src/dv/dv_api.c b/src/dv/dv_api.c
index 131503e6e..8f866e2e5 100644
--- a/src/dv/dv_api.c
+++ b/src/dv/dv_api.c
@@ -587,7 +587,7 @@ GNUNET_DV_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
587 GNUNET_YES, &transmit_start, 587 GNUNET_YES, &transmit_start,
588 start_context); 588 start_context);
589 589
590 handle->send_callbacks = GNUNET_CONTAINER_multihashmap_create (100); 590 handle->send_callbacks = GNUNET_CONTAINER_multihashmap_create (100, GNUNET_NO);
591 591
592 return handle; 592 return handle;
593} 593}
diff --git a/src/dv/gnunet-service-dv.c b/src/dv/gnunet-service-dv.c
index 5c0b6f5fa..ca881aa91 100644
--- a/src/dv/gnunet-service-dv.c
+++ b/src/dv/gnunet-service-dv.c
@@ -3290,9 +3290,9 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
3290 neighbor_max_heap = 3290 neighbor_max_heap =
3291 GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MAX); 3291 GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MAX);
3292 3292
3293 direct_neighbors = GNUNET_CONTAINER_multihashmap_create (max_hosts); 3293 direct_neighbors = GNUNET_CONTAINER_multihashmap_create (max_hosts, GNUNET_NO);
3294 extended_neighbors = 3294 extended_neighbors =
3295 GNUNET_CONTAINER_multihashmap_create (max_table_size * 3); 3295 GNUNET_CONTAINER_multihashmap_create (max_table_size * 3, GNUNET_NO);
3296 3296
3297 GNUNET_SERVER_add_handlers (server, plugin_handlers); 3297 GNUNET_SERVER_add_handlers (server, plugin_handlers);
3298 coreAPI = GNUNET_CORE_connect (cfg, NULL, /* FIXME: anything we want to pass around? */ 3298 coreAPI = GNUNET_CORE_connect (cfg, NULL, /* FIXME: anything we want to pass around? */
diff --git a/src/dv/test_transport_api_dv.c b/src/dv/test_transport_api_dv.c
index 769694f90..c78d5072d 100644
--- a/src/dv/test_transport_api_dv.c
+++ b/src/dv/test_transport_api_dv.c
@@ -1180,7 +1180,7 @@ run (void *cls, char *const *args, const char *cfgfile,
1180 (GNUNET_TIME_UNIT_MINUTES, 5), &end_badly, 1180 (GNUNET_TIME_UNIT_MINUTES, 5), &end_badly,
1181 "didn't start all daemons in reasonable amount of time!!!"); 1181 "didn't start all daemons in reasonable amount of time!!!");
1182 1182
1183 peer_daemon_hash = GNUNET_CONTAINER_multihashmap_create (peers_left); 1183 peer_daemon_hash = GNUNET_CONTAINER_multihashmap_create (peers_left, GNUNET_NO);
1184 pg = GNUNET_TESTING_daemons_start (cfg, peers_left, /* Total number of peers */ 1184 pg = GNUNET_TESTING_daemons_start (cfg, peers_left, /* Total number of peers */
1185 peers_left, /* Number of outstanding connections */ 1185 peers_left, /* Number of outstanding connections */
1186 peers_left, /* Number of parallel ssh connections, or peers being started at once */ 1186 peers_left, /* Number of parallel ssh connections, or peers being started at once */
diff --git a/src/exit/gnunet-daemon-exit.c b/src/exit/gnunet-daemon-exit.c
index 79c1f8435..4359db33c 100644
--- a/src/exit/gnunet-daemon-exit.c
+++ b/src/exit/gnunet-daemon-exit.c
@@ -3194,11 +3194,11 @@ run (void *cls, char *const *args GNUNET_UNUSED,
3194 } 3194 }
3195 exit_argv[7] = NULL; 3195 exit_argv[7] = NULL;
3196 3196
3197 udp_services = GNUNET_CONTAINER_multihashmap_create (65536); 3197 udp_services = GNUNET_CONTAINER_multihashmap_create (65536, GNUNET_NO);
3198 tcp_services = GNUNET_CONTAINER_multihashmap_create (65536); 3198 tcp_services = GNUNET_CONTAINER_multihashmap_create (65536, GNUNET_NO);
3199 GNUNET_CONFIGURATION_iterate_sections (cfg, &read_service_conf, NULL); 3199 GNUNET_CONFIGURATION_iterate_sections (cfg, &read_service_conf, NULL);
3200 3200
3201 connections_map = GNUNET_CONTAINER_multihashmap_create (65536); 3201 connections_map = GNUNET_CONTAINER_multihashmap_create (65536, GNUNET_NO);
3202 connections_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); 3202 connections_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
3203 mesh_handle 3203 mesh_handle
3204 = GNUNET_MESH_connect (cfg, NULL, 3204 = GNUNET_MESH_connect (cfg, NULL,
diff --git a/src/fs/fs_api.c b/src/fs/fs_api.c
index c99131d94..059c70ba6 100644
--- a/src/fs/fs_api.c
+++ b/src/fs/fs_api.c
@@ -2681,7 +2681,7 @@ deserialize_download (struct GNUNET_FS_Handle *h,
2681 } 2681 }
2682 dc->options = (enum GNUNET_FS_DownloadOptions) options; 2682 dc->options = (enum GNUNET_FS_DownloadOptions) options;
2683 dc->active = 2683 dc->active =
2684 GNUNET_CONTAINER_multihashmap_create (1 + 2 * (dc->length / DBLOCK_SIZE)); 2684 GNUNET_CONTAINER_multihashmap_create (1 + 2 * (dc->length / DBLOCK_SIZE), GNUNET_NO);
2685 dc->has_finished = (int) status; 2685 dc->has_finished = (int) status;
2686 dc->treedepth = 2686 dc->treedepth =
2687 GNUNET_FS_compute_depth (GNUNET_FS_uri_chk_get_file_size (dc->uri)); 2687 GNUNET_FS_compute_depth (GNUNET_FS_uri_chk_get_file_size (dc->uri));
@@ -2804,7 +2804,7 @@ deserialize_search (struct GNUNET_FS_Handle *h,
2804 goto cleanup; 2804 goto cleanup;
2805 } 2805 }
2806 sc->options = (enum GNUNET_FS_SearchOptions) options; 2806 sc->options = (enum GNUNET_FS_SearchOptions) options;
2807 sc->master_result_map = GNUNET_CONTAINER_multihashmap_create (16); 2807 sc->master_result_map = GNUNET_CONTAINER_multihashmap_create (16, GNUNET_NO);
2808 dn = get_serialization_file_name_in_dir (h, 2808 dn = get_serialization_file_name_in_dir (h,
2809 (sc->psearch_result == 2809 (sc->psearch_result ==
2810 NULL) ? 2810 NULL) ?
diff --git a/src/fs/fs_download.c b/src/fs/fs_download.c
index e9839cc2d..ecb5c5f8a 100644
--- a/src/fs/fs_download.c
+++ b/src/fs/fs_download.c
@@ -2101,7 +2101,7 @@ create_download_context (struct GNUNET_FS_Handle *h,
2101 dc->anonymity = anonymity; 2101 dc->anonymity = anonymity;
2102 dc->options = options; 2102 dc->options = options;
2103 dc->active = 2103 dc->active =
2104 GNUNET_CONTAINER_multihashmap_create (1 + 2 * (length / DBLOCK_SIZE)); 2104 GNUNET_CONTAINER_multihashmap_create (1 + 2 * (length / DBLOCK_SIZE), GNUNET_NO);
2105 dc->treedepth = 2105 dc->treedepth =
2106 GNUNET_FS_compute_depth (GNUNET_FS_uri_chk_get_file_size (dc->uri)); 2106 GNUNET_FS_compute_depth (GNUNET_FS_uri_chk_get_file_size (dc->uri));
2107 if ((NULL == filename) && (is_recursive_download (dc))) 2107 if ((NULL == filename) && (is_recursive_download (dc)))
diff --git a/src/fs/fs_namespace.c b/src/fs/fs_namespace.c
index af1200dc4..eaff8a6d2 100644
--- a/src/fs/fs_namespace.c
+++ b/src/fs/fs_namespace.c
@@ -853,7 +853,8 @@ GNUNET_FS_namespace_list_updateable (struct GNUNET_FS_Namespace *ns,
853 ns->update_map = 853 ns->update_map =
854 GNUNET_CONTAINER_multihashmap_create (2 + 854 GNUNET_CONTAINER_multihashmap_create (2 +
855 3 * ns->update_node_count / 855 3 * ns->update_node_count /
856 4); 856 4,
857 GNUNET_NO);
857 for (i = 0; i < ns->update_node_count; i++) 858 for (i = 0; i < ns->update_node_count; i++)
858 { 859 {
859 nsn = ns->update_nodes[i]; 860 nsn = ns->update_nodes[i];
diff --git a/src/fs/fs_search.c b/src/fs/fs_search.c
index a5b2d3643..370fd2f5c 100644
--- a/src/fs/fs_search.c
+++ b/src/fs/fs_search.c
@@ -1202,7 +1202,7 @@ search_start (struct GNUNET_FS_Handle *h, const struct GNUNET_FS_Uri *uri,
1202 sc->psearch_result = psearch; 1202 sc->psearch_result = psearch;
1203 psearch->update_search = sc; 1203 psearch->update_search = sc;
1204 } 1204 }
1205 sc->master_result_map = GNUNET_CONTAINER_multihashmap_create (16); 1205 sc->master_result_map = GNUNET_CONTAINER_multihashmap_create (16, GNUNET_NO);
1206 sc->client_info = cctx; 1206 sc->client_info = cctx;
1207 if (GNUNET_OK != GNUNET_FS_search_start_searching_ (sc)) 1207 if (GNUNET_OK != GNUNET_FS_search_start_searching_ (sc))
1208 { 1208 {
@@ -1256,7 +1256,7 @@ GNUNET_FS_search_start_searching_ (struct GNUNET_FS_SearchContext *sc)
1256 sc->requests[i].mandatory = (sc->uri->data.ksk.keywords[i][0] == '+'); 1256 sc->requests[i].mandatory = (sc->uri->data.ksk.keywords[i][0] == '+');
1257 if (sc->requests[i].mandatory) 1257 if (sc->requests[i].mandatory)
1258 sc->mandatory_count++; 1258 sc->mandatory_count++;
1259 sc->requests[i].results = GNUNET_CONTAINER_multihashmap_create (4); 1259 sc->requests[i].results = GNUNET_CONTAINER_multihashmap_create (4, GNUNET_NO);
1260 GNUNET_CRYPTO_hash (keyword, strlen (keyword), &sc->requests[i].key); 1260 GNUNET_CRYPTO_hash (keyword, strlen (keyword), &sc->requests[i].key);
1261 } 1261 }
1262 } 1262 }
diff --git a/src/fs/fs_sharetree.c b/src/fs/fs_sharetree.c
index f75571c46..5e96390ce 100644
--- a/src/fs/fs_sharetree.c
+++ b/src/fs/fs_sharetree.c
@@ -415,8 +415,8 @@ GNUNET_FS_share_tree_trim (struct GNUNET_FS_ShareTreeItem *toplevel)
415 415
416 if (toplevel == NULL) 416 if (toplevel == NULL)
417 return; 417 return;
418 tc.keywordcounter = GNUNET_CONTAINER_multihashmap_create (1024); 418 tc.keywordcounter = GNUNET_CONTAINER_multihashmap_create (1024, GNUNET_NO);
419 tc.metacounter = GNUNET_CONTAINER_multihashmap_create (1024); 419 tc.metacounter = GNUNET_CONTAINER_multihashmap_create (1024, GNUNET_NO);
420 share_tree_trim (&tc, toplevel); 420 share_tree_trim (&tc, toplevel);
421 GNUNET_CONTAINER_multihashmap_destroy (tc.keywordcounter); 421 GNUNET_CONTAINER_multihashmap_destroy (tc.keywordcounter);
422 GNUNET_CONTAINER_multihashmap_destroy (tc.metacounter); 422 GNUNET_CONTAINER_multihashmap_destroy (tc.metacounter);
diff --git a/src/fs/gnunet-auto-share.c b/src/fs/gnunet-auto-share.c
index 1a6e74b8c..886e0ba69 100644
--- a/src/fs/gnunet-auto-share.c
+++ b/src/fs/gnunet-auto-share.c
@@ -690,7 +690,7 @@ run (void *cls, char *const *args, const char *cfgfile,
690 cfg_filename = GNUNET_strdup (cfgfile); 690 cfg_filename = GNUNET_strdup (cfgfile);
691 cfg = c; 691 cfg = c;
692 dir_name = args[0]; 692 dir_name = args[0];
693 work_finished = GNUNET_CONTAINER_multihashmap_create (1024); 693 work_finished = GNUNET_CONTAINER_multihashmap_create (1024, GNUNET_NO);
694 load_state (); 694 load_state ();
695 run_task = GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_IDLE, 695 run_task = GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_IDLE,
696 &scan, NULL); 696 &scan, NULL);
diff --git a/src/fs/gnunet-service-fs_cp.c b/src/fs/gnunet-service-fs_cp.c
index 4ff6432b0..3de45ff48 100644
--- a/src/fs/gnunet-service-fs_cp.c
+++ b/src/fs/gnunet-service-fs_cp.c
@@ -615,7 +615,7 @@ GSF_peer_connect_handler_ (const struct GNUNET_PeerIdentity *peer,
615 (sizeof (respect) == GNUNET_DISK_fn_read (fn, &respect, sizeof (respect)))) 615 (sizeof (respect) == GNUNET_DISK_fn_read (fn, &respect, sizeof (respect))))
616 cp->disk_respect = cp->ppd.respect = ntohl (respect); 616 cp->disk_respect = cp->ppd.respect = ntohl (respect);
617 GNUNET_free (fn); 617 GNUNET_free (fn);
618 cp->request_map = GNUNET_CONTAINER_multihashmap_create (128); 618 cp->request_map = GNUNET_CONTAINER_multihashmap_create (128, GNUNET_NO);
619 GNUNET_break (GNUNET_OK == 619 GNUNET_break (GNUNET_OK ==
620 GNUNET_CONTAINER_multihashmap_put (cp_map, &peer->hashPubKey, 620 GNUNET_CONTAINER_multihashmap_put (cp_map, &peer->hashPubKey,
621 cp, 621 cp,
@@ -1811,7 +1811,7 @@ cron_flush_respect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1811void 1811void
1812GSF_connected_peer_init_ () 1812GSF_connected_peer_init_ ()
1813{ 1813{
1814 cp_map = GNUNET_CONTAINER_multihashmap_create (128); 1814 cp_map = GNUNET_CONTAINER_multihashmap_create (128, GNUNET_NO);
1815 ats = GNUNET_ATS_performance_init (GSF_cfg, NULL, NULL); 1815 ats = GNUNET_ATS_performance_init (GSF_cfg, NULL, NULL);
1816 GNUNET_assert (GNUNET_OK == 1816 GNUNET_assert (GNUNET_OK ==
1817 GNUNET_CONFIGURATION_get_value_filename (GSF_cfg, "fs", 1817 GNUNET_CONFIGURATION_get_value_filename (GSF_cfg, "fs",
diff --git a/src/fs/gnunet-service-fs_indexing.c b/src/fs/gnunet-service-fs_indexing.c
index 7bd8316ab..1324b22d7 100644
--- a/src/fs/gnunet-service-fs_indexing.c
+++ b/src/fs/gnunet-service-fs_indexing.c
@@ -613,7 +613,7 @@ GNUNET_FS_indexing_init (const struct GNUNET_CONFIGURATION_Handle *c,
613{ 613{
614 cfg = c; 614 cfg = c;
615 dsh = d; 615 dsh = d;
616 ifm = GNUNET_CONTAINER_multihashmap_create (128); 616 ifm = GNUNET_CONTAINER_multihashmap_create (128, GNUNET_NO);
617 read_index_list (); 617 read_index_list ();
618 return GNUNET_OK; 618 return GNUNET_OK;
619} 619}
diff --git a/src/fs/gnunet-service-fs_pe.c b/src/fs/gnunet-service-fs_pe.c
index dbaab7d48..bc08eebe7 100644
--- a/src/fs/gnunet-service-fs_pe.c
+++ b/src/fs/gnunet-service-fs_pe.c
@@ -572,7 +572,7 @@ GSF_plan_add_ (struct GSF_ConnectedPeer *cp, struct GSF_PendingRequest *pr)
572 if (NULL == pp) 572 if (NULL == pp)
573 { 573 {
574 pp = GNUNET_malloc (sizeof (struct PeerPlan)); 574 pp = GNUNET_malloc (sizeof (struct PeerPlan));
575 pp->plan_map = GNUNET_CONTAINER_multihashmap_create (128); 575 pp->plan_map = GNUNET_CONTAINER_multihashmap_create (128, GNUNET_NO);
576 pp->priority_heap = 576 pp->priority_heap =
577 GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MAX); 577 GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MAX);
578 pp->delay_heap = 578 pp->delay_heap =
@@ -760,7 +760,7 @@ GSF_plan_notify_request_done_ (struct GSF_PendingRequest *pr)
760void 760void
761GSF_plan_init () 761GSF_plan_init ()
762{ 762{
763 plans = GNUNET_CONTAINER_multihashmap_create (256); 763 plans = GNUNET_CONTAINER_multihashmap_create (256, GNUNET_NO);
764} 764}
765 765
766 766
diff --git a/src/fs/gnunet-service-fs_pr.c b/src/fs/gnunet-service-fs_pr.c
index ceb034ba0..265784348 100644
--- a/src/fs/gnunet-service-fs_pr.c
+++ b/src/fs/gnunet-service-fs_pr.c
@@ -1627,7 +1627,7 @@ GSF_pending_request_init_ ()
1627 active_to_migration = 1627 active_to_migration =
1628 GNUNET_CONFIGURATION_get_value_yesno (GSF_cfg, "FS", "CONTENT_CACHING"); 1628 GNUNET_CONFIGURATION_get_value_yesno (GSF_cfg, "FS", "CONTENT_CACHING");
1629 datastore_put_load = GNUNET_LOAD_value_init (DATASTORE_LOAD_AUTODECLINE); 1629 datastore_put_load = GNUNET_LOAD_value_init (DATASTORE_LOAD_AUTODECLINE);
1630 pr_map = GNUNET_CONTAINER_multihashmap_create (32 * 1024); 1630 pr_map = GNUNET_CONTAINER_multihashmap_create (32 * 1024, GNUNET_NO);
1631 requests_by_expiration_heap = 1631 requests_by_expiration_heap =
1632 GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); 1632 GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
1633} 1633}
diff --git a/src/include/gnunet_container_lib.h b/src/include/gnunet_container_lib.h
index 96946d02d..a476b7f1b 100644
--- a/src/include/gnunet_container_lib.h
+++ b/src/include/gnunet_container_lib.h
@@ -542,10 +542,20 @@ typedef int (*GNUNET_CONTAINER_HashMapIterator) (void *cls,
542 * Create a multi hash map. 542 * Create a multi hash map.
543 * 543 *
544 * @param len initial size (map will grow as needed) 544 * @param len initial size (map will grow as needed)
545 * @param do_not_copy_keys GNUNET_NO is always safe and should be used by default;
546 * GNUNET_YES means that on 'put', the 'key' does not have
547 * to be copied as the destination of the pointer is
548 * guaranteed to be life as long as the value is stored in
549 * the hashmap. This can significantly reduce memory
550 * consumption, but of course is also a recipie for
551 * heap corruption if the assumption is not true. Only
552 * use this if (1) memory use is important in this case and
553 * (2) you have triple-checked that the invariant holds
545 * @return NULL on error 554 * @return NULL on error
546 */ 555 */
547struct GNUNET_CONTAINER_MultiHashMap * 556struct GNUNET_CONTAINER_MultiHashMap *
548GNUNET_CONTAINER_multihashmap_create (unsigned int len); 557GNUNET_CONTAINER_multihashmap_create (unsigned int len,
558 int do_not_copy_keys);
549 559
550 560
551/** 561/**
diff --git a/src/integration-tests/connection_watchdog.c b/src/integration-tests/connection_watchdog.c
index 456782ddd..17aab2159 100644
--- a/src/integration-tests/connection_watchdog.c
+++ b/src/integration-tests/connection_watchdog.c
@@ -1056,7 +1056,7 @@ run (void *cls, char *const *args, const char *cfgfile,
1056 init(); 1056 init();
1057 1057
1058 stats = GNUNET_STATISTICS_create ("watchdog", cfg); 1058 stats = GNUNET_STATISTICS_create ("watchdog", cfg);
1059 peers = GNUNET_CONTAINER_multihashmap_create (20); 1059 peers = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
1060 1060
1061 th = GNUNET_TRANSPORT_connect(cfg, NULL, NULL, 1061 th = GNUNET_TRANSPORT_connect(cfg, NULL, NULL,
1062 &transport_notify_receive_cb, 1062 &transport_notify_receive_cb,
diff --git a/src/lockmanager/gnunet-service-lockmanager.c b/src/lockmanager/gnunet-service-lockmanager.c
index 296dd0065..4cb9ff2ae 100644
--- a/src/lockmanager/gnunet-service-lockmanager.c
+++ b/src/lockmanager/gnunet-service-lockmanager.c
@@ -821,7 +821,7 @@ lockmanager_run (void *cls, struct GNUNET_SERVER_Handle *server,
821 }; 821 };
822 GNUNET_SERVER_add_handlers (server, message_handlers); 822 GNUNET_SERVER_add_handlers (server, message_handlers);
823 GNUNET_SERVER_disconnect_notify (server, &client_disconnect_cb, NULL); 823 GNUNET_SERVER_disconnect_notify (server, &client_disconnect_cb, NULL);
824 lock_map = GNUNET_CONTAINER_multihashmap_create (30); 824 lock_map = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
825 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, 825 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
826 NULL); 826 NULL);
827} 827}
diff --git a/src/lockmanager/lockmanager_api.c b/src/lockmanager/lockmanager_api.c
index 8adf486ee..3b9e70e59 100644
--- a/src/lockmanager/lockmanager_api.c
+++ b/src/lockmanager/lockmanager_api.c
@@ -567,7 +567,7 @@ GNUNET_LOCKMANAGER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
567 LOG (GNUNET_ERROR_TYPE_DEBUG, "%s() END\n", __func__); 567 LOG (GNUNET_ERROR_TYPE_DEBUG, "%s() END\n", __func__);
568 return NULL; 568 return NULL;
569 } 569 }
570 h->hashmap = GNUNET_CONTAINER_multihashmap_create (15); 570 h->hashmap = GNUNET_CONTAINER_multihashmap_create (16, GNUNET_NO);
571 GNUNET_assert (NULL != h->hashmap); 571 GNUNET_assert (NULL != h->hashmap);
572 h->in_replies = GNUNET_YES; 572 h->in_replies = GNUNET_YES;
573 GNUNET_CLIENT_receive (h->conn, &handle_replies, h, 573 GNUNET_CLIENT_receive (h->conn, &handle_replies, h,
diff --git a/src/mesh/gnunet-service-mesh.c b/src/mesh/gnunet-service-mesh.c
index a5068e86c..e75bad347 100644
--- a/src/mesh/gnunet-service-mesh.c
+++ b/src/mesh/gnunet-service-mesh.c
@@ -4354,7 +4354,7 @@ tunnel_new (GNUNET_PEER_Id owner,
4354 t->bck_ack = INITIAL_WINDOW_SIZE - 1; 4354 t->bck_ack = INITIAL_WINDOW_SIZE - 1;
4355 t->last_fwd_ack = INITIAL_WINDOW_SIZE - 1; 4355 t->last_fwd_ack = INITIAL_WINDOW_SIZE - 1;
4356 t->local_tid = local; 4356 t->local_tid = local;
4357 t->children_fc = GNUNET_CONTAINER_multihashmap_create (8); 4357 t->children_fc = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
4358 n_tunnels++; 4358 n_tunnels++;
4359 GNUNET_STATISTICS_update (stats, "# tunnels", 1, GNUNET_NO); 4359 GNUNET_STATISTICS_update (stats, "# tunnels", 1, GNUNET_NO);
4360 4360
@@ -5286,7 +5286,7 @@ handle_mesh_path_create (void *cls, const struct GNUNET_PeerIdentity *peer,
5286 if (NULL == t->peers) 5286 if (NULL == t->peers)
5287 { 5287 {
5288 /* New tunnel! Notify clients on first payload message. */ 5288 /* New tunnel! Notify clients on first payload message. */
5289 t->peers = GNUNET_CONTAINER_multihashmap_create (4); 5289 t->peers = GNUNET_CONTAINER_multihashmap_create (4, GNUNET_NO);
5290 } 5290 }
5291 GNUNET_break (GNUNET_SYSERR != 5291 GNUNET_break (GNUNET_SYSERR !=
5292 GNUNET_CONTAINER_multihashmap_put (t->peers, 5292 GNUNET_CONTAINER_multihashmap_put (t->peers,
@@ -6534,7 +6534,7 @@ handle_local_new_client (void *cls, struct GNUNET_SERVER_Client *client,
6534 GNUNET_MESH_ApplicationType at; 6534 GNUNET_MESH_ApplicationType at;
6535 struct GNUNET_HashCode hc; 6535 struct GNUNET_HashCode hc;
6536 6536
6537 c->apps = GNUNET_CONTAINER_multihashmap_create (napps); 6537 c->apps = GNUNET_CONTAINER_multihashmap_create (napps, GNUNET_NO);
6538 for (i = 0; i < napps; i++) 6538 for (i = 0; i < napps; i++)
6539 { 6539 {
6540 at = ntohl (a[i]); 6540 at = ntohl (a[i]);
@@ -6558,7 +6558,7 @@ handle_local_new_client (void *cls, struct GNUNET_SERVER_Client *client,
6558 struct GNUNET_HashCode hc; 6558 struct GNUNET_HashCode hc;
6559 6559
6560 t = (uint16_t *) & a[napps]; 6560 t = (uint16_t *) & a[napps];
6561 c->types = GNUNET_CONTAINER_multihashmap_create (ntypes); 6561 c->types = GNUNET_CONTAINER_multihashmap_create (ntypes, GNUNET_NO);
6562 for (i = 0; i < ntypes; i++) 6562 for (i = 0; i < ntypes; i++)
6563 { 6563 {
6564 u16 = ntohs (t[i]); 6564 u16 = ntohs (t[i]);
@@ -6577,9 +6577,9 @@ handle_local_new_client (void *cls, struct GNUNET_SERVER_Client *client,
6577 " client has %u+%u subscriptions\n", napps, ntypes); 6577 " client has %u+%u subscriptions\n", napps, ntypes);
6578 6578
6579 GNUNET_CONTAINER_DLL_insert (clients, clients_tail, c); 6579 GNUNET_CONTAINER_DLL_insert (clients, clients_tail, c);
6580 c->own_tunnels = GNUNET_CONTAINER_multihashmap_create (32); 6580 c->own_tunnels = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
6581 c->incoming_tunnels = GNUNET_CONTAINER_multihashmap_create (32); 6581 c->incoming_tunnels = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
6582 c->ignore_tunnels = GNUNET_CONTAINER_multihashmap_create (32); 6582 c->ignore_tunnels = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
6583 GNUNET_SERVER_notification_context_add (nc, client); 6583 GNUNET_SERVER_notification_context_add (nc, client);
6584 GNUNET_STATISTICS_update (stats, "# clients", 1, GNUNET_NO); 6584 GNUNET_STATISTICS_update (stats, "# clients", 1, GNUNET_NO);
6585 6585
@@ -6697,7 +6697,7 @@ handle_local_tunnel_create (void *cls, struct GNUNET_SERVER_Client *client,
6697 next_tid = next_tid & ~GNUNET_MESH_LOCAL_TUNNEL_ID_CLI; 6697 next_tid = next_tid & ~GNUNET_MESH_LOCAL_TUNNEL_ID_CLI;
6698 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "CREATED TUNNEL %s [%x] (%x)\n", 6698 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "CREATED TUNNEL %s [%x] (%x)\n",
6699 GNUNET_i2s (&my_full_id), t->id.tid, t->local_tid); 6699 GNUNET_i2s (&my_full_id), t->id.tid, t->local_tid);
6700 t->peers = GNUNET_CONTAINER_multihashmap_create (32); 6700 t->peers = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
6701 6701
6702 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "new tunnel created\n"); 6702 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "new tunnel created\n");
6703 GNUNET_SERVER_receive_done (client, GNUNET_OK); 6703 GNUNET_SERVER_receive_done (client, GNUNET_OK);
@@ -7370,8 +7370,8 @@ handle_local_connect_by_string (void *cls, struct GNUNET_SERVER_Client *client,
7370 info->description = GNUNET_malloc (len + 1); 7370 info->description = GNUNET_malloc (len + 1);
7371 memcpy (info->description, string, len); 7371 memcpy (info->description, string, len);
7372 info->description[len] = '\0'; 7372 info->description[len] = '\0';
7373 info->dht_get_handles = GNUNET_CONTAINER_multihashmap_create(32); 7373 info->dht_get_handles = GNUNET_CONTAINER_multihashmap_create(32, GNUNET_NO);
7374 info->dht_get_results = GNUNET_CONTAINER_multihashmap_create(32); 7374 info->dht_get_results = GNUNET_CONTAINER_multihashmap_create(32, GNUNET_NO);
7375 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " string: %s\n", info->description); 7375 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " string: %s\n", info->description);
7376 7376
7377 ctx = GNUNET_malloc (sizeof (struct MeshRegexSearchContext)); 7377 ctx = GNUNET_malloc (sizeof (struct MeshRegexSearchContext));
@@ -8261,11 +8261,11 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
8261 dht_replication_level = 10; 8261 dht_replication_level = 10;
8262 } 8262 }
8263 8263
8264 tunnels = GNUNET_CONTAINER_multihashmap_create (32); 8264 tunnels = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
8265 incoming_tunnels = GNUNET_CONTAINER_multihashmap_create (32); 8265 incoming_tunnels = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
8266 peers = GNUNET_CONTAINER_multihashmap_create (32); 8266 peers = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
8267 applications = GNUNET_CONTAINER_multihashmap_create (32); 8267 applications = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
8268 types = GNUNET_CONTAINER_multihashmap_create (32); 8268 types = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
8269 8269
8270 dht_handle = GNUNET_DHT_connect (c, 64); 8270 dht_handle = GNUNET_DHT_connect (c, 64);
8271 if (NULL == dht_handle) 8271 if (NULL == dht_handle)
diff --git a/src/mesh/mesh_tunnel_tree.c b/src/mesh/mesh_tunnel_tree.c
index a754d9c42..b57f9410f 100644
--- a/src/mesh/mesh_tunnel_tree.c
+++ b/src/mesh/mesh_tunnel_tree.c
@@ -416,7 +416,7 @@ tree_new (GNUNET_PEER_Id peer)
416 struct MeshTunnelTree *tree; 416 struct MeshTunnelTree *tree;
417 417
418 tree = GNUNET_malloc (sizeof (struct MeshTunnelTree)); 418 tree = GNUNET_malloc (sizeof (struct MeshTunnelTree));
419 tree->first_hops = GNUNET_CONTAINER_multihashmap_create (32); 419 tree->first_hops = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
420 tree->root = tree_node_new (NULL, peer); 420 tree->root = tree_node_new (NULL, peer);
421 tree->root->status = MESH_PEER_ROOT; 421 tree->root->status = MESH_PEER_ROOT;
422 422
diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c
index bd32d7155..d13221600 100644
--- a/src/namestore/gnunet-service-namestore.c
+++ b/src/namestore/gnunet-service-namestore.c
@@ -2242,7 +2242,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
2242 2242
2243 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2243 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2244 "Scanning directory `%s' for zone files\n", zonefile_directory); 2244 "Scanning directory `%s' for zone files\n", zonefile_directory);
2245 zonekeys = GNUNET_CONTAINER_multihashmap_create (16); 2245 zonekeys = GNUNET_CONTAINER_multihashmap_create (16, GNUNET_NO);
2246 counter = 0; 2246 counter = 0;
2247 GNUNET_DISK_directory_scan (zonefile_directory, zonekey_file_it, &counter); 2247 GNUNET_DISK_directory_scan (zonefile_directory, zonekey_file_it, &counter);
2248 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2248 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
diff --git a/src/nse/gnunet-service-nse.c b/src/nse/gnunet-service-nse.c
index 435f22774..d7fb439e2 100644
--- a/src/nse/gnunet-service-nse.c
+++ b/src/nse/gnunet-service-nse.c
@@ -1415,7 +1415,7 @@ key_generation_cb (void *cls,
1415 GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_IDLE, 1415 GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_IDLE,
1416 &find_proof, NULL); 1416 &find_proof, NULL);
1417 1417
1418 peers = GNUNET_CONTAINER_multihashmap_create (128); 1418 peers = GNUNET_CONTAINER_multihashmap_create (128, GNUNET_NO);
1419 GNUNET_SERVER_add_handlers (srv, handlers); 1419 GNUNET_SERVER_add_handlers (srv, handlers);
1420 nc = GNUNET_SERVER_notification_context_create (srv, 1); 1420 nc = GNUNET_SERVER_notification_context_create (srv, 1);
1421 /* Connect to core service and register core handlers */ 1421 /* Connect to core service and register core handlers */
diff --git a/src/peerinfo/gnunet-service-peerinfo.c b/src/peerinfo/gnunet-service-peerinfo.c
index 4b42708ab..18f10621a 100644
--- a/src/peerinfo/gnunet-service-peerinfo.c
+++ b/src/peerinfo/gnunet-service-peerinfo.c
@@ -268,7 +268,7 @@ add_host_to_known_hosts (const struct GNUNET_PeerIdentity *identity)
268 GNUNET_NO); 268 GNUNET_NO);
269 entry = GNUNET_malloc (sizeof (struct HostEntry)); 269 entry = GNUNET_malloc (sizeof (struct HostEntry));
270 entry->identity = *identity; 270 entry->identity = *identity;
271 GNUNET_CONTAINER_multihashmap_put (hostmap, &identity->hashPubKey, entry, 271 GNUNET_CONTAINER_multihashmap_put (hostmap, &entry->identity.hashPubKey, entry,
272 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); 272 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
273 fn = get_host_filename (identity); 273 fn = get_host_filename (identity);
274 entry->hello = read_host_file (fn, GNUNET_YES); 274 entry->hello = read_host_file (fn, GNUNET_YES);
@@ -776,7 +776,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
776 char *ip; 776 char *ip;
777 struct DirScanContext dsc; 777 struct DirScanContext dsc;
778 778
779 hostmap = GNUNET_CONTAINER_multihashmap_create (1024); 779 hostmap = GNUNET_CONTAINER_multihashmap_create (1024, GNUNET_YES);
780 stats = GNUNET_STATISTICS_create ("peerinfo", cfg); 780 stats = GNUNET_STATISTICS_create ("peerinfo", cfg);
781 notify_list = GNUNET_SERVER_notification_context_create (server, 0); 781 notify_list = GNUNET_SERVER_notification_context_create (server, 0);
782 GNUNET_assert (GNUNET_OK == 782 GNUNET_assert (GNUNET_OK ==
diff --git a/src/testbed/gnunet-service-testbed.c b/src/testbed/gnunet-service-testbed.c
index 4cea07acd..b5282cffc 100644
--- a/src/testbed/gnunet-service-testbed.c
+++ b/src/testbed/gnunet-service-testbed.c
@@ -2916,7 +2916,7 @@ testbed_run (void *cls, struct GNUNET_SERVER_Handle *server,
2916 (cfg, "testbed", "HOSTNAME", &hostname)); 2916 (cfg, "testbed", "HOSTNAME", &hostname));
2917 GNUNET_SERVER_add_handlers (server, message_handlers); 2917 GNUNET_SERVER_add_handlers (server, message_handlers);
2918 GNUNET_SERVER_disconnect_notify (server, &client_disconnect_cb, NULL); 2918 GNUNET_SERVER_disconnect_notify (server, &client_disconnect_cb, NULL);
2919 ss_map = GNUNET_CONTAINER_multihashmap_create (5); 2919 ss_map = GNUNET_CONTAINER_multihashmap_create (5, GNUNET_NO);
2920 shutdown_task_id = 2920 shutdown_task_id =
2921 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, 2921 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
2922 &shutdown_task, NULL); 2922 &shutdown_task, NULL);
diff --git a/src/testing_old/testing_group.c b/src/testing_old/testing_group.c
index 9191b9fdd..f5c225876 100644
--- a/src/testing_old/testing_group.c
+++ b/src/testing_old/testing_group.c
@@ -3890,9 +3890,9 @@ GNUNET_TESTING_create_topology (struct GNUNET_TESTING_PeerGroup *pg,
3890 3890
3891 for (i = 0; i < pg->total; i++) 3891 for (i = 0; i < pg->total; i++)
3892 { 3892 {
3893 pg->peers[i].allowed_peers = GNUNET_CONTAINER_multihashmap_create (100); 3893 pg->peers[i].allowed_peers = GNUNET_CONTAINER_multihashmap_create (100, GNUNET_NO);
3894 pg->peers[i].connect_peers = GNUNET_CONTAINER_multihashmap_create (100); 3894 pg->peers[i].connect_peers = GNUNET_CONTAINER_multihashmap_create (100, GNUNET_NO);
3895 pg->peers[i].blacklisted_peers = GNUNET_CONTAINER_multihashmap_create (100); 3895 pg->peers[i].blacklisted_peers = GNUNET_CONTAINER_multihashmap_create (100, GNUNET_NO);
3896 pg->peers[i].pg = pg; 3896 pg->peers[i].pg = pg;
3897 } 3897 }
3898#endif 3898#endif
@@ -4291,7 +4291,7 @@ choose_random_connections (struct GNUNET_TESTING_PeerGroup *pg,
4291 random_ctx.percentage = percentage; 4291 random_ctx.percentage = percentage;
4292 random_ctx.pg = pg; 4292 random_ctx.pg = pg;
4293 pg->peers[pg_iter].connect_peers_working_set = 4293 pg->peers[pg_iter].connect_peers_working_set =
4294 GNUNET_CONTAINER_multihashmap_create (pg->total); 4294 GNUNET_CONTAINER_multihashmap_create (pg->total, GNUNET_NO);
4295 GNUNET_CONTAINER_multihashmap_iterate (pg->peers[pg_iter].connect_peers, 4295 GNUNET_CONTAINER_multihashmap_iterate (pg->peers[pg_iter].connect_peers,
4296 &random_connect_iterator, 4296 &random_connect_iterator,
4297 &random_ctx); 4297 &random_ctx);
@@ -4450,7 +4450,7 @@ choose_minimum (struct GNUNET_TESTING_PeerGroup *pg, unsigned int num)
4450 for (pg_iter = 0; pg_iter < pg->total; pg_iter++) 4450 for (pg_iter = 0; pg_iter < pg->total; pg_iter++)
4451 { 4451 {
4452 pg->peers[pg_iter].connect_peers_working_set = 4452 pg->peers[pg_iter].connect_peers_working_set =
4453 GNUNET_CONTAINER_multihashmap_create (num); 4453 GNUNET_CONTAINER_multihashmap_create (num, GNUNET_NO);
4454 } 4454 }
4455 4455
4456 for (pg_iter = 0; pg_iter < pg->total; pg_iter++) 4456 for (pg_iter = 0; pg_iter < pg->total; pg_iter++)
@@ -4679,7 +4679,7 @@ perform_dfs (struct GNUNET_TESTING_PeerGroup *pg, unsigned int num)
4679 for (pg_iter = 0; pg_iter < pg->total; pg_iter++) 4679 for (pg_iter = 0; pg_iter < pg->total; pg_iter++)
4680 { 4680 {
4681 pg->peers[pg_iter].connect_peers_working_set = 4681 pg->peers[pg_iter].connect_peers_working_set =
4682 GNUNET_CONTAINER_multihashmap_create (num); 4682 GNUNET_CONTAINER_multihashmap_create (num, GNUNET_NO);
4683 } 4683 }
4684 4684
4685 starting_peer = 0; 4685 starting_peer = 0;
diff --git a/src/topology/gnunet-daemon-topology.c b/src/topology/gnunet-daemon-topology.c
index 9bd6d8e19..2dc3c148b 100644
--- a/src/topology/gnunet-daemon-topology.c
+++ b/src/topology/gnunet-daemon-topology.c
@@ -1306,7 +1306,7 @@ run (void *cls, char *const *args, const char *cfgfile,
1306 "TARGET-CONNECTION-COUNT", &opt)) 1306 "TARGET-CONNECTION-COUNT", &opt))
1307 opt = 16; 1307 opt = 16;
1308 target_connection_count = (unsigned int) opt; 1308 target_connection_count = (unsigned int) opt;
1309 peers = GNUNET_CONTAINER_multihashmap_create (target_connection_count * 2); 1309 peers = GNUNET_CONTAINER_multihashmap_create (target_connection_count * 2, GNUNET_NO);
1310 1310
1311 if ((friends_only == GNUNET_YES) || (minimum_friend_count > 0)) 1311 if ((friends_only == GNUNET_YES) || (minimum_friend_count > 0))
1312 read_friends_file (cfg); 1312 read_friends_file (cfg);
diff --git a/src/transport/gnunet-service-transport_blacklist.c b/src/transport/gnunet-service-transport_blacklist.c
index 505326879..e426b8fd2 100644
--- a/src/transport/gnunet-service-transport_blacklist.c
+++ b/src/transport/gnunet-service-transport_blacklist.c
@@ -687,7 +687,8 @@ GST_blacklist_add_peer (const struct GNUNET_PeerIdentity *peer,
687 GNUNET_i2s (peer), transport_name); 687 GNUNET_i2s (peer), transport_name);
688 if (blacklist == NULL) 688 if (blacklist == NULL)
689 blacklist = 689 blacklist =
690 GNUNET_CONTAINER_multihashmap_create (TRANSPORT_BLACKLIST_HT_SIZE); 690 GNUNET_CONTAINER_multihashmap_create (TRANSPORT_BLACKLIST_HT_SIZE,
691 GNUNET_NO);
691 GNUNET_CONTAINER_multihashmap_put (blacklist, &peer->hashPubKey, 692 GNUNET_CONTAINER_multihashmap_put (blacklist, &peer->hashPubKey,
692 GNUNET_strdup (transport_name), 693 GNUNET_strdup (transport_name),
693 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 694 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
diff --git a/src/transport/gnunet-service-transport_neighbours.c b/src/transport/gnunet-service-transport_neighbours.c
index dd506b125..da42b8c56 100644
--- a/src/transport/gnunet-service-transport_neighbours.c
+++ b/src/transport/gnunet-service-transport_neighbours.c
@@ -3197,7 +3197,7 @@ GST_neighbours_start (void *cls,
3197 connect_notify_cb = connect_cb; 3197 connect_notify_cb = connect_cb;
3198 disconnect_notify_cb = disconnect_cb; 3198 disconnect_notify_cb = disconnect_cb;
3199 address_change_cb = peer_address_cb; 3199 address_change_cb = peer_address_cb;
3200 neighbours = GNUNET_CONTAINER_multihashmap_create (NEIGHBOUR_TABLE_SIZE); 3200 neighbours = GNUNET_CONTAINER_multihashmap_create (NEIGHBOUR_TABLE_SIZE, GNUNET_NO);
3201} 3201}
3202 3202
3203 3203
diff --git a/src/transport/gnunet-service-transport_validation.c b/src/transport/gnunet-service-transport_validation.c
index 59fe1737f..ab334013d 100644
--- a/src/transport/gnunet-service-transport_validation.c
+++ b/src/transport/gnunet-service-transport_validation.c
@@ -696,7 +696,8 @@ process_peerinfo_hello (void *cls, const struct GNUNET_PeerIdentity *peer,
696void 696void
697GST_validation_start () 697GST_validation_start ()
698{ 698{
699 validation_map = GNUNET_CONTAINER_multihashmap_create (VALIDATION_MAP_SIZE); 699 validation_map = GNUNET_CONTAINER_multihashmap_create (VALIDATION_MAP_SIZE,
700 GNUNET_NO);
700 pnc = GNUNET_PEERINFO_notify (GST_cfg, &process_peerinfo_hello, NULL); 701 pnc = GNUNET_PEERINFO_notify (GST_cfg, &process_peerinfo_hello, NULL);
701} 702}
702 703
diff --git a/src/transport/gnunet-transport.c b/src/transport/gnunet-transport.c
index 217fbf51f..5978de6bb 100644
--- a/src/transport/gnunet-transport.c
+++ b/src/transport/gnunet-transport.c
@@ -655,7 +655,7 @@ testservice_task (void *cls,
655 } 655 }
656 if (iterate_connections) 656 if (iterate_connections)
657 { 657 {
658 peers = GNUNET_CONTAINER_multihashmap_create (20); 658 peers = GNUNET_CONTAINER_multihashmap_create (20, GNUNET_NO);
659 GNUNET_TRANSPORT_peer_get_active_addresses (cfg, NULL, GNUNET_YES, 659 GNUNET_TRANSPORT_peer_get_active_addresses (cfg, NULL, GNUNET_YES,
660 TIMEOUT, 660 TIMEOUT,
661 &process_address, (void *) cfg); 661 &process_address, (void *) cfg);
diff --git a/src/transport/plugin_transport_tcp.c b/src/transport/plugin_transport_tcp.c
index 9d23c5121..877356c16 100644
--- a/src/transport/plugin_transport_tcp.c
+++ b/src/transport/plugin_transport_tcp.c
@@ -734,7 +734,7 @@ static struct Session *
734create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target, 734create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
735 struct GNUNET_SERVER_Client *client, int is_nat) 735 struct GNUNET_SERVER_Client *client, int is_nat)
736{ 736{
737 struct Session *ret; 737 struct Session *session;
738 struct PendingMessage *pm; 738 struct PendingMessage *pm;
739 struct WelcomeMessage welcome; 739 struct WelcomeMessage welcome;
740 740
@@ -746,14 +746,14 @@ create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
746 LOG (GNUNET_ERROR_TYPE_DEBUG, 746 LOG (GNUNET_ERROR_TYPE_DEBUG,
747 "Creating new session for peer `%4s'\n", 747 "Creating new session for peer `%4s'\n",
748 GNUNET_i2s (target)); 748 GNUNET_i2s (target));
749 ret = GNUNET_malloc (sizeof (struct Session)); 749 session = GNUNET_malloc (sizeof (struct Session));
750 ret->last_activity = GNUNET_TIME_absolute_get (); 750 session->last_activity = GNUNET_TIME_absolute_get ();
751 ret->plugin = plugin; 751 session->plugin = plugin;
752 ret->is_nat = is_nat; 752 session->is_nat = is_nat;
753 ret->client = client; 753 session->client = client;
754 ret->target = *target; 754 session->target = *target;
755 ret->expecting_welcome = GNUNET_YES; 755 session->expecting_welcome = GNUNET_YES;
756 ret->ats_address_network_type = htonl (GNUNET_ATS_NET_UNSPECIFIED); 756 session->ats_address_network_type = htonl (GNUNET_ATS_NET_UNSPECIFIED);
757 pm = GNUNET_malloc (sizeof (struct PendingMessage) + 757 pm = GNUNET_malloc (sizeof (struct PendingMessage) +
758 sizeof (struct WelcomeMessage)); 758 sizeof (struct WelcomeMessage));
759 pm->msg = (const char *) &pm[1]; 759 pm->msg = (const char *) &pm[1];
@@ -766,17 +766,17 @@ create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
766 GNUNET_STATISTICS_update (plugin->env->stats, 766 GNUNET_STATISTICS_update (plugin->env->stats,
767 gettext_noop ("# bytes currently in TCP buffers"), 767 gettext_noop ("# bytes currently in TCP buffers"),
768 pm->message_size, GNUNET_NO); 768 pm->message_size, GNUNET_NO);
769 GNUNET_CONTAINER_DLL_insert (ret->pending_messages_head, 769 GNUNET_CONTAINER_DLL_insert (session->pending_messages_head,
770 ret->pending_messages_tail, pm); 770 session->pending_messages_tail, pm);
771 if (GNUNET_YES != is_nat) 771 if (GNUNET_YES != is_nat)
772 { 772 {
773 GNUNET_STATISTICS_update (plugin->env->stats, 773 GNUNET_STATISTICS_update (plugin->env->stats,
774 gettext_noop ("# TCP sessions active"), 1, 774 gettext_noop ("# TCP sessions active"), 1,
775 GNUNET_NO); 775 GNUNET_NO);
776 } 776 }
777 start_session_timeout (ret); 777 start_session_timeout (session);
778 778
779 return ret; 779 return session;
780} 780}
781 781
782 782
@@ -1120,7 +1120,9 @@ tcp_plugin_send (void *cls,
1120 "Asked to transmit %u bytes to `%s', added message to list.\n", 1120 "Asked to transmit %u bytes to `%s', added message to list.\n",
1121 msgbuf_size, GNUNET_i2s (&session->target)); 1121 msgbuf_size, GNUNET_i2s (&session->target));
1122 1122
1123 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains_value(plugin->sessionmap, &session->target.hashPubKey, session)) 1123 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains_value (plugin->sessionmap,
1124 &session->target.hashPubKey,
1125 session))
1124 { 1126 {
1125 GNUNET_assert (session->client != NULL); 1127 GNUNET_assert (session->client != NULL);
1126 reschedule_session_timeout (session); 1128 reschedule_session_timeout (session);
@@ -1246,8 +1248,8 @@ static struct Session *
1246tcp_plugin_get_session (void *cls, 1248tcp_plugin_get_session (void *cls,
1247 const struct GNUNET_HELLO_Address *address) 1249 const struct GNUNET_HELLO_Address *address)
1248{ 1250{
1249 struct Plugin * plugin = cls; 1251 struct Plugin *plugin = cls;
1250 struct Session * session = NULL; 1252 struct Session *session = NULL;
1251 int af; 1253 int af;
1252 const void *sb; 1254 const void *sb;
1253 size_t sbs; 1255 size_t sbs;
@@ -1270,7 +1272,8 @@ tcp_plugin_get_session (void *cls,
1270 1272
1271 /* look for existing session */ 1273 /* look for existing session */
1272 if (GNUNET_YES == 1274 if (GNUNET_YES ==
1273 GNUNET_CONTAINER_multihashmap_contains(plugin->sessionmap, &address->peer.hashPubKey)) 1275 GNUNET_CONTAINER_multihashmap_contains (plugin->sessionmap,
1276 &address->peer.hashPubKey))
1274 { 1277 {
1275 struct SessionItCtx si_ctx; 1278 struct SessionItCtx si_ctx;
1276 1279
@@ -1279,7 +1282,9 @@ tcp_plugin_get_session (void *cls,
1279 1282
1280 si_ctx.result = NULL; 1283 si_ctx.result = NULL;
1281 1284
1282 GNUNET_CONTAINER_multihashmap_get_multiple(plugin->sessionmap, &address->peer.hashPubKey, &session_lookup_it, &si_ctx); 1285 GNUNET_CONTAINER_multihashmap_get_multiple (plugin->sessionmap,
1286 &address->peer.hashPubKey,
1287 &session_lookup_it, &si_ctx);
1283 if (si_ctx.result != NULL) 1288 if (si_ctx.result != NULL)
1284 { 1289 {
1285 session = si_ctx.result; 1290 session = si_ctx.result;
@@ -1372,13 +1377,15 @@ tcp_plugin_get_session (void *cls,
1372 session->addrlen = 0; 1377 session->addrlen = 0;
1373 session->addr = NULL; 1378 session->addr = NULL;
1374 session->ats_address_network_type = ats.value; 1379 session->ats_address_network_type = ats.value;
1375 session->nat_connection_timeout = GNUNET_SCHEDULER_add_delayed(NAT_TIMEOUT, 1380 session->nat_connection_timeout = GNUNET_SCHEDULER_add_delayed (NAT_TIMEOUT,
1376 &nat_connect_timeout, 1381 &nat_connect_timeout,
1377 session); 1382 session);
1378 GNUNET_assert (session != NULL); 1383 GNUNET_assert (session != NULL);
1379 GNUNET_assert (GNUNET_CONTAINER_multihashmap_put 1384 GNUNET_assert (GNUNET_OK ==
1380 (plugin->nat_wait_conns, &address->peer.hashPubKey, session, 1385 GNUNET_CONTAINER_multihashmap_put (plugin->nat_wait_conns,
1381 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY) == GNUNET_OK); 1386 &session->target.hashPubKey,
1387 session,
1388 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
1382 1389
1383 LOG (GNUNET_ERROR_TYPE_DEBUG, 1390 LOG (GNUNET_ERROR_TYPE_DEBUG,
1384 "Created NAT WAIT connection to `%4s' at `%s'\n", 1391 "Created NAT WAIT connection to `%4s' at `%s'\n",
@@ -1421,7 +1428,9 @@ tcp_plugin_get_session (void *cls,
1421 session->addrlen = addrlen; 1428 session->addrlen = addrlen;
1422 session->ats_address_network_type = ats.value; 1429 session->ats_address_network_type = ats.value;
1423 1430
1424 GNUNET_CONTAINER_multihashmap_put(plugin->sessionmap, &address->peer.hashPubKey, session, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 1431 GNUNET_CONTAINER_multihashmap_put (plugin->sessionmap,
1432 &session->target.hashPubKey,
1433 session, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
1425 inc_sessions (plugin, session, __LINE__); 1434 inc_sessions (plugin, session, __LINE__);
1426 LOG (GNUNET_ERROR_TYPE_DEBUG, 1435 LOG (GNUNET_ERROR_TYPE_DEBUG,
1427 "Creating new session for `%s' address `%s' session %p\n", 1436 "Creating new session for `%s' address `%s' session %p\n",
@@ -1763,9 +1772,9 @@ handle_tcp_nat_probe (void *cls, struct GNUNET_SERVER_Client *client,
1763 (plugin->nat_wait_conns, 1772 (plugin->nat_wait_conns,
1764 &tcp_nat_probe->clientIdentity.hashPubKey, 1773 &tcp_nat_probe->clientIdentity.hashPubKey,
1765 session) == GNUNET_YES); 1774 session) == GNUNET_YES);
1766 GNUNET_CONTAINER_multihashmap_put(plugin->sessionmap, 1775 GNUNET_CONTAINER_multihashmap_put (plugin->sessionmap,
1767 &session->target.hashPubKey, session, 1776 &session->target.hashPubKey, session,
1768 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 1777 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
1769 session->last_activity = GNUNET_TIME_absolute_get (); 1778 session->last_activity = GNUNET_TIME_absolute_get ();
1770 session->inbound = GNUNET_NO; 1779 session->inbound = GNUNET_NO;
1771 LOG (GNUNET_ERROR_TYPE_DEBUG, 1780 LOG (GNUNET_ERROR_TYPE_DEBUG,
@@ -1896,7 +1905,10 @@ handle_tcp_welcome (void *cls, struct GNUNET_SERVER_Client *client,
1896 LOG (GNUNET_ERROR_TYPE_DEBUG, 1905 LOG (GNUNET_ERROR_TYPE_DEBUG,
1897 "Did not obtain TCP socket address for incoming connection\n"); 1906 "Did not obtain TCP socket address for incoming connection\n");
1898 } 1907 }
1899 GNUNET_CONTAINER_multihashmap_put(plugin->sessionmap, &wm->clientIdentity.hashPubKey, session, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 1908 GNUNET_CONTAINER_multihashmap_put (plugin->sessionmap,
1909 &session->target.hashPubKey,
1910 session,
1911 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
1900 inc_sessions (plugin, session, __LINE__); 1912 inc_sessions (plugin, session, __LINE__);
1901 } 1913 }
1902 1914
@@ -2332,7 +2344,7 @@ libgnunet_plugin_transport_tcp_init (void *cls)
2332 service = NULL; 2344 service = NULL;
2333 2345
2334 plugin = GNUNET_malloc (sizeof (struct Plugin)); 2346 plugin = GNUNET_malloc (sizeof (struct Plugin));
2335 plugin->sessionmap = GNUNET_CONTAINER_multihashmap_create(max_connections); 2347 plugin->sessionmap = GNUNET_CONTAINER_multihashmap_create (max_connections, GNUNET_YES);
2336 plugin->max_connections = max_connections; 2348 plugin->max_connections = max_connections;
2337 plugin->open_port = bport; 2349 plugin->open_port = bport;
2338 plugin->adv_port = aport; 2350 plugin->adv_port = aport;
@@ -2405,7 +2417,7 @@ libgnunet_plugin_transport_tcp_init (void *cls)
2405 plugin->handlers[i].callback_cls = plugin; 2417 plugin->handlers[i].callback_cls = plugin;
2406 GNUNET_SERVER_add_handlers (plugin->server, plugin->handlers); 2418 GNUNET_SERVER_add_handlers (plugin->server, plugin->handlers);
2407 GNUNET_SERVER_disconnect_notify (plugin->server, &disconnect_notify, plugin); 2419 GNUNET_SERVER_disconnect_notify (plugin->server, &disconnect_notify, plugin);
2408 plugin->nat_wait_conns = GNUNET_CONTAINER_multihashmap_create (16); 2420 plugin->nat_wait_conns = GNUNET_CONTAINER_multihashmap_create (16, GNUNET_YES);
2409 if (bport != 0) 2421 if (bport != 0)
2410 LOG (GNUNET_ERROR_TYPE_INFO, 2422 LOG (GNUNET_ERROR_TYPE_INFO,
2411 _("TCP transport listening on port %llu\n"), bport); 2423 _("TCP transport listening on port %llu\n"), bport);
diff --git a/src/transport/plugin_transport_udp.c b/src/transport/plugin_transport_udp.c
index 1520bf284..bf8220164 100644
--- a/src/transport/plugin_transport_udp.c
+++ b/src/transport/plugin_transport_udp.c
@@ -2348,7 +2348,7 @@ libgnunet_plugin_transport_udp_init (void *cls)
2348 2348
2349 GNUNET_BANDWIDTH_tracker_init (&p->tracker, 2349 GNUNET_BANDWIDTH_tracker_init (&p->tracker,
2350 GNUNET_BANDWIDTH_value_init ((uint32_t)udp_max_bps), 30); 2350 GNUNET_BANDWIDTH_value_init ((uint32_t)udp_max_bps), 30);
2351 p->sessions = GNUNET_CONTAINER_multihashmap_create (10); 2351 p->sessions = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
2352 p->defrag_ctxs = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); 2352 p->defrag_ctxs = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
2353 p->mst = GNUNET_SERVER_mst_create (&process_inbound_tokenized_messages, p); 2353 p->mst = GNUNET_SERVER_mst_create (&process_inbound_tokenized_messages, p);
2354 p->port = port; 2354 p->port = port;
diff --git a/src/transport/plugin_transport_unix.c b/src/transport/plugin_transport_unix.c
index c688039e6..fc1556591 100644
--- a/src/transport/plugin_transport_unix.c
+++ b/src/transport/plugin_transport_unix.c
@@ -1354,7 +1354,7 @@ libgnunet_plugin_transport_unix_init (void *cls)
1354 if (sockets_created == 0) 1354 if (sockets_created == 0)
1355 LOG (GNUNET_ERROR_TYPE_WARNING, _("Failed to open UNIX sockets\n")); 1355 LOG (GNUNET_ERROR_TYPE_WARNING, _("Failed to open UNIX sockets\n"));
1356 1356
1357 plugin->session_map = GNUNET_CONTAINER_multihashmap_create(10); 1357 plugin->session_map = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
1358 1358
1359 GNUNET_SCHEDULER_add_now (address_notification, plugin); 1359 GNUNET_SCHEDULER_add_now (address_notification, plugin);
1360 return api; 1360 return api;
diff --git a/src/transport/transport_api.c b/src/transport/transport_api.c
index 2d4890db9..7fef0cf3e 100644
--- a/src/transport/transport_api.c
+++ b/src/transport/transport_api.c
@@ -353,7 +353,7 @@ neighbour_add (struct GNUNET_TRANSPORT_Handle *h,
353 MAX_BANDWIDTH_CARRY_S); 353 MAX_BANDWIDTH_CARRY_S);
354 GNUNET_assert (GNUNET_OK == 354 GNUNET_assert (GNUNET_OK ==
355 GNUNET_CONTAINER_multihashmap_put (h->neighbours, 355 GNUNET_CONTAINER_multihashmap_put (h->neighbours,
356 &pid->hashPubKey, n, 356 &n->id.hashPubKey, n,
357 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); 357 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
358 return n; 358 return n;
359} 359}
@@ -1191,7 +1191,7 @@ GNUNET_TRANSPORT_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
1191 ret->nd_cb = nd; 1191 ret->nd_cb = nd;
1192 ret->reconnect_delay = GNUNET_TIME_UNIT_ZERO; 1192 ret->reconnect_delay = GNUNET_TIME_UNIT_ZERO;
1193 ret->neighbours = 1193 ret->neighbours =
1194 GNUNET_CONTAINER_multihashmap_create (STARTING_NEIGHBOURS_SIZE); 1194 GNUNET_CONTAINER_multihashmap_create (STARTING_NEIGHBOURS_SIZE, GNUNET_YES);
1195 ret->ready_heap = 1195 ret->ready_heap =
1196 GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); 1196 GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
1197 LOG (GNUNET_ERROR_TYPE_DEBUG, "Connecting to transport service.\n"); 1197 LOG (GNUNET_ERROR_TYPE_DEBUG, "Connecting to transport service.\n");
diff --git a/src/util/container_multihashmap.c b/src/util/container_multihashmap.c
index ada98251c..4a41fd015 100644
--- a/src/util/container_multihashmap.c
+++ b/src/util/container_multihashmap.c
@@ -80,10 +80,20 @@ struct GNUNET_CONTAINER_MultiHashMap
80 * Create a multi hash map. 80 * Create a multi hash map.
81 * 81 *
82 * @param len initial size (map will grow as needed) 82 * @param len initial size (map will grow as needed)
83 * @param do_not_copy_keys GNUNET_NO is always safe and should be used by default;
84 * GNUNET_YES means that on 'put', the 'key' does not have
85 * to be copied as the destination of the pointer is
86 * guaranteed to be life as long as the value is stored in
87 * the hashmap. This can significantly reduce memory
88 * consumption, but of course is also a recipie for
89 * heap corruption if the assumption is not true. Only
90 * use this if (1) memory use is important in this case and
91 * (2) you have triple-checked that the invariant holds
83 * @return NULL on error 92 * @return NULL on error
84 */ 93 */
85struct GNUNET_CONTAINER_MultiHashMap * 94struct GNUNET_CONTAINER_MultiHashMap *
86GNUNET_CONTAINER_multihashmap_create (unsigned int len) 95GNUNET_CONTAINER_multihashmap_create (unsigned int len,
96 int do_not_copy_keys)
87{ 97{
88 struct GNUNET_CONTAINER_MultiHashMap *ret; 98 struct GNUNET_CONTAINER_MultiHashMap *ret;
89 99
diff --git a/src/util/peer.c b/src/util/peer.c
index 2444cb9f8..a0e965605 100644
--- a/src/util/peer.c
+++ b/src/util/peer.c
@@ -117,7 +117,7 @@ GNUNET_PEER_intern (const struct GNUNET_PeerIdentity *pid)
117 if (pid == NULL) 117 if (pid == NULL)
118 return 0; 118 return 0;
119 if (NULL == map) 119 if (NULL == map)
120 map = GNUNET_CONTAINER_multihashmap_create (32); 120 map = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_YES);
121 off = (long) GNUNET_CONTAINER_multihashmap_get (map, &pid->hashPubKey); 121 off = (long) GNUNET_CONTAINER_multihashmap_get (map, &pid->hashPubKey);
122 e = (off == 0) ? NULL : &table[off]; 122 e = (off == 0) ? NULL : &table[off];
123 if (e != NULL) 123 if (e != NULL)
@@ -146,7 +146,7 @@ GNUNET_PEER_intern (const struct GNUNET_PeerIdentity *pid)
146 table[ret].rc = 1; 146 table[ret].rc = 1;
147 table[ret].pid = ret; 147 table[ret].pid = ret;
148 GNUNET_break (GNUNET_OK == 148 GNUNET_break (GNUNET_OK ==
149 GNUNET_CONTAINER_multihashmap_put (map, &pid->hashPubKey, 149 GNUNET_CONTAINER_multihashmap_put (map, &table[ret].id.hashPubKey,
150 (void *) (long) ret, 150 (void *) (long) ret,
151 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); 151 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
152 return ret; 152 return ret;
diff --git a/src/util/test_container_multihashmap.c b/src/util/test_container_multihashmap.c
index befd0ce46..ff50df117 100644
--- a/src/util/test_container_multihashmap.c
+++ b/src/util/test_container_multihashmap.c
@@ -40,7 +40,7 @@ testMap (int i)
40 const char *ret; 40 const char *ret;
41 int j; 41 int j;
42 42
43 CHECK (NULL != (m = GNUNET_CONTAINER_multihashmap_create (i))); 43 CHECK (NULL != (m = GNUNET_CONTAINER_multihashmap_create (i, GNUNET_NO)));
44 memset (&k1, 0, sizeof (k1)); 44 memset (&k1, 0, sizeof (k1));
45 memset (&k2, 1, sizeof (k2)); 45 memset (&k2, 1, sizeof (k2));
46 CHECK (GNUNET_NO == GNUNET_CONTAINER_multihashmap_contains (m, &k1)); 46 CHECK (GNUNET_NO == GNUNET_CONTAINER_multihashmap_contains (m, &k1));
diff --git a/src/vpn/gnunet-service-vpn.c b/src/vpn/gnunet-service-vpn.c
index 48de1de46..5a52a6cda 100644
--- a/src/vpn/gnunet-service-vpn.c
+++ b/src/vpn/gnunet-service-vpn.c
@@ -3084,9 +3084,9 @@ run (void *cls,
3084 &max_tunnel_mappings)) 3084 &max_tunnel_mappings))
3085 max_tunnel_mappings = 200; 3085 max_tunnel_mappings = 200;
3086 3086
3087 destination_map = GNUNET_CONTAINER_multihashmap_create (max_destination_mappings * 2); 3087 destination_map = GNUNET_CONTAINER_multihashmap_create (max_destination_mappings * 2, GNUNET_NO);
3088 destination_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); 3088 destination_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
3089 tunnel_map = GNUNET_CONTAINER_multihashmap_create (max_tunnel_mappings * 2); 3089 tunnel_map = GNUNET_CONTAINER_multihashmap_create (max_tunnel_mappings * 2, GNUNET_NO);
3090 tunnel_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); 3090 tunnel_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
3091 3091
3092 3092