-doxygen and indentation
[oweals/gnunet.git] / src / fs / fs_api.c
index 3cd2fa470a8bc63ff211a29042134e7888efaf3f..f539c7910f1f5f7c220ef82fd0e223c766b132bc 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 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -65,9 +65,13 @@ start_job (struct GNUNET_FS_QueueEntry *qe)
              "Starting job %p (%u active)\n",
              qe,
              qe->h->active_downloads);
-  GNUNET_CONTAINER_DLL_remove (qe->h->pending_head, qe->h->pending_tail, qe);
-  GNUNET_CONTAINER_DLL_insert_after (qe->h->running_head, qe->h->running_tail,
-                                     qe->h->running_tail, qe);
+  GNUNET_CONTAINER_DLL_remove (qe->h->pending_head,
+                               qe->h->pending_tail,
+                               qe);
+  GNUNET_CONTAINER_DLL_insert_after (qe->h->running_head,
+                                     qe->h->running_tail,
+                                     qe->h->running_tail,
+                                     qe);
 }
 
 
@@ -127,7 +131,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 */
@@ -198,6 +202,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,
@@ -206,26 +212,36 @@ 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_requests)
+  if (h->active_downloads + num_downloads_waiting > h->max_parallel_downloads)
   {
-    /* stop probes if possible */
-    num_probes_change = - num_probes_active;
-    num_downloads_change = h->max_parallel_requests - h->active_downloads;
+    /* stop as many probes as there are downloads and probes */
+    num_probes_change = - GNUNET_MIN (num_probes_active,
+                                      num_downloads_waiting);
+    /* start as many downloads as there are free slots, including those
+       we just opened up */
+    num_downloads_change = h->max_parallel_downloads - h->active_downloads - num_probes_change;
   }
   else
   {
-    /* start all downloads */
+    /* start all downloads (we can) */
     num_downloads_change = num_downloads_waiting;
-    /* start as many probes as we can */
-    num_probes_change = GNUNET_MIN (num_probes_waiting,
-                                   h->max_parallel_requests - (h->active_downloads + num_downloads_waiting));
-  }
-
+    /* also start probes if there is room, but use a lower cap of (mpd/4) + 1 */
+    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))
@@ -279,7 +295,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,
@@ -326,7 +343,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 (h->queue_job != NULL)
     GNUNET_SCHEDULER_cancel (h->queue_job);
   h->queue_job = GNUNET_SCHEDULER_add_now (&process_job_queue, h);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -354,7 +371,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 (h->queue_job != NULL)
     GNUNET_SCHEDULER_cancel (h->queue_job);
   h->queue_job = GNUNET_SCHEDULER_add_now (&process_job_queue, h);
 }
