/*
This file is part of GNUnet.
- (C) 2012 Christian Grothoff (and other contributing authors)
+ (C) 2008--2013 Christian Grothoff (and other contributing authors)
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your
+ by the Free Software Foundation; either version 3, or (at your
option) any later version.
GNUnet is distributed in the hope that it will be useful, but
*/
/**
- * @file testbed/gnunet-service-testbed_cache.h
+ * @file testbed/gnunet-service-testbed_cache.c
* @brief testbed cache implementation
* @author Sree Harsha Totakura
*/
/**
* Looks up in the cache and returns the entry
*
- * @param id the peer identity of the peer whose corresponding entry has to be looked up
+ * @param key the peer identity of the peer whose corresponding entry has to be
+ * looked up
* @return the HELLO message; NULL if not found
*/
static struct CacheEntry *
if (NULL != entry->transport_op)
{
GNUNET_TESTBED_operation_done (entry->transport_op);
- entry->transport_op = NULL;
+ entry->transport_op = NULL;
}
if (NULL != entry->core_op)
{
case CGT_CORE_HANDLE:
if (NULL == entry->core_handle)
continue;
+ if (NULL == entry->peer_identity) /* Our CORE connection isn't ready yet */
+ continue;
break;
}
break;
*
* @param cls closure
* @param peer the peer that connected
- * @param ats performance data
- * @param ats_count number of entries in ats (excluding 0-termination)
*/
static void
transport_peer_connect_notify_cb (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_ATS_Information *ats,
- uint32_t ats_count)
+ const struct GNUNET_PeerIdentity *peer)
{
peer_connect_notify_cb (cls, peer, CGT_TRANSPORT_HANDLE);
}
* do this later).
*
* @param cls closure
- * @param server handle to the server, NULL if we failed
* @param my_identity ID of this peer, NULL if we failed
*/
static void
-core_startup_cb (void *cls, struct GNUNET_CORE_Handle *server,
+core_startup_cb (void *cls,
const struct GNUNET_PeerIdentity *my_identity)
{
struct CacheEntry *entry = cls;
return;
}
GNUNET_assert (NULL == entry->peer_identity);
- entry->core_handle = server;
- entry->peer_identity = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
+ // FIXME: why is this dynamically allocated?
+ entry->peer_identity = GNUNET_new (struct GNUNET_PeerIdentity);
memcpy (entry->peer_identity, my_identity,
sizeof (struct GNUNET_PeerIdentity));
if (0 == entry->demand)
*
* @param cls closure
* @param peer peer identity this notification is about
- * @param atsi performance data for the connection
- * @param atsi_count number of records in 'atsi'
*/
static void
-core_peer_connect_cb (void *cls, const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_ATS_Information *atsi,
- unsigned int atsi_count)
+core_peer_connect_cb (void *cls, const struct GNUNET_PeerIdentity *peer)
{
peer_connect_notify_cb (cls, peer, CGT_CORE_HANDLE);
}
* lookup in the cache; if not, a new operation is started to open the transport
* handle and will be given in the callback when it is available.
*
- * @param cls the cache entry
+ * @param peer_id the index of the peer
+ * @param cgh the CacheGetHandle
+ * @param cfg the configuration with which the transport handle has to be
+ * created if it was not present in the cache
+ * @param target the peer identify of the peer whose connection to
+ * TRANSPORT/CORE (depending on the type of 'cgh') subsystem will be
+ * notified through the connect_notify_cb. Can be NULL
+ * @param connect_notify_cb the callback to call when the given target peer is
+ * connected. This callback will only be called once or never again (in
+ * case the target peer cannot be connected). Can be NULL
+ * @param connect_notify_cb_cls the closure for the above callback
+ * @return the handle which can be used to cancel or mark that the handle is no
+ * longer being used
*/
static struct GSTCacheGetHandle *
cache_get_handle (unsigned int peer_id, struct GSTCacheGetHandle *cgh,
if (NULL != handle)
{
if (GNUNET_SCHEDULER_NO_TASK == entry->notify_task)
- entry->notify_task = GNUNET_SCHEDULER_add_now (&call_cgh_cb, entry);
+ {
+ if (NULL != search_suitable_cgh (entry, entry->cgh_qhead))
+ entry->notify_task = GNUNET_SCHEDULER_add_now (&call_cgh_cb, entry);
+ }
return cgh;
}
+ op = NULL;
switch (cgh->type)
{
case CGT_TRANSPORT_HANDLE:
&oprelease_get_handle_core);
entry->core_op = op;
break;
+ default:
+ GNUNET_assert (0);
}
GNUNET_TESTBED_operation_queue_insert_ (GST_opq_openfds, op);
GNUNET_TESTBED_operation_begin_wait_ (op);
GNUNET_assert (NULL != entry);
GNUNET_break (0 == entry->demand);
LOG_DEBUG ("Clearing entry %u of %u\n", ++ncleared, cache_size);
- GNUNET_CONTAINER_multihashmap_remove (cache, key, value);
+ GNUNET_assert (GNUNET_YES ==
+ GNUNET_CONTAINER_multihashmap_remove (cache, key, value));
close_handles (entry);
GNUNET_free_non_null (entry->hello);
GNUNET_break (GNUNET_SCHEDULER_NO_TASK == entry->expire_task);
GNUNET_CONTAINER_multihashmap_iterate (cache, &cache_clear_iterator, NULL);
GNUNET_assert (0 == GNUNET_CONTAINER_multihashmap_size (cache));
GNUNET_CONTAINER_multihashmap_destroy (cache);
+ cache = NULL;
+ lru_cache_size = 0;
+ lru_cache_threshold_size = 0;
+ cache_size = 0;
+ lru_cache_head = NULL;
+ lru_cache_tail = NULL;
}
}
else
{
- struct GSTCacheGetHandle *cgh2;
-
- if (NULL != (cgh2 = search_suitable_cgh (entry, entry->cgh_qhead)))
+ if (NULL != search_suitable_cgh (entry, entry->cgh_qhead))
entry->notify_task = GNUNET_SCHEDULER_add_now (&call_cgh_cb, entry);
}
}
* connected. This callback will only be called once or never again (in
* case the target peer cannot be connected). Can be NULL
* @param connect_notify_cb_cls the closure for the above callback
- * @return the handle which can be used cancel or mark that the handle is no
+ * @return the handle which can be used to cancel or mark that the handle is no
* longer being used
*/
struct GSTCacheGetHandle *
* connected. This callback will only be called once or never again (in
* case the target peer cannot be connected). Can be NULL
* @param connect_notify_cb_cls the closure for the above callback
- * @return the handle which can be used cancel or mark that the handle is no
+ * @return the handle which can be used to cancel or mark that the handle is no
* longer being used
*/
struct GSTCacheGetHandle *
* Caches the HELLO of the given peer. Updates the HELLO if it was already
* cached before
*
- * @param id the peer identity of the peer whose HELLO has to be cached
+ * @param peer_id the peer identity of the peer whose HELLO has to be cached
* @param hello the HELLO message
*/
void