Skip to content

Commit 054f5ed

Browse files
committed
Speed up resolving a fixed number of streams
Previously, the completion criterion was check with each resolve wave (i.e. all 0.5 seconds), even if all needed streams had already been found. This commit checks whenever a new stream is found so stream resolution can finish as soon as all stream are found.
1 parent a21d816 commit 054f5ed

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

src/resolve_attempt_udp.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,10 @@ void resolve_attempt_udp::handle_receive_outcome(err_t err, std::size_t len) {
136136
stored_info.v6address(remote_endpoint_.address().to_string());
137137
}
138138
}
139+
// prepone the next cancellation check, i.e. when all needed streams are found,
140+
// cancel immediately rather than when a wave timer is due half a second later
141+
if (resolver_.check_cancellation_criteria())
142+
resolver_.cancel_ongoing_resolve();
139143
}
140144
} catch (std::exception &e) {
141145
LOG_F(WARNING, "resolve_attempt_udp: hiccup while processing the received data: %s",

src/resolver_impl.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -170,13 +170,7 @@ std::vector<stream_info_impl> resolver_impl::results(uint32_t max_results) {
170170
// === timer-driven async handlers ===
171171

172172
void resolver_impl::next_resolve_wave() {
173-
std::size_t num_results = 0;
174-
{
175-
std::lock_guard<std::mutex> lock(results_mut_);
176-
num_results = results_.size();
177-
}
178-
if (cancelled_ || expired_ ||
179-
(minimum_ && (num_results >= (std::size_t)minimum_) && lsl_clock() >= wait_until_)) {
173+
if (check_cancellation_criteria()) {
180174
// stopping criteria satisfied: cancel the ongoing operations
181175
cancel_ongoing_resolve();
182176
} else {
@@ -244,6 +238,19 @@ void resolver_impl::cancel() {
244238
cancel_ongoing_resolve();
245239
}
246240

241+
bool resolver_impl::check_cancellation_criteria()
242+
{
243+
std::size_t num_results = 0;
244+
{
245+
std::lock_guard<std::mutex> lock(results_mut_);
246+
num_results = results_.size();
247+
}
248+
if (cancelled_ || expired_) return true;
249+
if (minimum_ && (num_results >= (std::size_t)minimum_) && lsl_clock() >= wait_until_)
250+
return true;
251+
return false;
252+
}
253+
247254
void resolver_impl::cancel_ongoing_resolve() {
248255
// make sure that ongoing handler loops terminate
249256
expired_ = true;

src/resolver_impl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ class resolver_impl : public cancellable_registry {
140140
/// Start a new resolver attempt on the known peers.
141141
void udp_unicast_burst(err_t err);
142142

143+
/// Check if cancellation criteria (minimum number of results, timeout) are met
144+
bool check_cancellation_criteria();
145+
143146
/// Cancel the currently ongoing resolve, if any.
144147
void cancel_ongoing_resolve();
145148

0 commit comments

Comments
 (0)