summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLinus Färnstrand <linus@mullvad.net>2019-10-07 14:49:05 +0200
committerLinus Färnstrand <linus@mullvad.net>2019-10-07 16:24:41 +0200
commit28d3b6ec74dfb6fd063f5ffb572a2c48b944dc86 (patch)
tree64e78c002c21fae1c73e910aa696e94c3b29547d
parentdba796eeee5117a751dddebdc16cedc32df4b310 (diff)
downloadmullvadvpn-28d3b6ec74dfb6fd063f5ffb572a2c48b944dc86.tar.xz
mullvadvpn-28d3b6ec74dfb6fd063f5ffb572a2c48b944dc86.zip
Rewrite custom Future with loop{}
-rw-r--r--mullvad-daemon/src/version_check.rs78
1 files changed, 41 insertions, 37 deletions
diff --git a/mullvad-daemon/src/version_check.rs b/mullvad-daemon/src/version_check.rs
index 132eba77fc..5b318a881e 100644
--- a/mullvad-daemon/src/version_check.rs
+++ b/mullvad-daemon/src/version_check.rs
@@ -96,46 +96,50 @@ impl<F: Fn(&AppVersionInfo) + Send + 'static> Future for VersionUpdater<F> {
type Error = ();
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
- while let Some(new_state) = match &mut self.state {
- VersionUpdaterState::Sleeping(timer) => match timer.poll() {
- Err(e) => {
- log::error!("Version check sleep error: {}", e);
- return Err(());
- }
- Ok(Async::NotReady) => None,
- Ok(Async::Ready(())) => Some(if Instant::now() > self.next_update_time {
- VersionUpdaterState::Updating(self.create_update_future())
- } else {
- VersionUpdaterState::Sleeping(Self::create_sleep_future())
- }),
- },
- VersionUpdaterState::Updating(future) => match future.poll() {
- Err(error) => {
- log::error!("{}", error.display_chain_with_msg("Version check failed"));
- self.next_update_time = Instant::now() + UPDATE_INTERVAL_ERROR;
- Some(VersionUpdaterState::Sleeping(Self::create_sleep_future()))
- }
- Ok(Async::Ready(app_version_info)) => {
- if app_version_info != self.last_app_version_info {
- self.next_update_time = Instant::now() + UPDATE_INTERVAL;
- log::debug!("Got new version check: {:?}", app_version_info);
- (self.on_version_update)(&app_version_info);
- self.last_app_version_info = app_version_info;
- if let Err(e) = self.write_cache() {
- log::error!(
- "{}",
- e.display_chain_with_msg("Unable to cache version check response")
- );
+ loop {
+ let next_state = match &mut self.state {
+ VersionUpdaterState::Sleeping(timer) => match timer.poll() {
+ Ok(Async::NotReady) => return Ok(Async::NotReady),
+ Err(e) => {
+ log::error!("Version check sleep error: {}", e);
+ return Err(());
+ }
+ Ok(Async::Ready(())) => {
+ if Instant::now() > self.next_update_time {
+ VersionUpdaterState::Updating(self.create_update_future())
+ } else {
+ VersionUpdaterState::Sleeping(Self::create_sleep_future())
+ }
+ }
+ },
+ VersionUpdaterState::Updating(future) => match future.poll() {
+ Ok(Async::NotReady) => return Ok(Async::NotReady),
+ Err(error) => {
+ log::error!("{}", error.display_chain_with_msg("Version check failed"));
+ self.next_update_time = Instant::now() + UPDATE_INTERVAL_ERROR;
+ VersionUpdaterState::Sleeping(Self::create_sleep_future())
+ }
+ Ok(Async::Ready(app_version_info)) => {
+ if app_version_info != self.last_app_version_info {
+ self.next_update_time = Instant::now() + UPDATE_INTERVAL;
+ log::debug!("Got new version check: {:?}", app_version_info);
+ (self.on_version_update)(&app_version_info);
+ self.last_app_version_info = app_version_info;
+ if let Err(e) = self.write_cache() {
+ log::error!(
+ "{}",
+ e.display_chain_with_msg(
+ "Unable to cache version check response"
+ )
+ );
+ }
}
+ VersionUpdaterState::Sleeping(Self::create_sleep_future())
}
- Some(VersionUpdaterState::Sleeping(Self::create_sleep_future()))
- }
- Ok(Async::NotReady) => None,
- },
- } {
- self.state = new_state;
+ },
+ };
+ self.state = next_state;
}
- Ok(Async::NotReady)
}
}