From e80a0f007995572e8b1ab167de88b0a547841828 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 30 May 2013 13:04:02 +0000 Subject: -preparations for fixing #2711 --- src/fs/fs_api.c | 11 ++++++----- src/fs/fs_api.h | 15 ++++++++++++--- src/fs/fs_search.c | 47 +++++++++++++++++++++++++++-------------------- 3 files changed, 45 insertions(+), 28 deletions(-) diff --git a/src/fs/fs_api.c b/src/fs/fs_api.c index b7ae05527..da7acc903 100644 --- a/src/fs/fs_api.c +++ b/src/fs/fs_api.c @@ -1965,7 +1965,7 @@ GNUNET_FS_search_result_sync_ (struct GNUNET_FS_SearchResult *sr) uris = NULL; if (NULL == sr->serialization) sr->serialization = - make_serialization_file_name_in_dir (sr->sc->h, + make_serialization_file_name_in_dir (sr->h, (sr->sc->psearch_result == NULL) ? GNUNET_FS_SYNC_PATH_MASTER_SEARCH : @@ -1973,7 +1973,7 @@ GNUNET_FS_search_result_sync_ (struct GNUNET_FS_SearchResult *sr) sr->sc->serialization); if (NULL == sr->serialization) return; - wh = get_write_handle_in_dir (sr->sc->h, + wh = get_write_handle_in_dir (sr->h, (sr->sc->psearch_result == NULL) ? GNUNET_FS_SYNC_PATH_MASTER_SEARCH : GNUNET_FS_SYNC_PATH_CHILD_SEARCH, @@ -2023,7 +2023,7 @@ cleanup: GNUNET_free_non_null (uris); if (NULL != wh) (void) GNUNET_BIO_write_close (wh); - remove_sync_file_in_dir (sr->sc->h, + remove_sync_file_in_dir (sr->h, (NULL == sr->sc->psearch_result) ? GNUNET_FS_SYNC_PATH_MASTER_SEARCH : GNUNET_FS_SYNC_PATH_CHILD_SEARCH, @@ -2322,6 +2322,7 @@ deserialize_search_result (void *cls, const char *filename) download = NULL; update_srch = NULL; sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult)); + sr->h = sc->h; sr->sc = sc; sr->serialization = ser; if ((GNUNET_OK != GNUNET_BIO_read_string (rh, "result-uri", &uris, 10 * 1024)) @@ -2485,7 +2486,7 @@ signal_result_resume (void *cls, const struct GNUNET_HashCode * key, void *value sr->availability_trials; pi.value.search.specifics.resume_result.applicability_rank = sr->optional_support; - sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc); + sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); } if (NULL != sr->download) { @@ -2761,7 +2762,7 @@ signal_search_resume (struct GNUNET_FS_SearchContext *sc) pi.value.search.specifics.resume.message = sc->emsg; pi.value.search.specifics.resume.is_paused = (NULL == sc->client) ? GNUNET_YES : GNUNET_NO; - sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc); + sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, &signal_result_resume, sc); diff --git a/src/fs/fs_api.h b/src/fs/fs_api.h index 8d9c0b298..9e3e9e787 100644 --- a/src/fs/fs_api.h +++ b/src/fs/fs_api.h @@ -510,8 +510,6 @@ struct GNUNET_FS_QueueEntry }; - - /** * Information we store for each search result. */ @@ -519,7 +517,13 @@ struct GNUNET_FS_SearchResult { /** - * Search context this result belongs to. + * File-sharing context this result belongs to. + */ + struct GNUNET_FS_Handle *h; + + /** + * Search context this result belongs to; can be NULL + * for probes that come from a directory result. */ struct GNUNET_FS_SearchContext *sc; @@ -819,11 +823,13 @@ GNUNET_FS_unindex_make_status_ (struct GNUNET_FS_ProgressInfo *pi, * call the callback. * * @param pi structure to fill in + * @param h file-sharing handle * @param sc overall search context * @return value returned by the callback */ void * GNUNET_FS_search_make_status_ (struct GNUNET_FS_ProgressInfo *pi, + struct GNUNET_FS_Handle *h, struct GNUNET_FS_SearchContext *sc); @@ -1992,6 +1998,9 @@ struct NamespaceUpdateNode }; +/** + * Handle to one of our namespaces. + */ struct GNUNET_FS_Namespace { diff --git a/src/fs/fs_search.c b/src/fs/fs_search.c index 016201e0f..0c51ed394 100644 --- a/src/fs/fs_search.c +++ b/src/fs/fs_search.c @@ -39,24 +39,29 @@ * call the callback. * * @param pi structure to fill in + * @param h file-sharing handle * @param sc overall search context * @return value returned by the callback */ void * GNUNET_FS_search_make_status_ (struct GNUNET_FS_ProgressInfo *pi, + struct GNUNET_FS_Handle *h, struct GNUNET_FS_SearchContext *sc) { void *ret; pi->value.search.sc = sc; - pi->value.search.cctx = sc->client_info; + pi->value.search.cctx = (NULL != sc) ? sc->client_info : NULL; pi->value.search.pctx = - (NULL == sc->psearch_result) ? NULL : sc->psearch_result->client_info; - pi->value.search.query = sc->uri; - pi->value.search.duration = - GNUNET_TIME_absolute_get_duration (sc->start_time); - pi->value.search.anonymity = sc->anonymity; - ret = sc->h->upcb (sc->h->upcb_cls, pi); + ((NULL == sc) || (NULL == sc->psearch_result)) + ? NULL + : sc->psearch_result->client_info; + pi->value.search.query = (NULL != sc) ? sc->uri : NULL; + pi->value.search.duration = (NULL != sc) + ? GNUNET_TIME_absolute_get_duration (sc->start_time) + : GNUNET_TIME_UNIT_ZERO; + pi->value.search.anonymity = (NULL != sc) ? sc->anonymity : 0; + ret = h->upcb (h->upcb_cls, pi); return ret; } @@ -102,7 +107,7 @@ notify_client_chk_result (struct GNUNET_FS_SearchContext *sc, pi.value.search.specifics.result.uri = sr->uri; pi.value.search.specifics.result.result = sr; pi.value.search.specifics.result.applicability_rank = sr->optional_support; - sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc); + sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); } @@ -130,7 +135,7 @@ notify_client_chk_update (struct GNUNET_FS_SearchContext *sc, pi.value.search.specifics.update.applicability_rank = sr->optional_support; pi.value.search.specifics.update.current_probe_time = GNUNET_TIME_absolute_get_duration (sr->probe_active_time); - sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc); + sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); } @@ -194,7 +199,7 @@ signal_probe_result (struct GNUNET_FS_SearchResult *sr) pi.value.search.specifics.update.applicability_rank = sr->optional_support; pi.value.search.specifics.update.current_probe_time = GNUNET_TIME_absolute_get_duration (sr->probe_active_time); - sr->client_info = GNUNET_FS_search_make_status_ (&pi, sr->sc); + sr->client_info = GNUNET_FS_search_make_status_ (&pi, sr->h, sr->sc); GNUNET_FS_search_start_probe_ (sr); } @@ -395,7 +400,7 @@ GNUNET_FS_search_start_probe_ (struct GNUNET_FS_SearchResult *sr) return; if (NULL != sr->download) return; - if (0 == (sr->sc->h->flags & GNUNET_FS_FLAGS_DO_PROBES)) + if (0 == (sr->h->flags & GNUNET_FS_FLAGS_DO_PROBES)) return; if (sr->availability_trials > AVAILABILITY_TRIALS_MAX) return; @@ -420,10 +425,10 @@ GNUNET_FS_search_start_probe_ (struct GNUNET_FS_SearchResult *sr) (unsigned long long) off, sr); sr->remaining_probe_time = - GNUNET_TIME_relative_multiply (sr->sc->h->avg_block_latency, + GNUNET_TIME_relative_multiply (sr->h->avg_block_latency, 2 * (1 + sr->availability_trials)); sr->probe_ctx = - GNUNET_FS_download_start (sr->sc->h, sr->uri, sr->meta, NULL, NULL, off, + GNUNET_FS_download_start (sr->h, sr->uri, sr->meta, NULL, NULL, off, len, sr->sc->anonymity, GNUNET_FS_DOWNLOAD_NO_TEMPORARIES | GNUNET_FS_DOWNLOAD_IS_PROBE, sr, NULL); @@ -473,6 +478,7 @@ process_ksk_result (struct GNUNET_FS_SearchContext *sc, if (NULL == sr) { sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult)); + sr->h = sc->h; sr->sc = sc; sr->uri = GNUNET_FS_uri_dup (uri); sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); @@ -552,6 +558,7 @@ process_sks_result (struct GNUNET_FS_SearchContext *sc, const char *id_update, (void *) uri)) return; /* duplicate result */ sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult)); + sr->h = sc->h; sr->sc = sc; sr->uri = GNUNET_FS_uri_dup (uri); sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); @@ -1191,7 +1198,7 @@ search_start (struct GNUNET_FS_Handle *h, const struct GNUNET_FS_Uri *uri, } GNUNET_FS_search_sync_ (sc); pi.status = GNUNET_FS_STATUS_SEARCH_START; - sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc); + sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); return sc; } @@ -1342,7 +1349,7 @@ search_result_suspend (void *cls, const struct GNUNET_HashCode * key, void *valu pi.value.search.specifics.result_suspend.cctx = sr->client_info; pi.value.search.specifics.result_suspend.meta = sr->meta; pi.value.search.specifics.result_suspend.uri = sr->uri; - sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc); + sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); GNUNET_break (NULL == sr->client_info); GNUNET_free_non_null (sr->serialization); GNUNET_FS_uri_destroy (sr->uri); @@ -1375,7 +1382,7 @@ GNUNET_FS_search_signal_suspend_ (void *cls) GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, &search_result_suspend, sc); pi.status = GNUNET_FS_STATUS_SEARCH_SUSPEND; - sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc); + sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); GNUNET_break (NULL == sc->client_info); if (sc->task != GNUNET_SCHEDULER_NO_TASK) GNUNET_SCHEDULER_cancel (sc->task); @@ -1442,7 +1449,7 @@ GNUNET_FS_search_pause (struct GNUNET_FS_SearchContext *sc) GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, &search_result_freeze_probes, sc); pi.status = GNUNET_FS_STATUS_SEARCH_PAUSED; - sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc); + sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); } @@ -1461,7 +1468,7 @@ GNUNET_FS_search_continue (struct GNUNET_FS_SearchContext *sc) do_reconnect (sc, NULL); GNUNET_FS_search_sync_ (sc); pi.status = GNUNET_FS_STATUS_SEARCH_CONTINUED; - sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc); + sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, &search_result_resume_probes, sc); } @@ -1520,7 +1527,7 @@ search_result_stop (void *cls, const struct GNUNET_HashCode * key, void *value) pi.value.search.specifics.result_stopped.cctx = sr->client_info; pi.value.search.specifics.result_stopped.meta = sr->meta; pi.value.search.specifics.result_stopped.uri = sr->uri; - sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc); + sr->client_info = GNUNET_FS_search_make_status_ (&pi, sr->h, sc); return GNUNET_OK; } @@ -1588,7 +1595,7 @@ GNUNET_FS_search_stop (struct GNUNET_FS_SearchContext *sc) GNUNET_free (sc->serialization); } pi.status = GNUNET_FS_STATUS_SEARCH_STOPPED; - sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc); + sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); GNUNET_break (NULL == sc->client_info); if (GNUNET_SCHEDULER_NO_TASK != sc->task) GNUNET_SCHEDULER_cancel (sc->task); -- cgit v1.2.3