-only trigger check config if we actually need it
[oweals/gnunet.git] / src / fs / gnunet-service-fs_cp.c
index 1d52f28f94d1d1046361799efdf5d0fa5fe5e675..ceb74a2714437436f5825104dfaf783c42faaa04 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     Copyright (C) 2011 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2011 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -171,12 +171,12 @@ struct PeerRequest
 {
 
   /**
-   * Handle to generic request.
+   * Handle to generic request (generic: from peer or local client).
    */
   struct GSF_PendingRequest *pr;
 
   /**
-   * Handle to specific peer.
+   * Which specific peer issued this request?
    */
   struct GSF_ConnectedPeer *cp;
 
@@ -335,6 +335,11 @@ static struct GNUNET_CONTAINER_MultiPeerMap *cp_map;
  */
 static struct GNUNET_PEERSTORE_Handle *peerstore;
 
+/**
+ * Task used to flush respect values to disk.
+ */
+static struct GNUNET_SCHEDULER_Task *fr_task;
+
 
 /**
  * Update the latency information kept for the given peer.
@@ -522,11 +527,9 @@ peer_transmit_ready_cb (void *cls,
  * (re)try to reserve bandwidth from the given peer.
  *
  * @param cls the `struct GSF_ConnectedPeer` to reserve from
- * @param tc scheduler context
  */
 static void
-retry_reservation (void *cls,
-                   const struct GNUNET_SCHEDULER_TaskContext *tc)
+retry_reservation (void *cls)
 {
   struct GSF_ConnectedPeer *cp = cls;
   struct GNUNET_PeerIdentity target;
@@ -602,9 +605,8 @@ ats_reserve_callback (void *cls,
  * @param cls handle to connected peer entry
  * @param record peerstore record information
  * @param emsg error message, or NULL if no errors
- * @return #GNUNET_NO to stop iterating since we only expect 0 or 1 records
  */
-static int
+static void
 peer_respect_cb (void *cls,
                  const struct GNUNET_PEERSTORE_Record *record,
                  const char *emsg)
@@ -612,13 +614,14 @@ peer_respect_cb (void *cls,
   struct GSF_ConnectedPeer *cp = cls;
 
   GNUNET_assert (NULL != cp->respect_iterate_req);
-  cp->respect_iterate_req = NULL;
   if ((NULL != record) && (sizeof (cp->disk_respect) == record->value_size))
     cp->disk_respect = cp->ppd.respect = *((uint32_t *)record->value);
   GSF_push_start_ (cp);
   if (NULL != cp->creation_cb)
     cp->creation_cb (cp->creation_cb_cls, cp);
-  return GNUNET_NO;
+  if (NULL != record)
+    GNUNET_PEERSTORE_iterate_cancel (cp->respect_iterate_req);
+  cp->respect_iterate_req = NULL;
 }
 
 
@@ -644,7 +647,9 @@ GSF_peer_connect_handler_ (const struct GNUNET_PeerIdentity *peer,
   cp->ppd.pid = GNUNET_PEER_intern (peer);
   cp->ppd.transmission_delay = GNUNET_LOAD_value_init (GNUNET_TIME_UNIT_ZERO);
   cp->rc =
-      GNUNET_ATS_reserve_bandwidth (GSF_ats, peer, DBLOCK_SIZE,
+      GNUNET_ATS_reserve_bandwidth (GSF_ats,
+                                    peer,
+                                    DBLOCK_SIZE,
                                     &ats_reserve_callback, cp);
   cp->request_map = GNUNET_CONTAINER_multihashmap_create (128,
                                                           GNUNET_YES);
@@ -653,7 +658,8 @@ GSF_peer_connect_handler_ (const struct GNUNET_PeerIdentity *peer,
                GSF_connected_peer_get_identity2_ (cp),
                                                    cp,
                                                    GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
-  GNUNET_STATISTICS_set (GSF_stats, gettext_noop ("# peers connected"),
+  GNUNET_STATISTICS_set (GSF_stats,
+                         gettext_noop ("# peers connected"),
                          GNUNET_CONTAINER_multipeermap_size (cp_map),
                          GNUNET_NO);
   cp->creation_cb = creation_cb;
@@ -672,11 +678,9 @@ GSF_peer_connect_handler_ (const struct GNUNET_PeerIdentity *peer,
  * peer.  Check, and if so, restart migration.
  *
  * @param cls the `struct GSF_ConnectedPeer`
- * @param tc scheduler context
  */
 static void
-revive_migration (void *cls,
-                  const struct GNUNET_SCHEDULER_TaskContext *tc)
+revive_migration (void *cls)
 {
   struct GSF_ConnectedPeer *cp = cls;
   struct GNUNET_TIME_Relative bt;
@@ -799,14 +803,14 @@ copy_reply (void *cls,
  * Free resources associated with the given peer request.
  *
  * @param peerreq request to free
- * @param query associated key for the request
  */
 static void
-free_pending_request (struct PeerRequest *peerreq,
-                     const struct GNUNET_HashCode *query)
+free_pending_request (struct PeerRequest *peerreq)
 {
   struct GSF_ConnectedPeer *cp = peerreq->cp;
+  struct GSF_PendingRequestData *prd;
 
+  prd = GSF_pending_request_get_data_ (peerreq->pr);
   if (NULL != peerreq->kill_task)
   {
     GNUNET_SCHEDULER_cancel (peerreq->kill_task);
@@ -818,7 +822,7 @@ free_pending_request (struct PeerRequest *peerreq,
                             GNUNET_NO);
   GNUNET_break (GNUNET_YES ==
                 GNUNET_CONTAINER_multihashmap_remove (cp->request_map,
-                                                      query,
+                                                      &prd->query,
                                                       peerreq));
   GNUNET_free (peerreq);
 }
@@ -839,11 +843,10 @@ cancel_pending_request (void *cls,
 {
   struct PeerRequest *peerreq = value;
   struct GSF_PendingRequest *pr = peerreq->pr;
-  struct GSF_PendingRequestData *prd;
 
-  prd = GSF_pending_request_get_data_ (pr);
-  GSF_pending_request_cancel_ (pr, GNUNET_NO);
-  free_pending_request (peerreq, &prd->query);
+  free_pending_request (peerreq);
+  GSF_pending_request_cancel_ (pr,
+                               GNUNET_NO);
   return GNUNET_OK;
 }
 
@@ -852,11 +855,9 @@ cancel_pending_request (void *cls,
  * 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)
+peer_request_destroy (void *cls)
 {
   struct PeerRequest *peerreq = cls;
   struct GSF_PendingRequest *pr = peerreq->pr;
@@ -864,7 +865,9 @@ peer_request_destroy (void *cls,
 
   peerreq->kill_task = NULL;
   prd = GSF_pending_request_get_data_ (pr);
-  cancel_pending_request (NULL, &prd->query, peerreq);
+  cancel_pending_request (NULL,
+                          &prd->query,
+                          peerreq);
 }
 
 
@@ -872,11 +875,9 @@ peer_request_destroy (void *cls,
  * The artificial delay is over, transmit the message now.
  *
  * @param cls the `struct GSF_DelayedHandle` with the message
- * @param tc scheduler context
  */
 static void
-transmit_delayed_now (void *cls,
-                      const struct GNUNET_SCHEDULER_TaskContext *tc)
+transmit_delayed_now (void *cls)
 {
   struct GSF_DelayedHandle *dh = cls;
   struct GSF_ConnectedPeer *cp = dh->cp;
@@ -885,12 +886,6 @@ transmit_delayed_now (void *cls,
                                cp->delayed_tail,
                                dh);
   cp->delay_queue_size--;
-  if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
-  {
-    GNUNET_free (dh->pm);
-    GNUNET_free (dh);
-    return;
-  }
   (void) GSF_peer_transmit_ (cp,
                              GNUNET_NO,
                              UINT32_MAX,
@@ -968,7 +963,7 @@ handle_p2p_reply (void *cls,
   prd = GSF_pending_request_get_data_ (pr);
   if (NULL == data)
   {
-    free_pending_request (peerreq, &prd->query);
+    free_pending_request (peerreq);
     return;
   }
   GNUNET_break (GNUNET_BLOCK_TYPE_ANY != type);
@@ -1047,9 +1042,11 @@ handle_p2p_reply (void *cls,
     GNUNET_STATISTICS_update (GSF_stats,
                               gettext_noop
                               ("# P2P searches destroyed due to ultimate reply"),
-                              1, GNUNET_NO);
+                              1,
+                              GNUNET_NO);
     peerreq->kill_task =
-        GNUNET_SCHEDULER_add_now (&peer_request_destroy, peerreq);
+        GNUNET_SCHEDULER_add_now (&peer_request_destroy,
+                                  peerreq);
   }
 }
 
@@ -1101,7 +1098,8 @@ change_peer_respect (struct GSF_ConnectedPeer *cp, int value)
  * @return effective priority
  */
 static int32_t
-bound_priority (uint32_t prio_in, struct GSF_ConnectedPeer *cp)
+bound_priority (uint32_t prio_in,
+                struct GSF_ConnectedPeer *cp)
 {
 #define N ((double)128.0)
   uint32_t ret;
@@ -1254,9 +1252,9 @@ test_exist_cb (void *cls,
   }
   /* existing request has lower TTL, drop old one! */
   tec->priority += prd->priority;
-  GSF_pending_request_cancel_ (pr, GNUNET_YES);
-  free_pending_request (peerreq,
-                        hc);
+  free_pending_request (peerreq);
+  GSF_pending_request_cancel_ (pr,
+                               GNUNET_YES);
   return GNUNET_NO;
 }
 
@@ -1467,8 +1465,7 @@ GSF_handle_p2p_query_ (const struct GNUNET_PeerIdentity *other,
                                                    peerreq,
                                                    GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
   GNUNET_STATISTICS_update (GSF_stats,
-                            gettext_noop
-                            ("# P2P query messages received and processed"),
+                            gettext_noop ("# P2P query messages received and processed"),
                             1,
                             GNUNET_NO);
   GNUNET_STATISTICS_update (GSF_stats,
@@ -1484,11 +1481,9 @@ GSF_handle_p2p_query_ (const struct GNUNET_PeerIdentity *other,
  * a transmission request.
  *
  * @param cls the `struct GSF_PeerTransmitHandle` of the request
- * @param tc scheduler context
  */
 static void
-peer_transmit_timeout (void *cls,
-                       const struct GNUNET_SCHEDULER_TaskContext *tc)
+peer_transmit_timeout (void *cls)
 {
   struct GSF_PeerTransmitHandle *pth = cls;
   struct GSF_ConnectedPeer *cp;
@@ -1747,8 +1742,11 @@ GSF_peer_disconnect_handler_ (void *cls,
   cp->request_map = NULL;
   GSF_plan_notify_peer_disconnect_ (cp);
   GNUNET_LOAD_value_free (cp->ppd.transmission_delay);
-  GNUNET_PEER_decrement_rcs (cp->ppd.last_p2p_replies, P2P_SUCCESS_LIST_SIZE);
-  memset (cp->ppd.last_p2p_replies, 0, sizeof (cp->ppd.last_p2p_replies));
+  GNUNET_PEER_decrement_rcs (cp->ppd.last_p2p_replies,
+                             P2P_SUCCESS_LIST_SIZE);
+  memset (cp->ppd.last_p2p_replies,
+          0,
+          sizeof (cp->ppd.last_p2p_replies));
   GSF_push_stop_ (cp);
   if (NULL != cp->cth)
   {
@@ -1972,23 +1970,17 @@ GSF_connected_peer_change_preference_ (struct GSF_ConnectedPeer *cp,
  * Call this method periodically to flush respect information to disk.
  *
  * @param cls closure, not used
- * @param tc task context, not used
  */
 static void
-cron_flush_respect (void *cls,
-                    const struct GNUNET_SCHEDULER_TaskContext *tc)
+cron_flush_respect (void *cls)
 {
-  if (NULL == cp_map)
-    return;
+  fr_task = NULL;
   GNUNET_CONTAINER_multipeermap_iterate (cp_map,
-                                         &flush_respect, NULL);
-  if (NULL == tc)
-    return;
-  if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
-    return;
-  GNUNET_SCHEDULER_add_delayed_with_priority (RESPECT_FLUSH_FREQ,
-                                             GNUNET_SCHEDULER_PRIORITY_HIGH,
-                                             &cron_flush_respect, NULL);
+                                         &flush_respect,
+                                        NULL);
+  fr_task = GNUNET_SCHEDULER_add_delayed_with_priority (RESPECT_FLUSH_FREQ,
+                                                       GNUNET_SCHEDULER_PRIORITY_HIGH,
+                                                       &cron_flush_respect, NULL);
 }
 
 
@@ -2000,8 +1992,8 @@ GSF_connected_peer_init_ ()
 {
   cp_map = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_YES);
   peerstore = GNUNET_PEERSTORE_connect (GSF_cfg);
-  GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_HIGH,
-                                      &cron_flush_respect, NULL);
+  fr_task = GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_HIGH,
+                                               &cron_flush_respect, NULL);
 }
 
 
@@ -2029,12 +2021,19 @@ clean_peer (void *cls,
 void
 GSF_connected_peer_done_ ()
 {
-  cron_flush_respect (NULL, NULL);
   GNUNET_CONTAINER_multipeermap_iterate (cp_map,
-                                         &clean_peer, NULL);
+                                         &flush_respect,
+                                         NULL);
+  GNUNET_CONTAINER_multipeermap_iterate (cp_map,
+                                         &clean_peer,
+                                        NULL);
+  GNUNET_SCHEDULER_cancel (fr_task);
+  fr_task = NULL;
   GNUNET_CONTAINER_multipeermap_destroy (cp_map);
   cp_map = NULL;
-  GNUNET_PEERSTORE_disconnect (peerstore, GNUNET_YES);
+  GNUNET_PEERSTORE_disconnect (peerstore,
+                              GNUNET_YES);
+  
 }