aboutsummaryrefslogtreecommitdiff
path: root/src/fs/fs_search.c
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 /src/fs/fs_search.c
parentb37045470834cf349c8bdf31938823809e67bfb5 (diff)
downloadgnunet-e80a0f007995572e8b1ab167de88b0a547841828.tar.gz
gnunet-e80a0f007995572e8b1ab167de88b0a547841828.zip
-preparations for fixing #2711
Diffstat (limited to 'src/fs/fs_search.c')
-rw-r--r--src/fs/fs_search.c47
1 files changed, 27 insertions, 20 deletions
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);