@@ -399,7 +416,7 @@ GNUNET_FS_end_top (struct GNUNET_FS_Handle *h,
 
 
 /**
- * Closure for #data_reader_file().
+ * Closure for #GNUNET_FS_data_reader_file_().
  */
 struct FileInfo
 {
@@ -873,6 +890,7 @@ deserialize_fi_node (struct GNUNET_FS_Handle *h,
   char b;
   char *ksks;
   char *chks;
+  char *skss;
   char *filename;
   uint32_t dsize;
 
@@ -885,6 +903,7 @@ deserialize_fi_node (struct GNUNET_FS_Handle *h,
   ret->h = h;
   ksks = NULL;
   chks = NULL;
+  skss = NULL;
   filename = NULL;
   if ((GNUNET_OK != GNUNET_BIO_read_meta_data (rh, "metadata", &ret->meta)) ||
       (GNUNET_OK != GNUNET_BIO_read_string (rh, "ksk-uri", &ksks, 32 * 1024)) ||
@@ -895,6 +914,10 @@ deserialize_fi_node (struct GNUNET_FS_Handle *h,
       ( (NULL != chks) &&
        ( (NULL == (ret->chk_uri = GNUNET_FS_uri_parse (chks, NULL))) ||
          (GNUNET_YES != GNUNET_FS_uri_test_chk (ret->chk_uri))) ) ||
+      (GNUNET_OK != GNUNET_BIO_read_string (rh, "sks-uri", &skss, 1024)) ||
+      ( (NULL != skss) &&
+       ( (NULL == (ret->sks_uri = GNUNET_FS_uri_parse (skss, NULL))) ||
+         (GNUNET_YES != GNUNET_FS_uri_test_sks (ret->sks_uri))) ) ||
       (GNUNET_OK != read_start_time (rh, &ret->start_time)) ||
       (GNUNET_OK != GNUNET_BIO_read_string (rh, "emsg", &ret->emsg, 16 * 1024))
       || (GNUNET_OK !=
@@ -1054,11 +1077,13 @@ deserialize_fi_node (struct GNUNET_FS_Handle *h,
     filename = NULL;
   }
   GNUNET_free_non_null (ksks);
+  GNUNET_free_non_null (skss);
   GNUNET_free_non_null (chks);
   return ret;
 cleanup:
   GNUNET_free_non_null (ksks);
   GNUNET_free_non_null (chks);
+  GNUNET_free_non_null (skss);
   GNUNET_free_non_null (filename);
   GNUNET_FS_file_information_destroy (ret, NULL, NULL);
   return NULL;
@@ -1267,6 +1292,7 @@ GNUNET_FS_file_information_sync_ (struct GNUNET_FS_FileInformation *fi)
   char b;
   char *ksks;
   char *chks;
+  char *skss;
 
   if (NULL == fi->serialization)
     fi->serialization =
@@ -1299,10 +1325,15 @@ GNUNET_FS_file_information_sync_ (struct GNUNET_FS_FileInformation *fi)
     chks = GNUNET_FS_uri_to_string (fi->chk_uri);
   else
     chks = NULL;
+  if (NULL != fi->sks_uri)
+    skss = GNUNET_FS_uri_to_string (fi->sks_uri);
+  else
+    skss = NULL;
   if ((GNUNET_OK != GNUNET_BIO_write (wh, &b, sizeof (b))) ||
       (GNUNET_OK != GNUNET_BIO_write_meta_data (wh, fi->meta)) ||
       (GNUNET_OK != GNUNET_BIO_write_string (wh, ksks)) ||
       (GNUNET_OK != GNUNET_BIO_write_string (wh, chks)) ||
+      (GNUNET_OK != GNUNET_BIO_write_string (wh, skss)) ||
       (GNUNET_OK != write_start_time (wh, fi->start_time)) ||
       (GNUNET_OK != GNUNET_BIO_write_string (wh, fi->emsg)) ||
       (GNUNET_OK != GNUNET_BIO_write_string (wh, fi->filename)) ||
@@ -1319,6 +1350,8 @@ GNUNET_FS_file_information_sync_ (struct GNUNET_FS_FileInformation *fi)
   chks = NULL;
   GNUNET_free_non_null (ksks);
   ksks = NULL;
+  GNUNET_free_non_null (skss);
+  skss = NULL;
 
   switch (b)
   {
@@ -1410,6 +1443,7 @@ cleanup:
     (void) GNUNET_BIO_write_close (wh);
   GNUNET_free_non_null (chks);
   GNUNET_free_non_null (ksks);
+  GNUNET_free_non_null (skss);
   fn = get_serialization_file_name (fi->h, GNUNET_FS_SYNC_PATH_FILE_INFO,
                                     fi->serialization);
   if (NULL != fn)
@@ -1592,7 +1626,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,
@@ -2113,7 +2147,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)) ||
@@ -2865,8 +2899,9 @@ deserialize_search (struct GNUNET_FS_Handle *h,
   }
   sc->h = h;
   sc->serialization = GNUNET_strdup (serialization);
-  if ((GNUNET_OK != GNUNET_BIO_read_string (rh, "search-uri", &uris, 10 * 1024))
-      || (NULL == (sc->uri = GNUNET_FS_uri_parse (uris, &emsg))) ||
+  if ((GNUNET_OK !=
+       GNUNET_BIO_read_string (rh, "search-uri", &uris, 10 * 1024)) ||
+      (NULL == (sc->uri = GNUNET_FS_uri_parse (uris, &emsg))) ||
       ((GNUNET_YES != GNUNET_FS_uri_test_ksk (sc->uri)) &&
        (GNUNET_YES != GNUNET_FS_uri_test_sks (sc->uri))) ||
       (GNUNET_OK != read_start_time (rh, &sc->start_time)) ||
@@ -2883,8 +2918,7 @@ deserialize_search (struct GNUNET_FS_Handle *h,
   sc->options = (enum GNUNET_FS_SearchOptions) options;
   sc->master_result_map = GNUNET_CONTAINER_multihashmap_create (16, GNUNET_NO);
   dn = get_serialization_file_name_in_dir (h,
-                                           (sc->psearch_result ==
-                                            NULL) ?
+                                           (NULL == sc->psearch_result) ?
                                            GNUNET_FS_SYNC_PATH_MASTER_SEARCH :
                                            GNUNET_FS_SYNC_PATH_CHILD_SEARCH,
                                            sc->serialization, "");
@@ -3103,7 +3137,7 @@ GNUNET_FS_stop (struct GNUNET_FS_Handle *h)
 {
   while (h->top_head != NULL)
     h->top_head->ssf (h->top_head->ssf_cls);
-  if (h->queue_job != GNUNET_SCHEDULER_NO_TASK)
+  if (h->queue_job != NULL)
     GNUNET_SCHEDULER_cancel (h->queue_job);
   GNUNET_free (h->client_name);
   GNUNET_free (h);