diff options
author | Christian Grothoff <christian@grothoff.org> | 2014-12-24 01:10:47 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2014-12-24 01:10:47 +0000 |
commit | f1f603c7d0b3f03dca46a4f313472288eb080eb1 (patch) | |
tree | 3a29966b02dfb83e0a8a8d5c42b3116380209fb0 /src/fs/fs_search.c | |
parent | 53cd5b8eda2fa8db86b0907a62a39598981d008a (diff) | |
download | gnunet-f1f603c7d0b3f03dca46a4f313472288eb080eb1.tar.gz gnunet-f1f603c7d0b3f03dca46a4f313472288eb080eb1.zip |
making GNUNET_SCHEDULER_cancel() perform in O(1) instead of O(n) to help or even fully address #3247
Diffstat (limited to 'src/fs/fs_search.c')
-rw-r--r-- | src/fs/fs_search.c | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/src/fs/fs_search.c b/src/fs/fs_search.c index c85d6d3df..8f640009a 100644 --- a/src/fs/fs_search.c +++ b/src/fs/fs_search.c | |||
@@ -223,7 +223,7 @@ probe_failure_handler (void *cls, | |||
223 | { | 223 | { |
224 | struct GNUNET_FS_SearchResult *sr = cls; | 224 | struct GNUNET_FS_SearchResult *sr = cls; |
225 | 225 | ||
226 | sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK; | 226 | sr->probe_cancel_task = NULL; |
227 | sr->availability_trials++; | 227 | sr->availability_trials++; |
228 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); | 228 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); |
229 | sr->probe_ctx = NULL; | 229 | sr->probe_ctx = NULL; |
@@ -249,7 +249,7 @@ probe_success_handler (void *cls, | |||
249 | { | 249 | { |
250 | struct GNUNET_FS_SearchResult *sr = cls; | 250 | struct GNUNET_FS_SearchResult *sr = cls; |
251 | 251 | ||
252 | sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK; | 252 | sr->probe_cancel_task = NULL; |
253 | sr->availability_trials++; | 253 | sr->availability_trials++; |
254 | sr->availability_success++; | 254 | sr->availability_success++; |
255 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); | 255 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); |
@@ -303,34 +303,34 @@ GNUNET_FS_search_probe_progress_ (void *cls, | |||
303 | /* ignore */ | 303 | /* ignore */ |
304 | break; | 304 | break; |
305 | case GNUNET_FS_STATUS_DOWNLOAD_ERROR: | 305 | case GNUNET_FS_STATUS_DOWNLOAD_ERROR: |
306 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) | 306 | if (NULL != sr->probe_cancel_task) |
307 | { | 307 | { |
308 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); | 308 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); |
309 | sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK; | 309 | sr->probe_cancel_task = NULL; |
310 | } | 310 | } |
311 | sr->probe_cancel_task = | 311 | sr->probe_cancel_task = |
312 | GNUNET_SCHEDULER_add_delayed (sr->remaining_probe_time, | 312 | GNUNET_SCHEDULER_add_delayed (sr->remaining_probe_time, |
313 | &probe_failure_handler, sr); | 313 | &probe_failure_handler, sr); |
314 | break; | 314 | break; |
315 | case GNUNET_FS_STATUS_DOWNLOAD_COMPLETED: | 315 | case GNUNET_FS_STATUS_DOWNLOAD_COMPLETED: |
316 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) | 316 | if (NULL != sr->probe_cancel_task) |
317 | { | 317 | { |
318 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); | 318 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); |
319 | sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK; | 319 | sr->probe_cancel_task = NULL; |
320 | } | 320 | } |
321 | sr->probe_cancel_task = | 321 | sr->probe_cancel_task = |
322 | GNUNET_SCHEDULER_add_now (&probe_success_handler, sr); | 322 | GNUNET_SCHEDULER_add_now (&probe_success_handler, sr); |
323 | break; | 323 | break; |
324 | case GNUNET_FS_STATUS_DOWNLOAD_STOPPED: | 324 | case GNUNET_FS_STATUS_DOWNLOAD_STOPPED: |
325 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) | 325 | if (NULL != sr->probe_cancel_task) |
326 | { | 326 | { |
327 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); | 327 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); |
328 | sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK; | 328 | sr->probe_cancel_task = NULL; |
329 | } | 329 | } |
330 | sr = NULL; | 330 | sr = NULL; |
331 | break; | 331 | break; |
332 | case GNUNET_FS_STATUS_DOWNLOAD_ACTIVE: | 332 | case GNUNET_FS_STATUS_DOWNLOAD_ACTIVE: |
333 | if (GNUNET_SCHEDULER_NO_TASK == sr->probe_cancel_task) | 333 | if (NULL == sr->probe_cancel_task) |
334 | { | 334 | { |
335 | sr->probe_active_time = GNUNET_TIME_absolute_get (); | 335 | sr->probe_active_time = GNUNET_TIME_absolute_get (); |
336 | sr->probe_cancel_task = | 336 | sr->probe_cancel_task = |
@@ -339,10 +339,10 @@ GNUNET_FS_search_probe_progress_ (void *cls, | |||
339 | } | 339 | } |
340 | break; | 340 | break; |
341 | case GNUNET_FS_STATUS_DOWNLOAD_INACTIVE: | 341 | case GNUNET_FS_STATUS_DOWNLOAD_INACTIVE: |
342 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) | 342 | if (NULL != sr->probe_cancel_task) |
343 | { | 343 | { |
344 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); | 344 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); |
345 | sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK; | 345 | sr->probe_cancel_task = NULL; |
346 | } | 346 | } |
347 | dur = GNUNET_TIME_absolute_get_duration (sr->probe_active_time); | 347 | dur = GNUNET_TIME_absolute_get_duration (sr->probe_active_time); |
348 | sr->remaining_probe_time = | 348 | sr->remaining_probe_time = |
@@ -396,7 +396,7 @@ start_probe_ping_task (struct GNUNET_FS_SearchResult *sr) | |||
396 | GNUNET_CONTAINER_DLL_insert (h->probes_head, | 396 | GNUNET_CONTAINER_DLL_insert (h->probes_head, |
397 | h->probes_tail, | 397 | h->probes_tail, |
398 | sr); | 398 | sr); |
399 | if (GNUNET_SCHEDULER_NO_TASK == h->probe_ping_task) | 399 | if (NULL == h->probe_ping_task) |
400 | h->probe_ping_task | 400 | h->probe_ping_task |
401 | = GNUNET_SCHEDULER_add_now (&probe_ping_task_cb, | 401 | = GNUNET_SCHEDULER_add_now (&probe_ping_task_cb, |
402 | h); | 402 | h); |
@@ -419,7 +419,7 @@ GNUNET_FS_stop_probe_ping_task_ (struct GNUNET_FS_SearchResult *sr) | |||
419 | if (NULL == h->probes_head) | 419 | if (NULL == h->probes_head) |
420 | { | 420 | { |
421 | GNUNET_SCHEDULER_cancel (h->probe_ping_task); | 421 | GNUNET_SCHEDULER_cancel (h->probe_ping_task); |
422 | h->probe_ping_task = GNUNET_SCHEDULER_NO_TASK; | 422 | h->probe_ping_task = NULL; |
423 | } | 423 | } |
424 | } | 424 | } |
425 | 425 | ||
@@ -520,10 +520,10 @@ GNUNET_FS_search_stop_probe_ (struct GNUNET_FS_SearchResult *sr) | |||
520 | sr->probe_ctx = NULL; | 520 | sr->probe_ctx = NULL; |
521 | GNUNET_FS_stop_probe_ping_task_ (sr); | 521 | GNUNET_FS_stop_probe_ping_task_ (sr); |
522 | } | 522 | } |
523 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) | 523 | if (NULL != sr->probe_cancel_task) |
524 | { | 524 | { |
525 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); | 525 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); |
526 | sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK; | 526 | sr->probe_cancel_task = NULL; |
527 | } | 527 | } |
528 | } | 528 | } |
529 | 529 | ||
@@ -1253,7 +1253,7 @@ do_reconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
1253 | struct GNUNET_FS_SearchContext *sc = cls; | 1253 | struct GNUNET_FS_SearchContext *sc = cls; |
1254 | struct GNUNET_CLIENT_Connection *client; | 1254 | struct GNUNET_CLIENT_Connection *client; |
1255 | 1255 | ||
1256 | sc->task = GNUNET_SCHEDULER_NO_TASK; | 1256 | sc->task = NULL; |
1257 | client = GNUNET_CLIENT_connect ("fs", sc->h->cfg); | 1257 | client = GNUNET_CLIENT_connect ("fs", sc->h->cfg); |
1258 | if (NULL == client) | 1258 | if (NULL == client) |
1259 | { | 1259 | { |
@@ -1446,10 +1446,10 @@ search_result_freeze_probes (void *cls, | |||
1446 | sr->probe_ctx = NULL; | 1446 | sr->probe_ctx = NULL; |
1447 | GNUNET_FS_stop_probe_ping_task_ (sr); | 1447 | GNUNET_FS_stop_probe_ping_task_ (sr); |
1448 | } | 1448 | } |
1449 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) | 1449 | if (NULL != sr->probe_cancel_task) |
1450 | { | 1450 | { |
1451 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); | 1451 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); |
1452 | sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK; | 1452 | sr->probe_cancel_task = NULL; |
1453 | } | 1453 | } |
1454 | if (NULL != sr->update_search) | 1454 | if (NULL != sr->update_search) |
1455 | GNUNET_FS_search_pause (sr->update_search); | 1455 | GNUNET_FS_search_pause (sr->update_search); |
@@ -1545,10 +1545,10 @@ GNUNET_FS_search_signal_suspend_ (void *cls) | |||
1545 | pi.status = GNUNET_FS_STATUS_SEARCH_SUSPEND; | 1545 | pi.status = GNUNET_FS_STATUS_SEARCH_SUSPEND; |
1546 | sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); | 1546 | sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); |
1547 | GNUNET_break (NULL == sc->client_info); | 1547 | GNUNET_break (NULL == sc->client_info); |
1548 | if (sc->task != GNUNET_SCHEDULER_NO_TASK) | 1548 | if (sc->task != NULL) |
1549 | { | 1549 | { |
1550 | GNUNET_SCHEDULER_cancel (sc->task); | 1550 | GNUNET_SCHEDULER_cancel (sc->task); |
1551 | sc->task = GNUNET_SCHEDULER_NO_TASK; | 1551 | sc->task = NULL; |
1552 | } | 1552 | } |
1553 | if (NULL != sc->client) | 1553 | if (NULL != sc->client) |
1554 | { | 1554 | { |
@@ -1609,10 +1609,10 @@ GNUNET_FS_search_pause (struct GNUNET_FS_SearchContext *sc) | |||
1609 | { | 1609 | { |
1610 | struct GNUNET_FS_ProgressInfo pi; | 1610 | struct GNUNET_FS_ProgressInfo pi; |
1611 | 1611 | ||
1612 | if (GNUNET_SCHEDULER_NO_TASK != sc->task) | 1612 | if (NULL != sc->task) |
1613 | { | 1613 | { |
1614 | GNUNET_SCHEDULER_cancel (sc->task); | 1614 | GNUNET_SCHEDULER_cancel (sc->task); |
1615 | sc->task = GNUNET_SCHEDULER_NO_TASK; | 1615 | sc->task = NULL; |
1616 | } | 1616 | } |
1617 | if (NULL != sc->client) | 1617 | if (NULL != sc->client) |
1618 | GNUNET_CLIENT_disconnect (sc->client); | 1618 | GNUNET_CLIENT_disconnect (sc->client); |
@@ -1636,7 +1636,7 @@ GNUNET_FS_search_continue (struct GNUNET_FS_SearchContext *sc) | |||
1636 | struct GNUNET_FS_ProgressInfo pi; | 1636 | struct GNUNET_FS_ProgressInfo pi; |
1637 | 1637 | ||
1638 | GNUNET_assert (NULL == sc->client); | 1638 | GNUNET_assert (NULL == sc->client); |
1639 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == sc->task); | 1639 | GNUNET_assert (NULL == sc->task); |
1640 | do_reconnect (sc, NULL); | 1640 | do_reconnect (sc, NULL); |
1641 | GNUNET_FS_search_sync_ (sc); | 1641 | GNUNET_FS_search_sync_ (sc); |
1642 | pi.status = GNUNET_FS_STATUS_SEARCH_CONTINUED; | 1642 | pi.status = GNUNET_FS_STATUS_SEARCH_CONTINUED; |
@@ -1721,7 +1721,7 @@ search_result_free (void *cls, | |||
1721 | GNUNET_assert (NULL == sr->update_search); | 1721 | GNUNET_assert (NULL == sr->update_search); |
1722 | } | 1722 | } |
1723 | GNUNET_break (NULL == sr->probe_ctx); | 1723 | GNUNET_break (NULL == sr->probe_ctx); |
1724 | GNUNET_break (GNUNET_SCHEDULER_NO_TASK == sr->probe_cancel_task); | 1724 | GNUNET_break (NULL == sr->probe_cancel_task); |
1725 | GNUNET_break (NULL == sr->client_info); | 1725 | GNUNET_break (NULL == sr->client_info); |
1726 | GNUNET_free_non_null (sr->serialization); | 1726 | GNUNET_free_non_null (sr->serialization); |
1727 | GNUNET_FS_uri_destroy (sr->uri); | 1727 | GNUNET_FS_uri_destroy (sr->uri); |
@@ -1766,7 +1766,7 @@ GNUNET_FS_search_stop (struct GNUNET_FS_SearchContext *sc) | |||
1766 | pi.status = GNUNET_FS_STATUS_SEARCH_STOPPED; | 1766 | pi.status = GNUNET_FS_STATUS_SEARCH_STOPPED; |
1767 | sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); | 1767 | sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc->h, sc); |
1768 | GNUNET_break (NULL == sc->client_info); | 1768 | GNUNET_break (NULL == sc->client_info); |
1769 | if (GNUNET_SCHEDULER_NO_TASK != sc->task) | 1769 | if (NULL != sc->task) |
1770 | GNUNET_SCHEDULER_cancel (sc->task); | 1770 | GNUNET_SCHEDULER_cancel (sc->task); |
1771 | if (NULL != sc->client) | 1771 | if (NULL != sc->client) |
1772 | GNUNET_CLIENT_disconnect (sc->client); | 1772 | GNUNET_CLIENT_disconnect (sc->client); |