-only trigger check config if we actually need it
[oweals/gnunet.git] / src / fs / fs_api.c
index 302020d7d3a61623d5056779f975b34a79ca4ce0..2db475528d5dacc42579e2e754686e8b37e56518 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2001--2012 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2001--2012 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
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
@@ -108,11 +108,9 @@ stop_job (struct GNUNET_FS_QueueEntry *qe)
  * and stopping others.
  *
  * @param cls the `struct GNUNET_FS_Handle *`
- * @param tc scheduler context
  */
 static void
-process_job_queue (void *cls,
-                   const struct GNUNET_SCHEDULER_TaskContext *tc)
+process_job_queue (void *cls)
 {
   struct GNUNET_FS_Handle *h = cls;
   struct GNUNET_FS_QueueEntry *qe;
@@ -131,7 +129,7 @@ process_job_queue (void *cls,
   int num_downloads_change;
   int block_limit_hit;
 
-  h->queue_job = GNUNET_SCHEDULER_NO_TASK;
+  h->queue_job = NULL;
   /* restart_at will be set to the time when it makes sense to
      re-evaluate the job queue (unless, of course, jobs complete
      or are added, then we'll be triggered immediately */
@@ -202,6 +200,8 @@ process_job_queue (void *cls,
       break;
     }
   }
+  GNUNET_break (h->active_downloads ==
+                num_downloads_active + num_probes_active);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "PA: %u, PE: %u, PW: %u; DA: %u, DE: %u, DW: %u\n",
              num_probes_active,
@@ -210,6 +210,8 @@ process_job_queue (void *cls,
              num_downloads_active,
              num_downloads_expired,
              num_downloads_waiting);
+  GNUNET_break (h->active_downloads + num_probes_active <=
+                h->max_parallel_downloads);
   /* calculate start/stop decisions */
   if (h->active_downloads + num_downloads_waiting > h->max_parallel_downloads)
   {
@@ -225,17 +227,19 @@ process_job_queue (void *cls,
     /* start all downloads (we can) */
     num_downloads_change = num_downloads_waiting;
     /* also start probes if there is room, but use a lower cap of (mpd/4) + 1 */
-    if (h->max_parallel_downloads / 2 >= (h->active_downloads + num_downloads_change))
+    if (1 + h->max_parallel_downloads / 4 >= (h->active_downloads + num_downloads_change))
       num_probes_change = GNUNET_MIN (num_probes_waiting,
                                       (1 + h->max_parallel_downloads / 4) - (h->active_downloads + num_downloads_change));
     else
       num_probes_change = 0;
   }
-
+  GNUNET_break (num_downloads_change <= num_downloads_waiting);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-             "Changing %d probes and %d downloads\n",
+             "Changing %d probes and %d/%u/%u downloads\n",
              num_probes_change,
-             num_downloads_change);
+             num_downloads_change,
+              (unsigned int) h->active_downloads,
+              (unsigned int) h->max_parallel_downloads);
   /* actually stop probes */
   next = h->running_head;
   while (NULL != (qe = next))
@@ -289,7 +293,8 @@ process_job_queue (void *cls,
       break;
     }
   }
-  GNUNET_break ( (0 == num_downloads_change) || (GNUNET_YES == block_limit_hit) );
+  GNUNET_break ( (0 == num_downloads_change) ||
+                 (GNUNET_YES == block_limit_hit) );
   GNUNET_break (0 == num_probes_change);
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -300,7 +305,11 @@ process_job_queue (void *cls,
              num_downloads_change,
              GNUNET_STRINGS_relative_time_to_string (restart_at, GNUNET_YES));
 
-  /* make sure we run again */
+  /* make sure we run again, callbacks might have
+     already re-scheduled the job, so cancel such
+     an operation (if it exists) */
+  if (NULL != h->queue_job)
+    GNUNET_SCHEDULER_cancel (h->queue_job);
   h->queue_job =
       GNUNET_SCHEDULER_add_delayed (restart_at, &process_job_queue, h);
 }
