@@ -45,7 +45,7 @@ struct Dht::Announce {
45
45
bool permanent;
46
46
Sp<Value> value;
47
47
time_point created;
48
- DoneCallback callback ;
48
+ std::vector< DoneCallback> callbacks ;
49
49
};
50
50
51
51
struct Dht ::SearchNode {
@@ -442,8 +442,9 @@ struct Dht::Search {
442
442
g.second .done_cb = {};
443
443
}
444
444
for (auto & a : announce) {
445
- a.callback (false , {});
446
- a.callback = {};
445
+ for (auto & cb : a.callbacks )
446
+ cb (false , {});
447
+ a.callbacks .clear ();
447
448
}
448
449
}
449
450
@@ -627,7 +628,9 @@ struct Dht::Search {
627
628
return a.value ->id == value->id ;
628
629
});
629
630
if (a_sr == announce.end ()) {
630
- announce.emplace_back (Announce {permanent, value, created, callback});
631
+ auto & a = announce.emplace_back (Announce {permanent, value, created, {}} );
632
+ if (callback)
633
+ a.callbacks .emplace_back (std::move (callback));
631
634
for (auto & n : nodes) {
632
635
n->probe_query .reset ();
633
636
n->acked [value->id ].req .reset ();
@@ -641,18 +644,15 @@ struct Dht::Search {
641
644
n->acked [value->id ].req .reset ();
642
645
n->probe_query .reset ();
643
646
}
647
+ } else {
648
+ if (callback)
649
+ a_sr->callbacks .emplace_back (std::move (callback));
644
650
}
645
651
if (isAnnounced (value->id )) {
646
- if (a_sr->callback )
647
- a_sr->callback (true , {});
648
- a_sr->callback = {};
649
- if (callback)
650
- callback (true , {});
652
+ for (auto & cb: a_sr->callbacks )
653
+ cb (true , {});
654
+ a_sr->callbacks .clear ();
651
655
return ;
652
- } else {
653
- if (a_sr->callback )
654
- a_sr->callback (false , {});
655
- a_sr->callback = callback;
656
656
}
657
657
}
658
658
}
@@ -722,8 +722,8 @@ struct Dht::Search {
722
722
std::vector<DoneCallback> a_cbs;
723
723
a_cbs.reserve (announce.size ());
724
724
for (auto ait = announce.begin () ; ait != announce.end (); ) {
725
- if (ait->callback )
726
- a_cbs. emplace_back ( std::move ( ait->callback ) );
725
+ a_cbs. insert (a_cbs. end (), std::make_move_iterator (ait->callbacks . begin ()), std::make_move_iterator (ait-> callbacks . end ()));
726
+ ait->callbacks . clear ( );
727
727
if (not ait->permanent )
728
728
ait = announce.erase (ait);
729
729
else
@@ -747,9 +747,11 @@ struct Dht::Search {
747
747
if (vid != Value::INVALID_ID and (!a.value || a.value ->id != vid))
748
748
return true ;
749
749
if (isAnnounced (a.value ->id )) {
750
- if (a.callback ) {
751
- a.callback (true , getNodes ());
752
- a.callback = nullptr ;
750
+ if (!a.callbacks .empty ()) {
751
+ const auto & nodes = getNodes ();
752
+ for (auto & cb : a.callbacks )
753
+ cb (true , nodes);
754
+ a.callbacks .clear ();
753
755
}
754
756
if (not a.permanent )
755
757
return false ;
0 commit comments