aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/fs/gnunet-service-fs_cp.c87
1 files 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,
778 778
779 779
780/** 780/**
781 * Free the given request. 781 * Cancel all requests associated with the peer.
782 * 782 *
783 * @param cls the request to free 783 * @param cls unused
784 * @param tc task context 784 * @param query hash code of the request
785 */ 785 * @param value the 'struct GSF_PendingRequest'
786static void 786 * @return GNUNET_YES (continue to iterate)
787peer_request_destroy (void *cls, 787 */
788 const struct GNUNET_SCHEDULER_TaskContext *tc) 788static int
789cancel_pending_request (void *cls,
790 const GNUNET_HashCode *query,
791 void *value)
789{ 792{
790 struct PeerRequest *peerreq = cls; 793 struct PeerRequest *peerreq = value;
791 struct GSF_PendingRequest *pr = peerreq->pr; 794 struct GSF_PendingRequest *pr = peerreq->pr;
792 struct GSF_ConnectedPeer *cp = peerreq->cp; 795 struct GSF_ConnectedPeer *cp = peerreq->cp;
793 struct GSF_PendingRequestData *prd; 796 struct GSF_PendingRequestData *prd;
794 797
795 peerreq->kill_task = GNUNET_SCHEDULER_NO_TASK; 798 if (peerreq->kill_task != GNUNET_SCHEDULER_NO_TASK)
796 prd = GSF_pending_request_get_data_ (pr); 799 {
800 GNUNET_SCHEDULER_cancel (peerreq->kill_task);
801 peerreq->kill_task = GNUNET_SCHEDULER_NO_TASK;
802 }
797 GNUNET_STATISTICS_update (GSF_stats, 803 GNUNET_STATISTICS_update (GSF_stats,
798 gettext_noop ("# P2P searches active"), 804 gettext_noop ("# P2P searches active"),
799 -1, 805 -1,
800 GNUNET_NO); 806 GNUNET_NO);
807 prd = GSF_pending_request_get_data_ (pr);
801 GNUNET_break (GNUNET_OK == 808 GNUNET_break (GNUNET_OK ==
802 GNUNET_CONTAINER_multihashmap_remove (cp->request_map, 809 GNUNET_CONTAINER_multihashmap_remove (cp->request_map,
803 &prd->query, 810 &prd->query,
804 peerreq)); 811 peerreq));
805 GSF_pending_request_cancel_ (pr); 812 GSF_pending_request_cancel_ (pr);
806 GNUNET_free (peerreq); 813 GNUNET_free (peerreq);
814 return GNUNET_OK;
815}
816
817
818/**
819 * Free the given request.
820 *
821 * @param cls the request to free
822 * @param tc task context
823 */
824static void
825peer_request_destroy (void *cls,
826 const struct GNUNET_SCHEDULER_TaskContext *tc)
827{
828 struct PeerRequest *peerreq = cls;
829 struct GSF_PendingRequest *pr = peerreq->pr;
830 struct GSF_PendingRequestData *prd;
831
832 peerreq->kill_task = GNUNET_SCHEDULER_NO_TASK;
833 prd = GSF_pending_request_get_data_ (pr);
834 cancel_pending_request (NULL,
835 &prd->query,
836 peerreq);
807} 837}
808 838
809 839
@@ -982,8 +1012,14 @@ handle_p2p_reply (void *cls,
982 if (eval != GNUNET_BLOCK_EVALUATION_OK_LAST) 1012 if (eval != GNUNET_BLOCK_EVALUATION_OK_LAST)
983 return; 1013 return;
984 if (GNUNET_SCHEDULER_NO_TASK == peerreq->kill_task) 1014 if (GNUNET_SCHEDULER_NO_TASK == peerreq->kill_task)
985 peerreq->kill_task = GNUNET_SCHEDULER_add_now (&peer_request_destroy, 1015 {
986 peerreq); 1016 GNUNET_STATISTICS_update (GSF_stats,
1017 gettext_noop ("# P2P searches destroyed due to ultimate reply"),
1018 1,
1019 GNUNET_NO);
1020 peerreq->kill_task = GNUNET_SCHEDULER_add_now (&peer_request_destroy,
1021 peerreq);
1022 }
987} 1023}
988 1024
989 1025
@@ -1599,33 +1635,6 @@ GSF_peer_status_handler_ (void *cls,
1599 1635
1600 1636
1601/** 1637/**
1602 * Cancel all requests associated with the peer.
1603 *
1604 * @param cls unused
1605 * @param query hash code of the request
1606 * @param value the 'struct GSF_PendingRequest'
1607 * @return GNUNET_YES (continue to iterate)
1608 */
1609static int
1610cancel_pending_request (void *cls,
1611 const GNUNET_HashCode *query,
1612 void *value)
1613{
1614 struct PeerRequest *peerreq = value;
1615 struct GSF_PendingRequest *pr = peerreq->pr;
1616
1617 GSF_pending_request_cancel_ (pr);
1618 if (peerreq->kill_task != GNUNET_SCHEDULER_NO_TASK)
1619 {
1620 GNUNET_SCHEDULER_cancel (peerreq->kill_task);
1621 peerreq->kill_task = GNUNET_SCHEDULER_NO_TASK;
1622 }
1623 GNUNET_free (peerreq);
1624 return GNUNET_OK;
1625}
1626
1627
1628/**
1629 * A peer disconnected from us. Tear down the connected peer 1638 * A peer disconnected from us. Tear down the connected peer
1630 * record. 1639 * record.
1631 * 1640 *