@@ -336,7 +345,7 @@ GNUNET_FS_queue_ (struct GNUNET_FS_Handle *h,
   qe->priority = priority;
   GNUNET_CONTAINER_DLL_insert_after (h->pending_head, h->pending_tail,
                                      h->pending_tail, qe);
-  if (h->queue_job != GNUNET_SCHEDULER_NO_TASK)
+  if (NULL != h->queue_job)
     GNUNET_SCHEDULER_cancel (h->queue_job);
   h->queue_job = GNUNET_SCHEDULER_add_now (&process_job_queue, h);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -364,7 +373,7 @@ GNUNET_FS_dequeue_ (struct GNUNET_FS_QueueEntry *qe)
     stop_job (qe);
   GNUNET_CONTAINER_DLL_remove (h->pending_head, h->pending_tail, qe);
   GNUNET_free (qe);
-  if (h->queue_job != GNUNET_SCHEDULER_NO_TASK)
+  if (NULL != h->queue_job)
     GNUNET_SCHEDULER_cancel (h->queue_job);
   h->queue_job = GNUNET_SCHEDULER_add_now (&process_job_queue, h);
 }
@@ -1619,7 +1628,7 @@ deserialize_publish_file (void *cls,
   /* re-start publishing (if needed)... */
   if (GNUNET_YES != pc->all_done)
   {
-    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == pc->upload_task);
+    GNUNET_assert (NULL == pc->upload_task);
     pc->upload_task =
         GNUNET_SCHEDULER_add_with_priority
         (GNUNET_SCHEDULER_PRIORITY_BACKGROUND,
@@ -2140,7 +2149,7 @@ GNUNET_FS_search_sync_ (struct GNUNET_FS_SearchContext *sc)
   GNUNET_assert ((GNUNET_YES == GNUNET_FS_uri_test_ksk (sc->uri)) ||
                  (GNUNET_YES == GNUNET_FS_uri_test_sks (sc->uri)));
   uris = GNUNET_FS_uri_to_string (sc->uri);
-  in_pause = (sc->task != GNUNET_SCHEDULER_NO_TASK) ? 'r' : '\0';
+  in_pause = (sc->task != NULL) ? 'r' : '\0';
   if ((GNUNET_OK != GNUNET_BIO_write_string (wh, uris)) ||
       (GNUNET_OK != write_start_time (wh, sc->start_time)) ||
       (GNUNET_OK != GNUNET_BIO_write_string (wh, sc->emsg)) ||
@@ -3032,11 +3041,12 @@ deserialize_download_file (void *cls, const char *filename)
  * Deserialize informatin about pending operations.
  *
  * @param master_path which master directory should be scanned
- * @param proc function to call for each entry (will get 'h' for 'cls')
- * @param h the 'struct GNUNET_FS_Handle*'
+ * @param proc function to call for each entry (will get @a h for 'cls')
+ * @param h the `struct GNUNET_FS_Handle *`
  */
 static void
-deserialization_master (const char *master_path, GNUNET_FileNameCallback proc,
+deserialization_master (const char *master_path,
+                       GNUNET_FileNameCallback proc,
                         struct GNUNET_FS_Handle *h)
 {
   char *dn;
@@ -3120,17 +3130,19 @@ GNUNET_FS_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
 
 /**
  * Close our connection with the file-sharing service.
- * The callback given to GNUNET_FS_start will no longer be
+ * The callback given to #GNUNET_FS_start() will no longer be
  * called after this function returns.
+ * This function MUST NOT be called from within the
+ * callback itself.
  *
  * @param h handle that was returned from #GNUNET_FS_start()
  */
 void
 GNUNET_FS_stop (struct GNUNET_FS_Handle *h)
 {
-  while (h->top_head != NULL)
+  while (NULL != h->top_head)
     h->top_head->ssf (h->top_head->ssf_cls);
-  if (h->queue_job != GNUNET_SCHEDULER_NO_TASK)
+  if (NULL != h->queue_job)
     GNUNET_SCHEDULER_cancel (h->queue_job);
   GNUNET_free (h->client_name);
   GNUNET_free (h);