1313
1414using namespace lsl ;
1515using namespace lslboost ::asio;
16+ using err_t = const lslboost::system::error_code&;
1617
1718/* *
1819* Instantiate a new resolver and configure timing parameters.
@@ -83,7 +84,9 @@ std::vector<stream_info_impl> resolver_impl::resolve_oneshot(const std::string &
8384 // start a timer that cancels all outstanding IO operations and wave schedules after the timeout has expired
8485 if (timeout != FOREVER) {
8586 resolve_timeout_expired_.expires_after (timeout_sec (timeout));
86- resolve_timeout_expired_.async_wait (lslboost::bind (&resolver_impl::resolve_timeout_expired,this ,placeholders::error));
87+ resolve_timeout_expired_.async_wait ([this ](err_t err) {
88+ if (err != error::operation_aborted) cancel_ongoing_resolve ();
89+ });
8790 }
8891
8992 // start the first wave of resolve packets
@@ -148,17 +151,20 @@ void resolver_impl::next_resolve_wave() {
148151 } else {
149152 // start a new multicast wave
150153 udp_multicast_burst ();
154+
155+ auto wave_timer_timeout =
156+ (fast_mode_ ? 0 : cfg_->continuous_resolve_interval ()) + cfg_->multicast_min_rtt ();
151157 if (!ucast_endpoints_.empty ()) {
152- // we have known peer addresses: we spawn a unicast wave and shortly thereafter the next wave
158+ // we have known peer addresses: we spawn a unicast wave
153159 unicast_timer_.expires_after (timeout_sec (cfg_->multicast_min_rtt ()));
154- unicast_timer_.async_wait (lslboost::bind (&resolver_impl::udp_unicast_burst,this ,placeholders::error));
155- wave_timer_.expires_after (timeout_sec ((fast_mode_?0 :cfg_->continuous_resolve_interval ())+(cfg_->multicast_min_rtt ()+cfg_->unicast_min_rtt ())));
156- wave_timer_.async_wait (lslboost::bind (&resolver_impl::wave_timeout_expired,this ,placeholders::error));
157- } else {
158- // there are no known peer addresses; just set up the next wave
159- wave_timer_.expires_after (timeout_sec ((fast_mode_?0 :cfg_->continuous_resolve_interval ())+cfg_->multicast_min_rtt ()));
160- wave_timer_.async_wait (lslboost::bind (&resolver_impl::wave_timeout_expired,this ,placeholders::error));
160+ unicast_timer_.async_wait ([this ](err_t ec) { this ->udp_unicast_burst (ec); });
161+ // delay the next multicast wave
162+ wave_timer_timeout += cfg_->unicast_min_rtt ();
161163 }
164+ wave_timer_.expires_after (timeout_sec (wave_timer_timeout));
165+ wave_timer_.async_wait ([this ](err_t err) {
166+ if (err != error::operation_aborted) next_resolve_wave ();
167+ });
162168 }
163169}
164170
@@ -199,19 +205,6 @@ void resolver_impl::udp_unicast_burst(error_code err) {
199205 }
200206}
201207
202- // / This handler is called when the overall resolve timeout (if any) expires.
203- void resolver_impl::resolve_timeout_expired (error_code err) {
204- if (err != error::operation_aborted)
205- cancel_ongoing_resolve ();
206- }
207-
208- // / This handler is called when the wave timeout expires.
209- void resolver_impl::wave_timeout_expired (error_code err) {
210- if (err != error::operation_aborted)
211- next_resolve_wave ();
212- }
213-
214-
215208// === cancellation and teardown ===
216209
217210// / Cancel any ongoing operations and render the resolver unusable.
@@ -226,10 +219,10 @@ void resolver_impl::cancel_ongoing_resolve() {
226219 // make sure that ongoing handler loops terminate
227220 expired_ = true ;
228221 // timer fires: cancel the next wave schedule
229- post (*io_, lslboost::bind (&steady_timer::cancel, & wave_timer_) );
230- post (*io_, lslboost::bind (&steady_timer::cancel, & unicast_timer_) );
222+ post (*io_, [ this ]() { wave_timer_. cancel (); } );
223+ post (*io_, [ this ]() { unicast_timer_. cancel (); } );
231224 // and cancel the timeout, too
232- post (*io_, lslboost::bind (&steady_timer::cancel, & resolve_timeout_expired_) );
225+ post (*io_, [ this ]() { resolve_timeout_expired_. cancel (); } );
233226 // cancel all currently active resolve attempts
234227 cancel_all_registered ();
235228}
0 commit comments