1
0
mirror of https://github.com/emilk/egui.git synced 2026-09-01 14:20:04 -04:00

Fix crash during shutdown

This commit is contained in:
Emil Ernerfeldt
2023-11-02 09:07:38 +01:00
parent 9749e1ea6d
commit 46febb4af1

View File

@@ -1070,27 +1070,35 @@ mod glow_integration {
let glutin_ctx = Rc::new(RefCell::new(glutin_ctx)); let glutin_ctx = Rc::new(RefCell::new(glutin_ctx));
let painter = Rc::new(RefCell::new(painter)); let painter = Rc::new(RefCell::new(painter));
// c_* means that will be taken by the next closure {
// Create weak pointers so that we don't keep
// state alive for too long.
let glutin = Rc::downgrade(&glutin_ctx);
let gl = Arc::downgrade(&gl);
let painter = Rc::downgrade(&painter);
let beginning = integration.beginning;
let c_glutin = glutin_ctx.clone(); integration.egui_ctx.set_render_sync_callback(
let c_gl = gl.clone(); move |egui_ctx, viewport_builder, pair, render| {
let c_painter = painter.clone(); if let (Some(glutin), Some(gl), Some(painter)) =
let c_time = integration.beginning; (glutin.upgrade(), gl.upgrade(), painter.upgrade())
{
integration.egui_ctx.set_render_sync_callback( Self::render_sync_viewport(
move |egui_ctx, viewport_builder, pair, render| { egui_ctx,
Self::render_sync_viewport( viewport_builder,
egui_ctx, pair,
viewport_builder, render,
pair, &glutin,
render, &gl,
&c_glutin, &painter,
&c_gl, beginning,
&c_painter, );
c_time, } else {
); log::warn!("render_sync_callback called after window closed");
}, }
); },
);
}
*self.running.borrow_mut() = Some(GlowWinitRunning { *self.running.borrow_mut() = Some(GlowWinitRunning {
glutin_ctx, glutin_ctx,
@@ -2142,29 +2150,45 @@ mod wgpu_integration {
let painter = Rc::new(RefCell::new(painter)); let painter = Rc::new(RefCell::new(painter));
// c_* means that will be taken by the next closure {
// Create weak pointers so that we don't keep
// state alive for too long.
let viewports = Rc::downgrade(&viewports);
let builders = Rc::downgrade(&builders);
let painter = Rc::downgrade(&painter);
let viewport_maps = Rc::downgrade(&viewport_maps);
let beginning = integration.beginning;
let c_viewports = viewports.clone(); integration.egui_ctx.set_render_sync_callback(
let c_builders = builders.clone(); move |egui_ctx, viewport_builder, pair, render| {
let c_time = integration.beginning; if let (
let c_painter = painter.clone(); Some(viewports),
let c_viewport_maps = viewport_maps.clone(); Some(builders),
Some(painter),
integration.egui_ctx.set_render_sync_callback( Some(viewport_maps),
move |egui_ctx, viewport_builder, pair, render| { ) = (
Self::render_sync_viewport( viewports.upgrade(),
egui_ctx, builders.upgrade(),
viewport_builder, painter.upgrade(),
pair, viewport_maps.upgrade(),
render, ) {
&mut c_viewports.borrow_mut(), Self::render_sync_viewport(
&c_builders, egui_ctx,
c_time, viewport_builder,
&c_painter, pair,
&c_viewport_maps, render,
); &mut viewports.borrow_mut(),
}, &builders,
); beginning,
&painter,
&viewport_maps,
);
} else {
log::warn!("render_sync_callback called after window closed");
}
},
);
}
self.running = Some(WgpuWinitRunning { self.running = Some(WgpuWinitRunning {
painter, painter,