diff options
-rw-r--r-- | src/fs/gnunet-service-fs_cp.c | 87 |
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' |
786 | static void | 786 | * @return GNUNET_YES (continue to iterate) |
787 | peer_request_destroy (void *cls, | 787 | */ |
788 | const struct GNUNET_SCHEDULER_TaskContext *tc) | 788 | static int |
789 | cancel_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 | */ | ||
824 | static void | ||
825 | peer_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 | */ | ||
1609 | static int | ||
1610 | cancel_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 | * |