Workaround resource manager RwLock deadlock (#78). Closes https://github.com/iceiix/steven/issues/75
game.resource_manager, an Arc<RwLock<resources::Manager>>, sometimes hangs on write(), apparently a deadlock. Switch to using try_write() and continue the main game loop iteration if it fails, using the previous resource version and allow main loop tick if can't obtain a write lock. No warning is logged since this error is recoverable and seemingly intermittent. May not be the best fix, but unblocking iterative development.
This commit is contained in:
parent
e1769edae8
commit
98cc88df5c
15
src/main.rs
15
src/main.rs
|
@ -240,6 +240,7 @@ fn main() {
|
|||
};
|
||||
game.renderer.camera.pos = cgmath::Point3::new(0.5, 13.2, 0.5);
|
||||
|
||||
let mut last_resource_version = 0;
|
||||
while !game.should_close {
|
||||
|
||||
let now = Instant::now();
|
||||
|
@ -250,10 +251,18 @@ fn main() {
|
|||
let (physical_width, physical_height) = window.get_inner_size().unwrap().to_physical(game.dpi_factor).into();
|
||||
|
||||
let version = {
|
||||
let mut res = game.resource_manager.write().unwrap();
|
||||
res.tick(&mut resui, &mut ui_container, delta);
|
||||
res.version()
|
||||
let try_res = game.resource_manager.try_write();
|
||||
if try_res.is_ok() {
|
||||
let mut res = try_res.unwrap();
|
||||
res.tick(&mut resui, &mut ui_container, delta);
|
||||
res.version()
|
||||
} else {
|
||||
// TODO: why does game.resource_manager.write() sometimes deadlock?
|
||||
//warn!("Failed to obtain mutable reference to resource manager!");
|
||||
last_resource_version
|
||||
}
|
||||
};
|
||||
last_resource_version = version;
|
||||
|
||||
let vsync_changed = *game.vars.get(settings::R_VSYNC);
|
||||
if vsync != vsync_changed {
|
||||
|
|
Loading…
Reference in New Issue