@@ -6,7 +6,7 @@ use self::components::{
6
6
SetupWizard , SetupWizardRequest ,
7
7
} ;
8
8
use crate :: { dashboard:: components:: StatisticsTab , theme, DataSources } ;
9
- use alvr_common:: RelaxedAtomic ;
9
+ use alvr_common:: parking_lot :: { Condvar , Mutex } ;
10
10
use alvr_events:: EventType ;
11
11
use alvr_packets:: { PathValuePair , ServerRequest } ;
12
12
use alvr_session:: SessionDesc ;
@@ -60,7 +60,8 @@ enum Tab {
60
60
pub struct Dashboard {
61
61
data_sources : DataSources ,
62
62
just_opened : bool ,
63
- server_restarting : Arc < RelaxedAtomic > ,
63
+ server_restarting : Arc < Mutex < bool > > ,
64
+ server_restarting_condvar : Arc < Condvar > ,
64
65
selected_tab : Tab ,
65
66
tab_labels : BTreeMap < Tab , & ' static str > ,
66
67
connections_tab : ConnectionsTab ,
@@ -85,7 +86,8 @@ impl Dashboard {
85
86
Self {
86
87
data_sources,
87
88
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 ( ) ) ,
89
91
selected_tab : Tab :: Connections ,
90
92
tab_labels : [
91
93
( Tab :: Connections , "🔌 Connections" ) ,
@@ -109,6 +111,32 @@ impl Dashboard {
109
111
session : SessionDesc :: default ( ) ,
110
112
}
111
113
}
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
+ }
112
140
}
113
141
114
142
impl eframe:: App for Dashboard {
@@ -146,28 +174,14 @@ impl eframe::App for Dashboard {
146
174
147
175
self . session = * session;
148
176
}
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) ,
164
178
EventType :: AudioDevices ( list) => self . settings_tab . update_audio_devices ( list) ,
165
179
EventType :: DriversList ( list) => self . installation_tab . update_drivers ( list) ,
166
180
EventType :: Tracking ( _) | EventType :: Buttons ( _) | EventType :: Haptics ( _) => ( ) ,
167
181
}
168
182
}
169
183
170
- if self . server_restarting . value ( ) {
184
+ if * self . server_restarting . lock ( ) {
171
185
CentralPanel :: default ( ) . show ( context, |ui| {
172
186
// todo: find a way to center both vertically and horizontally
173
187
ui. vertical_centered ( |ui| {
@@ -236,7 +250,7 @@ impl eframe::App for Dashboard {
236
250
237
251
if connected_to_server {
238
252
if ui. button ( "Restart SteamVR" ) . clicked ( ) {
239
- requests . push ( ServerRequest :: RestartSteamvr ) ;
253
+ self . restart_steamvr ( & mut requests ) ;
240
254
}
241
255
} else if ui. button ( "Launch SteamVR" ) . clicked ( ) {
242
256
crate :: steamvr_launcher:: LAUNCHER . lock ( ) . launch_steamvr ( ) ;
0 commit comments