Fix some lock ordering issues

This commit is contained in:
Thinkofname 2016-03-29 20:53:41 +01:00
parent d621528bb8
commit 357c695a3a
3 changed files with 19 additions and 17 deletions

View File

@ -19,7 +19,6 @@ pub struct ChunkBuilder {
built_recv: mpsc::Receiver<(usize, BuildReply)>,
models: Arc<RwLock<model::Factory>>,
resources: Arc<RwLock<resources::Manager>>,
resource_version: usize,
}
@ -43,16 +42,14 @@ impl ChunkBuilder {
free_builders: free,
built_recv: built_recv,
models: models,
resources: resources.clone(),
resource_version: 0xFFFF,
}
}
pub fn tick(&mut self, world: &mut world::World, renderer: &mut render::Renderer, _delta: f64) {
pub fn tick(&mut self, world: &mut world::World, renderer: &mut render::Renderer, version: usize) {
{
let rm = self.resources.read().unwrap();
if rm.version() != self.resource_version {
self.resource_version = rm.version();
if version != self.resource_version {
self.resource_version = version;
self.models.write().unwrap().version_change();
}
}

View File

@ -218,9 +218,11 @@ fn main() {
let mut events = sdl.event_pump().unwrap();
while !game.should_close {
{
game.resource_manager.write().unwrap().tick();
}
let version = {
let mut res = game.resource_manager.write().unwrap();
res.tick();
res.version()
};
let now = time::now();
let diff = now - last_frame;
@ -233,7 +235,7 @@ fn main() {
game.renderer.update_camera(width, height);
game.server.world.compute_render_list(&mut game.renderer);
game.chunk_builder.tick(&mut game.server.world, &mut game.renderer, delta);
game.chunk_builder.tick(&mut game.server.world, &mut game.renderer, version);
game.screen_sys.tick(delta, &mut game.renderer, &mut ui_container);
game.console

View File

@ -41,14 +41,16 @@ impl Logo {
}
fn init(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) {
let res = self.resources.read().unwrap();
let mut logo = res.open("steven", "logo/logo.txt").unwrap();
let mut logo_str = String::new();
logo.read_to_string(&mut logo_str).unwrap();
let logo_str = {
let res = self.resources.read().unwrap();
let mut logo = res.open("steven", "logo/logo.txt").unwrap();
let mut logo_str = String::new();
logo.read_to_string(&mut logo_str).unwrap();
logo_str
};
let solid = render::Renderer::get_texture(renderer.get_textures_ref(), "steven:solid");
let stone = render::Renderer::get_texture(renderer.get_textures_ref(), "blocks/planks_oak");
let front = render::Renderer::get_texture(renderer.get_textures_ref(), "blocks/planks_oak");
let mut shadow_batch = ui::Batch::new(0.0, 8.0, 100.0, 100.0);
let mut layer0 = ui::Batch::new(0.0, 8.0, 100.0, 100.0);
@ -88,7 +90,7 @@ impl Logo {
shadow_batch.add(shadow);
let img = ui::Image::new(stone.clone(),
let img = ui::Image::new(front.clone(),
x as f64,
y as f64,
4.0,
@ -111,6 +113,7 @@ impl Logo {
row += 1;
}
{
let res = self.resources.read().unwrap();
let mut splashes = res.open_all("minecraft", "texts/splashes.txt");
for file in &mut splashes {
let mut texts = String::new();