Skip to content

Commit bb559d1

Browse files
authored
Fix SteamVR restart; restart only once for most settings (#1661)
1 parent 05a01a6 commit bb559d1

File tree

4 files changed

+224
-208
lines changed

4 files changed

+224
-208
lines changed

alvr/dashboard/src/dashboard/mod.rs

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use self::components::{
66
SetupWizard, SetupWizardRequest,
77
};
88
use crate::{dashboard::components::StatisticsTab, theme, DataSources};
9-
use alvr_common::RelaxedAtomic;
9+
use alvr_common::parking_lot::{Condvar, Mutex};
1010
use alvr_events::EventType;
1111
use alvr_packets::{PathValuePair, ServerRequest};
1212
use alvr_session::SessionDesc;
@@ -60,7 +60,8 @@ enum Tab {
6060
pub struct Dashboard {
6161
data_sources: DataSources,
6262
just_opened: bool,
63-
server_restarting: Arc<RelaxedAtomic>,
63+
server_restarting: Arc<Mutex<bool>>,
64+
server_restarting_condvar: Arc<Condvar>,
6465
selected_tab: Tab,
6566
tab_labels: BTreeMap<Tab, &'static str>,
6667
connections_tab: ConnectionsTab,
@@ -85,7 +86,8 @@ impl Dashboard {
8586
Self {
8687
data_sources,
8788
just_opened: true,
88-
server_restarting: Arc::new(RelaxedAtomic::new(false)),
89+
server_restarting: Arc::new(Mutex::new(false)),
90+
server_restarting_condvar: Arc::new(Condvar::new()),
8991
selected_tab: Tab::Connections,
9092
tab_labels: [
9193
(Tab::Connections, "🔌 Connections"),
@@ -109,6 +111,32 @@ impl Dashboard {
109111
session: SessionDesc::default(),
110112
}
111113
}
114+
115+
// This call may block
116+
fn restart_steamvr(&self, requests: &mut Vec<ServerRequest>) {
117+
requests.push(ServerRequest::RestartSteamvr);
118+
119+
let mut server_restarting_lock = self.server_restarting.lock();
120+
121+
if *server_restarting_lock {
122+
self.server_restarting_condvar
123+
.wait(&mut server_restarting_lock);
124+
}
125+
126+
*server_restarting_lock = true;
127+
128+
#[cfg(not(target_arch = "wasm32"))]
129+
std::thread::spawn({
130+
let server_restarting = Arc::clone(&self.server_restarting);
131+
let condvar = Arc::clone(&self.server_restarting_condvar);
132+
move || {
133+
crate::steamvr_launcher::LAUNCHER.lock().restart_steamvr();
134+
135+
*server_restarting.lock() = false;
136+
condvar.notify_one();
137+
}
138+
});
139+
}
112140
}
113141

114142
impl eframe::App for Dashboard {
@@ -146,28 +174,14 @@ impl eframe::App for Dashboard {
146174

147175
self.session = *session;
148176
}
149-
EventType::ServerRequestsSelfRestart => {
150-
if !self.server_restarting.value() {
151-
self.server_restarting.set(true);
152-
153-
#[cfg(not(target_arch = "wasm32"))]
154-
std::thread::spawn({
155-
let server_restarting = Arc::clone(&self.server_restarting);
156-
move || {
157-
crate::steamvr_launcher::LAUNCHER.lock().restart_steamvr();
158-
159-
server_restarting.set(false);
160-
}
161-
});
162-
}
163-
}
177+
EventType::ServerRequestsSelfRestart => self.restart_steamvr(&mut requests),
164178
EventType::AudioDevices(list) => self.settings_tab.update_audio_devices(list),
165179
EventType::DriversList(list) => self.installation_tab.update_drivers(list),
166180
EventType::Tracking(_) | EventType::Buttons(_) | EventType::Haptics(_) => (),
167181
}
168182
}
169183

170-
if self.server_restarting.value() {
184+
if *self.server_restarting.lock() {
171185
CentralPanel::default().show(context, |ui| {
172186
// todo: find a way to center both vertically and horizontally
173187
ui.vertical_centered(|ui| {
@@ -236,7 +250,7 @@ impl eframe::App for Dashboard {
236250

237251
if connected_to_server {
238252
if ui.button("Restart SteamVR").clicked() {
239-
requests.push(ServerRequest::RestartSteamvr);
253+
self.restart_steamvr(&mut requests);
240254
}
241255
} else if ui.button("Launch SteamVR").clicked() {
242256
crate::steamvr_launcher::LAUNCHER.lock().launch_steamvr();

0 commit comments

Comments
 (0)