diff options
author | Christian Grothoff <christian@grothoff.org> | 2012-12-05 21:37:50 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2012-12-05 21:37:50 +0000 |
commit | 612f87ce7ff13706d291c441de26eaf15ded5199 (patch) | |
tree | 88d9edda55fd81ac556e9aec147c4701fac3bb05 /src/fs/fs_search.c | |
parent | b66f2c50a63b8d1242eb5583fd49b33abee4183c (diff) | |
download | gnunet-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.c | 53 |
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 | */ | ||
370 | static void | ||
371 | probe_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); |