mirror of
https://github.com/emilk/egui.git
synced 2026-06-26 22:53:14 -04:00
Fix: update get_proc_address to use Arc for better ownership management (#7922)
<!-- Please read the "Making a PR" section of [`CONTRIBUTING.md`](https://github.com/emilk/egui/blob/main/CONTRIBUTING.md) before opening a Pull Request! * Keep your PR:s small and focused. * The PR title is what ends up in the changelog, so make it descriptive! * If applicable, add a screenshot or gif. * If it is a non-trivial addition, consider adding a demo for it to `egui_demo_lib`, or a new example. * Do NOT open PR:s from your `master` branch, as that makes it hard for maintainers to test and add commits to your PR. * Remember to run `cargo fmt` and `cargo clippy`. * Open the PR as a draft until you have self-reviewed it and run `./scripts/check.sh`. * When you have addressed a PR comment, mark it as resolved. Please be patient! I will review your PR, but my time is limited! --> * [x] I have followed the instructions in the PR template `get_proc_address` was introduced in #4145, but its lifetime was designed to be tied to the lifetime `'s` of `CreationContext`. This means that using `get_proc_address` outside the lifetime of `CreationContext` is undefined behavior. This contradicts the original intent behind introducing `get_proc_address`, as this API is intended for integration with external libraries that cannot easily guarantee alignment with egui's lifetimes. This PR changes the type of `get_proc_address` from a reference to an `Arc`, decoupling its lifetime from `CreationContext` to achieve safer memory management.
This commit is contained in:
@@ -72,7 +72,8 @@ pub struct CreationContext<'s> {
|
||||
|
||||
/// The `get_proc_address` wrapper of underlying GL context
|
||||
#[cfg(feature = "glow")]
|
||||
pub get_proc_address: Option<&'s dyn Fn(&std::ffi::CStr) -> *const std::ffi::c_void>,
|
||||
pub get_proc_address:
|
||||
Option<std::sync::Arc<dyn Fn(&std::ffi::CStr) -> *const std::ffi::c_void + Send + Sync>>,
|
||||
|
||||
/// The underlying WGPU render state.
|
||||
///
|
||||
|
||||
@@ -294,14 +294,15 @@ impl<'app> GlowWinitApp<'app> {
|
||||
// Use latest raw_window_handle for eframe compatibility
|
||||
use raw_window_handle::{HasDisplayHandle as _, HasWindowHandle as _};
|
||||
|
||||
let get_proc_address = |addr: &_| glutin.get_proc_address(addr);
|
||||
let gl_config = glutin.gl_config.clone();
|
||||
let get_proc_address = move |addr: &_| gl_config.display().get_proc_address(addr);
|
||||
let window = glutin.window(ViewportId::ROOT);
|
||||
let cc = CreationContext {
|
||||
egui_ctx: integration.egui_ctx.clone(),
|
||||
integration_info: integration.frame.info().clone(),
|
||||
storage: integration.frame.storage(),
|
||||
gl: Some(gl),
|
||||
get_proc_address: Some(&get_proc_address),
|
||||
get_proc_address: Some(Arc::new(get_proc_address)),
|
||||
#[cfg(feature = "wgpu_no_default_features")]
|
||||
wgpu_render_state: None,
|
||||
raw_display_handle: window.display_handle().map(|h| h.as_raw()),
|
||||
|
||||
Reference in New Issue
Block a user