/**
- * 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);
}
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);
+ }
}
}
-/**
- * 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.