From 79da60ccee66fd4f4bff337e298915a45f808768 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 16 Jun 2011 12:27:35 +0000 Subject: [PATCH] better clean up, more stats --- src/fs/gnunet-service-fs_cp.c | 87 +++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 39 deletions(-) diff --git a/src/fs/gnunet-service-fs_cp.c b/src/fs/gnunet-service-fs_cp.c index 1d7360624..13c3f9fb3 100644 --- a/src/fs/gnunet-service-fs_cp.c +++ b/src/fs/gnunet-service-fs_cp.c @@ -778,32 +778,62 @@ copy_reply (void *cls, /** - * Free the given request. + * Cancel all requests associated with the peer. * - * @param cls the request to free - * @param tc task context - */ -static void -peer_request_destroy (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) + * @param cls unused + * @param query hash code of the request + * @param value the 'struct GSF_PendingRequest' + * @return GNUNET_YES (continue to iterate) + */ +static int +cancel_pending_request (void *cls, + const GNUNET_HashCode *query, + void *value) { - struct PeerRequest *peerreq = cls; + struct PeerRequest *peerreq = value; struct GSF_PendingRequest *pr = peerreq->pr; struct GSF_ConnectedPeer *cp = peerreq->cp; struct GSF_PendingRequestData *prd; - peerreq->kill_task = GNUNET_SCHEDULER_NO_TASK; - prd = GSF_pending_request_get_data_ (pr); + if (peerreq->kill_task != GNUNET_SCHEDULER_NO_TASK) + { + GNUNET_SCHEDULER_cancel (peerreq->kill_task); + peerreq->kill_task = GNUNET_SCHEDULER_NO_TASK; + } GNUNET_STATISTICS_update (GSF_stats, gettext_noop ("# P2P searches active"), -1, GNUNET_NO); + prd = GSF_pending_request_get_data_ (pr); GNUNET_break (GNUNET_OK == GNUNET_CONTAINER_multihashmap_remove (cp->request_map, &prd->query, peerreq)); GSF_pending_request_cancel_ (pr); GNUNET_free (peerreq); + return GNUNET_OK; +} + + +/** + * Free the given request. + * + * @param cls the request to free + * @param tc task context + */ +static void +peer_request_destroy (void *cls, + const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + struct PeerRequest *peerreq = cls; + struct GSF_PendingRequest *pr = peerreq->pr; + struct GSF_PendingRequestData *prd; + + peerreq->kill_task = GNUNET_SCHEDULER_NO_TASK; + prd = GSF_pending_request_get_data_ (pr); + cancel_pending_request (NULL, + &prd->query, + peerreq); } @@ -982,8 +1012,14 @@ handle_p2p_reply (void *cls, if (eval != GNUNET_BLOCK_EVALUATION_OK_LAST) return; if (GNUNET_SCHEDULER_NO_TASK == peerreq->kill_task) - peerreq->kill_task = GNUNET_SCHEDULER_add_now (&peer_request_destroy, - peerreq); + { + GNUNET_STATISTICS_update (GSF_stats, + gettext_noop ("# P2P searches destroyed due to ultimate reply"), + 1, + GNUNET_NO); + peerreq->kill_task = GNUNET_SCHEDULER_add_now (&peer_request_destroy, + peerreq); + } } @@ -1598,33 +1634,6 @@ GSF_peer_status_handler_ (void *cls, } -/** - * Cancel all requests associated with the peer. - * - * @param cls unused - * @param query hash code of the request - * @param value the 'struct GSF_PendingRequest' - * @return GNUNET_YES (continue to iterate) - */ -static int -cancel_pending_request (void *cls, - const GNUNET_HashCode *query, - void *value) -{ - struct PeerRequest *peerreq = value; - struct GSF_PendingRequest *pr = peerreq->pr; - - GSF_pending_request_cancel_ (pr); - if (peerreq->kill_task != GNUNET_SCHEDULER_NO_TASK) - { - GNUNET_SCHEDULER_cancel (peerreq->kill_task); - peerreq->kill_task = GNUNET_SCHEDULER_NO_TASK; - } - GNUNET_free (peerreq); - return GNUNET_OK; -} - - /** * A peer disconnected from us. Tear down the connected peer * record. -- 2.25.1