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 | |
parent | b66f2c50a63b8d1242eb5583fd49b33abee4183c (diff) | |
download | gnunet-612f87ce7ff13706d291c441de26eaf15ded5199.tar.gz gnunet-612f87ce7ff13706d291c441de26eaf15ded5199.zip |
-signal to applications that a probe is active
Diffstat (limited to 'src')
-rw-r--r-- | src/fs/fs_api.h | 6 | ||||
-rw-r--r-- | src/fs/fs_download.c | 5 | ||||
-rw-r--r-- | src/fs/fs_search.c | 53 | ||||
-rw-r--r-- | src/include/gnunet_fs_service.h | 11 |
4 files changed, 75 insertions, 0 deletions
diff --git a/src/fs/fs_api.h b/src/fs/fs_api.h index d728c59a0..12d4ae44b 100644 --- a/src/fs/fs_api.h +++ b/src/fs/fs_api.h | |||
@@ -578,6 +578,12 @@ struct GNUNET_FS_SearchResult | |||
578 | GNUNET_SCHEDULER_TaskIdentifier probe_cancel_task; | 578 | GNUNET_SCHEDULER_TaskIdentifier probe_cancel_task; |
579 | 579 | ||
580 | /** | 580 | /** |
581 | * Task we use to report periodically to the application that the | ||
582 | * probe is still running. | ||
583 | */ | ||
584 | GNUNET_SCHEDULER_TaskIdentifier probe_ping_task; | ||
585 | |||
586 | /** | ||
581 | * When did the current probe become active? | 587 | * When did the current probe become active? |
582 | */ | 588 | */ |
583 | struct GNUNET_TIME_Absolute probe_active_time; | 589 | struct GNUNET_TIME_Absolute probe_active_time; |
diff --git a/src/fs/fs_download.c b/src/fs/fs_download.c index c4863fbd2..82fc39113 100644 --- a/src/fs/fs_download.c +++ b/src/fs/fs_download.c | |||
@@ -2241,6 +2241,11 @@ GNUNET_FS_download_start_from_search (struct GNUNET_FS_Handle *h, | |||
2241 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); | 2241 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); |
2242 | sr->probe_ctx = NULL; | 2242 | sr->probe_ctx = NULL; |
2243 | } | 2243 | } |
2244 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_ping_task) | ||
2245 | { | ||
2246 | GNUNET_SCHEDULER_cancel (sr->probe_ping_task); | ||
2247 | sr->probe_ping_task = GNUNET_SCHEDULER_NO_TASK; | ||
2248 | } | ||
2244 | return dc; | 2249 | return dc; |
2245 | } | 2250 | } |
2246 | 2251 | ||
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); |
diff --git a/src/include/gnunet_fs_service.h b/src/include/gnunet_fs_service.h index b35134313..08d5daba0 100644 --- a/src/include/gnunet_fs_service.h +++ b/src/include/gnunet_fs_service.h | |||
@@ -68,6 +68,12 @@ extern "C" | |||
68 | 68 | ||
69 | 69 | ||
70 | /** | 70 | /** |
71 | * How often do we signal applications that a probe for a particular | ||
72 | * search result is running? (used to visualize probes). | ||
73 | */ | ||
74 | #define GNUNET_FS_PROBE_UPDATE_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 100) | ||
75 | |||
76 | /** | ||
71 | * A Universal Resource Identifier (URI), opaque. | 77 | * A Universal Resource Identifier (URI), opaque. |
72 | */ | 78 | */ |
73 | struct GNUNET_FS_Uri; | 79 | struct GNUNET_FS_Uri; |
@@ -1269,6 +1275,11 @@ struct GNUNET_FS_ProgressInfo | |||
1269 | */ | 1275 | */ |
1270 | uint32_t applicability_rank; | 1276 | uint32_t applicability_rank; |
1271 | 1277 | ||
1278 | /** | ||
1279 | * How long has the current probe been active? | ||
1280 | */ | ||
1281 | struct GNUNET_TIME_Relative current_probe_time; | ||
1282 | |||
1272 | } update; | 1283 | } update; |
1273 | 1284 | ||
1274 | /** | 1285 | /** |