aboutsummaryrefslogtreecommitdiff
path: root/src/fs/fs_search.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-12-05 21:37:50 +0000
committerChristian Grothoff <christian@grothoff.org>2012-12-05 21:37:50 +0000
commit612f87ce7ff13706d291c441de26eaf15ded5199 (patch)
tree88d9edda55fd81ac556e9aec147c4701fac3bb05 /src/fs/fs_search.c
parentb66f2c50a63b8d1242eb5583fd49b33abee4183c (diff)
downloadgnunet-612f87ce7ff13706d291c441de26eaf15ded5199.tar.gz
gnunet-612f87ce7ff13706d291c441de26eaf15ded5199.zip
-signal to applications that a probe is active
Diffstat (limited to 'src/fs/fs_search.c')
-rw-r--r--src/fs/fs_search.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/fs/fs_search.c b/src/fs/fs_search.c
index 89a99ec03..3f0a4a374 100644
--- a/src/fs/fs_search.c
+++ b/src/fs/fs_search.c
@@ -129,6 +129,8 @@ notify_client_chk_update (struct GNUNET_FS_SearchContext *sc,
129 pi.value.search.specifics.update.availability_certainty = 129 pi.value.search.specifics.update.availability_certainty =
130 sr->availability_trials; 130 sr->availability_trials;
131 pi.value.search.specifics.update.applicability_rank = sr->optional_support; 131 pi.value.search.specifics.update.applicability_rank = sr->optional_support;
132 pi.value.search.specifics.update.current_probe_time
133 = GNUNET_TIME_absolute_get_duration (sr->probe_active_time);
132 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc); 134 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc);
133} 135}
134 136
@@ -191,6 +193,8 @@ signal_probe_result (struct GNUNET_FS_SearchResult *sr)
191 pi.value.search.specifics.update.availability_certainty 193 pi.value.search.specifics.update.availability_certainty
192 = sr->availability_trials; 194 = sr->availability_trials;
193 pi.value.search.specifics.update.applicability_rank = sr->optional_support; 195 pi.value.search.specifics.update.applicability_rank = sr->optional_support;
196 pi.value.search.specifics.update.current_probe_time
197 = GNUNET_TIME_absolute_get_duration (sr->probe_active_time);
194 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sr->sc); 198 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sr->sc);
195 GNUNET_FS_search_start_probe_ (sr); 199 GNUNET_FS_search_start_probe_ (sr);
196} 200}
@@ -211,6 +215,11 @@ probe_failure_handler (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
211 sr->availability_trials++; 215 sr->availability_trials++;
212 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); 216 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES);
213 sr->probe_ctx = NULL; 217 sr->probe_ctx = NULL;
218 if (GNUNET_SCHEDULER_NO_TASK != sr->probe_ping_task)
219 {
220 GNUNET_SCHEDULER_cancel (sr->probe_ping_task);
221 sr->probe_ping_task = GNUNET_SCHEDULER_NO_TASK;
222 }
214 GNUNET_FS_search_result_sync_ (sr); 223 GNUNET_FS_search_result_sync_ (sr);
215 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 224 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
216 "Probe #%u for search result %p failed\n", 225 "Probe #%u for search result %p failed\n",
@@ -236,6 +245,11 @@ probe_success_handler (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
236 sr->availability_success++; 245 sr->availability_success++;
237 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); 246 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES);
238 sr->probe_ctx = NULL; 247 sr->probe_ctx = NULL;
248 if (GNUNET_SCHEDULER_NO_TASK != sr->probe_ping_task)
249 {
250 GNUNET_SCHEDULER_cancel (sr->probe_ping_task);
251 sr->probe_ping_task = GNUNET_SCHEDULER_NO_TASK;
252 }
239 GNUNET_FS_search_result_sync_ (sr); 253 GNUNET_FS_search_result_sync_ (sr);
240 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 254 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
241 "Probe #%u for search result %p succeeded\n", 255 "Probe #%u for search result %p succeeded\n",
@@ -348,6 +362,26 @@ GNUNET_FS_search_probe_progress_ (void *cls,
348 362
349 363
350/** 364/**
365 * Task run periodically to remind clients that a probe is active.
366 *
367 * @param cls the 'struct GNUNET_FS_SearchResult' that we are probing for
368 * @param tc scheduler context
369 */
370static void
371probe_ping_task (void *cls,
372 const struct GNUNET_SCHEDULER_TaskContext *tc)
373{
374 struct GNUNET_FS_SearchResult *sr = cls;
375
376 signal_probe_result (sr);
377 sr->probe_ping_task
378 = GNUNET_SCHEDULER_add_delayed (GNUNET_FS_PROBE_UPDATE_FREQUENCY,
379 &probe_ping_task,
380 sr);
381}
382
383
384/**
351 * Start download probes for the given search result. 385 * Start download probes for the given search result.
352 * 386 *
353 * @param sr the search result 387 * @param sr the search result
@@ -394,6 +428,9 @@ GNUNET_FS_search_start_probe_ (struct GNUNET_FS_SearchResult *sr)
394 len, sr->sc->anonymity, 428 len, sr->sc->anonymity,
395 GNUNET_FS_DOWNLOAD_NO_TEMPORARIES | 429 GNUNET_FS_DOWNLOAD_NO_TEMPORARIES |
396 GNUNET_FS_DOWNLOAD_IS_PROBE, sr, NULL); 430 GNUNET_FS_DOWNLOAD_IS_PROBE, sr, NULL);
431 sr->probe_ping_task
432 = GNUNET_SCHEDULER_add_now (&probe_ping_task,
433 sr);
397} 434}
398 435
399 436
@@ -1307,6 +1344,11 @@ search_result_freeze_probes (void *cls, const struct GNUNET_HashCode * key,
1307 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); 1344 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES);
1308 sr->probe_ctx = NULL; 1345 sr->probe_ctx = NULL;
1309 } 1346 }
1347 if (GNUNET_SCHEDULER_NO_TASK != sr->probe_ping_task)
1348 {
1349 GNUNET_SCHEDULER_cancel (sr->probe_ping_task);
1350 sr->probe_ping_task = GNUNET_SCHEDULER_NO_TASK;
1351 }
1310 if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) 1352 if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task)
1311 { 1353 {
1312 GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); 1354 GNUNET_SCHEDULER_cancel (sr->probe_cancel_task);
@@ -1364,6 +1406,11 @@ search_result_suspend (void *cls, const struct GNUNET_HashCode * key, void *valu
1364 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); 1406 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES);
1365 sr->probe_ctx = NULL; 1407 sr->probe_ctx = NULL;
1366 } 1408 }
1409 if (GNUNET_SCHEDULER_NO_TASK != sr->probe_ping_task)
1410 {
1411 GNUNET_SCHEDULER_cancel (sr->probe_ping_task);
1412 sr->probe_ping_task = GNUNET_SCHEDULER_NO_TASK;
1413 }
1367 if (NULL != sr->update_search) 1414 if (NULL != sr->update_search)
1368 { 1415 {
1369 GNUNET_FS_search_signal_suspend_ (sr->update_search); 1416 GNUNET_FS_search_signal_suspend_ (sr->update_search);
@@ -1518,6 +1565,11 @@ search_result_stop (void *cls, const struct GNUNET_HashCode * key, void *value)
1518 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); 1565 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES);
1519 sr->probe_ctx = NULL; 1566 sr->probe_ctx = NULL;
1520 } 1567 }
1568 if (GNUNET_SCHEDULER_NO_TASK != sr->probe_ping_task)
1569 {
1570 GNUNET_SCHEDULER_cancel (sr->probe_ping_task);
1571 sr->probe_ping_task = GNUNET_SCHEDULER_NO_TASK;
1572 }
1521 if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) 1573 if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task)
1522 { 1574 {
1523 GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); 1575 GNUNET_SCHEDULER_cancel (sr->probe_cancel_task);
@@ -1571,6 +1623,7 @@ search_result_free (void *cls, const struct GNUNET_HashCode * key, void *value)
1571 } 1623 }
1572 GNUNET_break (NULL == sr->probe_ctx); 1624 GNUNET_break (NULL == sr->probe_ctx);
1573 GNUNET_break (GNUNET_SCHEDULER_NO_TASK == sr->probe_cancel_task); 1625 GNUNET_break (GNUNET_SCHEDULER_NO_TASK == sr->probe_cancel_task);
1626 GNUNET_break (GNUNET_SCHEDULER_NO_TASK == sr->probe_ping_task);
1574 GNUNET_break (NULL == sr->client_info); 1627 GNUNET_break (NULL == sr->client_info);
1575 GNUNET_free_non_null (sr->serialization); 1628 GNUNET_free_non_null (sr->serialization);
1576 GNUNET_FS_uri_destroy (sr->uri); 1629 GNUNET_FS_uri_destroy (sr->uri);