-only trigger check config if we actually need it
[oweals/gnunet.git] / src / fs / gnunet-service-fs_cp.c
index 363a372cf1921a7a7bc521a3dc68a8d0e15b40a4..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
@@ -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;
 }
 
 
@@ -675,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;
@@ -854,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;
@@ -876,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;
@@ -889,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,
@@ -1490,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;
@@ -1981,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);
 }
 
 
@@ -2009,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);
 }
 
 
@@ -2038,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);
+  
 }