1
0
mirror of https://github.com/emilk/egui.git synced 2026-09-02 14:50:03 -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
let c_glutin = glutin_ctx.clone(); // state alive for too long.
let c_gl = gl.clone(); let glutin = Rc::downgrade(&glutin_ctx);
let c_painter = painter.clone(); let gl = Arc::downgrade(&gl);
let c_time = integration.beginning; let painter = Rc::downgrade(&painter);
let beginning = integration.beginning;
integration.egui_ctx.set_render_sync_callback( integration.egui_ctx.set_render_sync_callback(
move |egui_ctx, viewport_builder, pair, render| { move |egui_ctx, viewport_builder, pair, render| {
if let (Some(glutin), Some(gl), Some(painter)) =
(glutin.upgrade(), gl.upgrade(), painter.upgrade())
{
Self::render_sync_viewport( Self::render_sync_viewport(
egui_ctx, egui_ctx,
viewport_builder, viewport_builder,
pair, pair,
render, render,
&c_glutin, &glutin,
&c_gl, &gl,
&c_painter, &painter,
c_time, beginning,
); );
} 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
let c_viewports = viewports.clone(); // state alive for too long.
let c_builders = builders.clone(); let viewports = Rc::downgrade(&viewports);
let c_time = integration.beginning; let builders = Rc::downgrade(&builders);
let c_painter = painter.clone(); let painter = Rc::downgrade(&painter);
let c_viewport_maps = viewport_maps.clone(); let viewport_maps = Rc::downgrade(&viewport_maps);
let beginning = integration.beginning;
integration.egui_ctx.set_render_sync_callback( integration.egui_ctx.set_render_sync_callback(
move |egui_ctx, viewport_builder, pair, render| { move |egui_ctx, viewport_builder, pair, render| {
if let (
Some(viewports),
Some(builders),
Some(painter),
Some(viewport_maps),
) = (
viewports.upgrade(),
builders.upgrade(),
painter.upgrade(),
viewport_maps.upgrade(),
) {
Self::render_sync_viewport( Self::render_sync_viewport(
egui_ctx, egui_ctx,
viewport_builder, viewport_builder,
pair, pair,
render, render,
&mut c_viewports.borrow_mut(), &mut viewports.borrow_mut(),
&c_builders, &builders,
c_time, beginning,
&c_painter, &painter,
&c_viewport_maps, &viewport_maps,
); );
} else {
log::warn!("render_sync_callback called after window closed");
}
}, },
); );
}
self.running = Some(WgpuWinitRunning { self.running = Some(WgpuWinitRunning {
painter, painter,