aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2013-05-30 13:04:02 +0000
committerChristian Grothoff <christian@grothoff.org>2013-05-30 13:04:02 +0000
commite80a0f007995572e8b1ab167de88b0a547841828 (patch)
tree46dc959ed7dbc53685f222fd8a3c6a381c9f3d44
parentb37045470834cf349c8bdf31938823809e67bfb5 (diff)
downloadgnunet-e80a0f007995572e8b1ab167de88b0a547841828.tar.gz
gnunet-e80a0f007995572e8b1ab167de88b0a547841828.zip
-preparations for fixing #2711
-rw-r--r--src/fs/fs_api.c11
-rw-r--r--src/fs/fs_api.h15
-rw-r--r--src/fs/fs_search.c47
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)
1965 uris = NULL; 1965 uris = NULL;
1966 if (NULL == sr->serialization) 1966 if (NULL == sr->serialization)
1967 sr->serialization = 1967 sr->serialization =
1968 make_serialization_file_name_in_dir (sr->sc->h, 1968 make_serialization_file_name_in_dir (sr->h,
1969 (sr->sc->psearch_result == 1969 (sr->sc->psearch_result ==
1970 NULL) ? 1970 NULL) ?
1971 GNUNET_FS_SYNC_PATH_MASTER_SEARCH : 1971 GNUNET_FS_SYNC_PATH_MASTER_SEARCH :
@@ -1973,7 +1973,7 @@ GNUNET_FS_search_result_sync_ (struct GNUNET_FS_SearchResult *sr)
1973 sr->sc->serialization); 1973 sr->sc->serialization);
1974 if (NULL == sr->serialization) 1974 if (NULL == sr->serialization)
1975 return; 1975 return;
1976 wh = get_write_handle_in_dir (sr->sc->h, 1976 wh = get_write_handle_in_dir (sr->h,
1977 (sr->sc->psearch_result == 1977 (sr->sc->psearch_result ==
1978 NULL) ? GNUNET_FS_SYNC_PATH_MASTER_SEARCH : 1978 NULL) ? GNUNET_FS_SYNC_PATH_MASTER_SEARCH :
1979 GNUNET_FS_SYNC_PATH_CHILD_SEARCH, 1979 GNUNET_FS_SYNC_PATH_CHILD_SEARCH,
@@ -2023,7 +2023,7 @@ cleanup:
2023 GNUNET_free_non_null (uris); 2023 GNUNET_free_non_null (uris);
2024 if (NULL != wh) 2024 if (NULL != wh)
2025 (void) GNUNET_BIO_write_close (wh); 2025 (void) GNUNET_BIO_write_close (wh);
2026 remove_sync_file_in_dir (sr->sc->h, 2026 remove_sync_file_in_dir (sr->h,
2027 (NULL == sr->sc->psearch_result) 2027 (NULL == sr->sc->psearch_result)
2028 ? GNUNET_FS_SYNC_PATH_MASTER_SEARCH 2028 ? GNUNET_FS_SYNC_PATH_MASTER_SEARCH
2029 : GNUNET_FS_SYNC_PATH_CHILD_SEARCH, 2029 : GNUNET_FS_SYNC_PATH_CHILD_SEARCH,
@@ -2322,6 +2322,7 @@ deserialize_search_result (void *cls, const char *filename)
2322 download = NULL; 2322 download = NULL;
2323 update_srch = NULL; 2323 update_srch = NULL;
2324 sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult)); 2324 sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult));
2325 sr->h = sc->h;
2325 sr->sc = sc; 2326 sr->sc = sc;
2326 sr->serialization = ser; 2327 sr->serialization = ser;
2327 if ((GNUNET_OK != GNUNET_BIO_read_string (rh, "result-uri", &uris, 10 * 1024)) 2328 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
2485 sr->availability_trials; 2486 sr->availability_trials;
2486 pi.value.search.specifics.resume_result.applicability_rank = 2487 pi.value.search.specifics.resume_result.applicability_rank =
2487 sr->optional_support; 2488 sr->optional_support;
2488 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc); 2489 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc);
2489 } 2490 }
2490 if (NULL != sr->download) 2491 if (NULL != sr->download)
2491 { 2492 {
@@ -2761,7 +2762,7 @@ signal_search_resume (struct GNUNET_FS_SearchContext *sc)
2761 pi.value.search.specifics.resume.message = sc->emsg; 2762 pi.value.search.specifics.resume.message = sc->emsg;
2762 pi.value.search.specifics.resume.is_paused = 2763 pi.value.search.specifics.resume.is_paused =
2763 (NULL == sc->client) ? GNUNET_YES : GNUNET_NO; 2764 (NULL == sc->client) ? GNUNET_YES : GNUNET_NO;
2764 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc); 2765 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc);
2765 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, 2766 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map,
2766 &signal_result_resume, sc); 2767 &signal_result_resume, sc);
2767 2768
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
510}; 510};
511 511
512 512
513
514
515/** 513/**
516 * Information we store for each search result. 514 * Information we store for each search result.
517 */ 515 */
@@ -519,7 +517,13 @@ struct GNUNET_FS_SearchResult
519{ 517{
520 518
521 /** 519 /**
522 * Search context this result belongs to. 520 * File-sharing context this result belongs to.
521 */
522 struct GNUNET_FS_Handle *h;
523
524 /**
525 * Search context this result belongs to; can be NULL
526 * for probes that come from a directory result.
523 */ 527 */
524 struct GNUNET_FS_SearchContext *sc; 528 struct GNUNET_FS_SearchContext *sc;
525 529
@@ -819,11 +823,13 @@ GNUNET_FS_unindex_make_status_ (struct GNUNET_FS_ProgressInfo *pi,
819 * call the callback. 823 * call the callback.
820 * 824 *
821 * @param pi structure to fill in 825 * @param pi structure to fill in
826 * @param h file-sharing handle
822 * @param sc overall search context 827 * @param sc overall search context
823 * @return value returned by the callback 828 * @return value returned by the callback
824 */ 829 */
825void * 830void *
826GNUNET_FS_search_make_status_ (struct GNUNET_FS_ProgressInfo *pi, 831GNUNET_FS_search_make_status_ (struct GNUNET_FS_ProgressInfo *pi,
832 struct GNUNET_FS_Handle *h,
827 struct GNUNET_FS_SearchContext *sc); 833 struct GNUNET_FS_SearchContext *sc);
828 834
829 835
@@ -1992,6 +1998,9 @@ struct NamespaceUpdateNode
1992}; 1998};
1993 1999
1994 2000
2001/**
2002 * Handle to one of our namespaces.
2003 */
1995struct GNUNET_FS_Namespace 2004struct GNUNET_FS_Namespace
1996{ 2005{
1997 2006
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 @@
39 * call the callback. 39 * call the callback.
40 * 40 *
41 * @param pi structure to fill in 41 * @param pi structure to fill in
42 * @param h file-sharing handle
42 * @param sc overall search context 43 * @param sc overall search context
43 * @return value returned by the callback 44 * @return value returned by the callback
44 */ 45 */
45void * 46void *
46GNUNET_FS_search_make_status_ (struct GNUNET_FS_ProgressInfo *pi, 47GNUNET_FS_search_make_status_ (struct GNUNET_FS_ProgressInfo *pi,
48 struct GNUNET_FS_Handle *h,
47 struct GNUNET_FS_SearchContext *sc) 49 struct GNUNET_FS_SearchContext *sc)
48{ 50{
49 void *ret; 51 void *ret;
50 52
51 pi->value.search.sc = sc; 53 pi->value.search.sc = sc;
52 pi->value.search.cctx = sc->client_info; 54 pi->value.search.cctx = (NULL != sc) ? sc->client_info : NULL;
53 pi->value.search.pctx = 55 pi->value.search.pctx =
54 (NULL == sc->psearch_result) ? NULL : sc->psearch_result->client_info; 56 ((NULL == sc) || (NULL == sc->psearch_result))
55 pi->value.search.query = sc->uri; 57 ? NULL
56 pi->value.search.duration = 58 : sc->psearch_result->client_info;
57 GNUNET_TIME_absolute_get_duration (sc->start_time); 59 pi->value.search.query = (NULL != sc) ? sc->uri : NULL;
58 pi->value.search.anonymity = sc->anonymity; 60 pi->value.search.duration = (NULL != sc)
59 ret = sc->h->upcb (sc->h->upcb_cls, pi); 61 ? GNUNET_TIME_absolute_get_duration (sc->start_time)
62 : GNUNET_TIME_UNIT_ZERO;
63 pi->value.search.anonymity = (NULL != sc) ? sc->anonymity : 0;
64 ret = h->upcb (h->upcb_cls, pi);
60 return ret; 65 return ret;
61} 66}
62 67
@@ -102,7 +107,7 @@ notify_client_chk_result (struct GNUNET_FS_SearchContext *sc,
102 pi.value.search.specifics.result.uri = sr->uri; 107 pi.value.search.specifics.result.uri = sr->uri;
103 pi.value.search.specifics.result.result = sr; 108 pi.value.search.specifics.result.result = sr;
104 pi.value.search.specifics.result.applicability_rank = sr->optional_support; 109 pi.value.search.specifics.result.applicability_rank = sr->optional_support;
105 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc); 110 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc);
106} 111}
107 112
108 113
@@ -130,7 +135,7 @@ notify_client_chk_update (struct GNUNET_FS_SearchContext *sc,
130 pi.value.search.specifics.update.applicability_rank = sr->optional_support; 135 pi.value.search.specifics.update.applicability_rank = sr->optional_support;
131 pi.value.search.specifics.update.current_probe_time 136 pi.value.search.specifics.update.current_probe_time
132 = GNUNET_TIME_absolute_get_duration (sr->probe_active_time); 137 = GNUNET_TIME_absolute_get_duration (sr->probe_active_time);
133 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc); 138 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc);
134} 139}
135 140
136 141
@@ -194,7 +199,7 @@ signal_probe_result (struct GNUNET_FS_SearchResult *sr)
194 pi.value.search.specifics.update.applicability_rank = sr->optional_support; 199 pi.value.search.specifics.update.applicability_rank = sr->optional_support;
195 pi.value.search.specifics.update.current_probe_time 200 pi.value.search.specifics.update.current_probe_time
196 = GNUNET_TIME_absolute_get_duration (sr->probe_active_time); 201 = GNUNET_TIME_absolute_get_duration (sr->probe_active_time);
197 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sr->sc); 202 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sr->h, sr->sc);
198 GNUNET_FS_search_start_probe_ (sr); 203 GNUNET_FS_search_start_probe_ (sr);
199} 204}
200 205
@@ -395,7 +400,7 @@ GNUNET_FS_search_start_probe_ (struct GNUNET_FS_SearchResult *sr)
395 return; 400 return;
396 if (NULL != sr->download) 401 if (NULL != sr->download)
397 return; 402 return;
398 if (0 == (sr->sc->h->flags & GNUNET_FS_FLAGS_DO_PROBES)) 403 if (0 == (sr->h->flags & GNUNET_FS_FLAGS_DO_PROBES))
399 return; 404 return;
400 if (sr->availability_trials > AVAILABILITY_TRIALS_MAX) 405 if (sr->availability_trials > AVAILABILITY_TRIALS_MAX)
401 return; 406 return;
@@ -420,10 +425,10 @@ GNUNET_FS_search_start_probe_ (struct GNUNET_FS_SearchResult *sr)
420 (unsigned long long) off, 425 (unsigned long long) off,
421 sr); 426 sr);
422 sr->remaining_probe_time = 427 sr->remaining_probe_time =
423 GNUNET_TIME_relative_multiply (sr->sc->h->avg_block_latency, 428 GNUNET_TIME_relative_multiply (sr->h->avg_block_latency,
424 2 * (1 + sr->availability_trials)); 429 2 * (1 + sr->availability_trials));
425 sr->probe_ctx = 430 sr->probe_ctx =
426 GNUNET_FS_download_start (sr->sc->h, sr->uri, sr->meta, NULL, NULL, off, 431 GNUNET_FS_download_start (sr->h, sr->uri, sr->meta, NULL, NULL, off,
427 len, sr->sc->anonymity, 432 len, sr->sc->anonymity,
428 GNUNET_FS_DOWNLOAD_NO_TEMPORARIES | 433 GNUNET_FS_DOWNLOAD_NO_TEMPORARIES |
429 GNUNET_FS_DOWNLOAD_IS_PROBE, sr, NULL); 434 GNUNET_FS_DOWNLOAD_IS_PROBE, sr, NULL);
@@ -473,6 +478,7 @@ process_ksk_result (struct GNUNET_FS_SearchContext *sc,
473 if (NULL == sr) 478 if (NULL == sr)
474 { 479 {
475 sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult)); 480 sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult));
481 sr->h = sc->h;
476 sr->sc = sc; 482 sr->sc = sc;
477 sr->uri = GNUNET_FS_uri_dup (uri); 483 sr->uri = GNUNET_FS_uri_dup (uri);
478 sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); 484 sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta);
@@ -552,6 +558,7 @@ process_sks_result (struct GNUNET_FS_SearchContext *sc, const char *id_update,
552 (void *) uri)) 558 (void *) uri))
553 return; /* duplicate result */ 559 return; /* duplicate result */
554 sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult)); 560 sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult));
561 sr->h = sc->h;
555 sr->sc = sc; 562 sr->sc = sc;
556 sr->uri = GNUNET_FS_uri_dup (uri); 563 sr->uri = GNUNET_FS_uri_dup (uri);
557 sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); 564 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,
1191 } 1198 }
1192 GNUNET_FS_search_sync_ (sc); 1199 GNUNET_FS_search_sync_ (sc);
1193 pi.status = GNUNET_FS_STATUS_SEARCH_START; 1200 pi.status = GNUNET_FS_STATUS_SEARCH_START;
1194 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc); 1201 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc);
1195 return sc; 1202 return sc;
1196} 1203}
1197 1204
@@ -1342,7 +1349,7 @@ search_result_suspend (void *cls, const struct GNUNET_HashCode * key, void *valu
1342 pi.value.search.specifics.result_suspend.cctx = sr->client_info; 1349 pi.value.search.specifics.result_suspend.cctx = sr->client_info;
1343 pi.value.search.specifics.result_suspend.meta = sr->meta; 1350 pi.value.search.specifics.result_suspend.meta = sr->meta;
1344 pi.value.search.specifics.result_suspend.uri = sr->uri; 1351 pi.value.search.specifics.result_suspend.uri = sr->uri;
1345 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc); 1352 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc);
1346 GNUNET_break (NULL == sr->client_info); 1353 GNUNET_break (NULL == sr->client_info);
1347 GNUNET_free_non_null (sr->serialization); 1354 GNUNET_free_non_null (sr->serialization);
1348 GNUNET_FS_uri_destroy (sr->uri); 1355 GNUNET_FS_uri_destroy (sr->uri);
@@ -1375,7 +1382,7 @@ GNUNET_FS_search_signal_suspend_ (void *cls)
1375 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, 1382 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map,
1376 &search_result_suspend, sc); 1383 &search_result_suspend, sc);
1377 pi.status = GNUNET_FS_STATUS_SEARCH_SUSPEND; 1384 pi.status = GNUNET_FS_STATUS_SEARCH_SUSPEND;
1378 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc); 1385 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc);
1379 GNUNET_break (NULL == sc->client_info); 1386 GNUNET_break (NULL == sc->client_info);
1380 if (sc->task != GNUNET_SCHEDULER_NO_TASK) 1387 if (sc->task != GNUNET_SCHEDULER_NO_TASK)
1381 GNUNET_SCHEDULER_cancel (sc->task); 1388 GNUNET_SCHEDULER_cancel (sc->task);
@@ -1442,7 +1449,7 @@ GNUNET_FS_search_pause (struct GNUNET_FS_SearchContext *sc)
1442 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, 1449 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map,
1443 &search_result_freeze_probes, sc); 1450 &search_result_freeze_probes, sc);
1444 pi.status = GNUNET_FS_STATUS_SEARCH_PAUSED; 1451 pi.status = GNUNET_FS_STATUS_SEARCH_PAUSED;
1445 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc); 1452 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc);
1446} 1453}
1447 1454
1448 1455
@@ -1461,7 +1468,7 @@ GNUNET_FS_search_continue (struct GNUNET_FS_SearchContext *sc)
1461 do_reconnect (sc, NULL); 1468 do_reconnect (sc, NULL);
1462 GNUNET_FS_search_sync_ (sc); 1469 GNUNET_FS_search_sync_ (sc);
1463 pi.status = GNUNET_FS_STATUS_SEARCH_CONTINUED; 1470 pi.status = GNUNET_FS_STATUS_SEARCH_CONTINUED;
1464 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc); 1471 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc);
1465 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, 1472 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map,
1466 &search_result_resume_probes, sc); 1473 &search_result_resume_probes, sc);
1467} 1474}
@@ -1520,7 +1527,7 @@ search_result_stop (void *cls, const struct GNUNET_HashCode * key, void *value)
1520 pi.value.search.specifics.result_stopped.cctx = sr->client_info; 1527 pi.value.search.specifics.result_stopped.cctx = sr->client_info;
1521 pi.value.search.specifics.result_stopped.meta = sr->meta; 1528 pi.value.search.specifics.result_stopped.meta = sr->meta;
1522 pi.value.search.specifics.result_stopped.uri = sr->uri; 1529 pi.value.search.specifics.result_stopped.uri = sr->uri;
1523 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc); 1530 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sr->h, sc);
1524 return GNUNET_OK; 1531 return GNUNET_OK;
1525} 1532}
1526 1533
@@ -1588,7 +1595,7 @@ GNUNET_FS_search_stop (struct GNUNET_FS_SearchContext *sc)
1588 GNUNET_free (sc->serialization); 1595 GNUNET_free (sc->serialization);
1589 } 1596 }
1590 pi.status = GNUNET_FS_STATUS_SEARCH_STOPPED; 1597 pi.status = GNUNET_FS_STATUS_SEARCH_STOPPED;
1591 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc); 1598 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc);
1592 GNUNET_break (NULL == sc->client_info); 1599 GNUNET_break (NULL == sc->client_info);
1593 if (GNUNET_SCHEDULER_NO_TASK != sc->task) 1600 if (GNUNET_SCHEDULER_NO_TASK != sc->task)
1594 GNUNET_SCHEDULER_cancel (sc->task); 1601 GNUNET_SCHEDULER_cancel (sc->task);