all: clear more reference cycles at shutdown
This commit is contained in:
parent
4d33dbf32f
commit
3473b89fb9
7 changed files with 76 additions and 9 deletions
|
|
@ -9,7 +9,9 @@ use {
|
|||
Backend, InputDevice, InputDeviceAccelProfile, InputDeviceCapability, InputDeviceId,
|
||||
InputEvent, KeyState, TransformMatrix,
|
||||
},
|
||||
backends::metal::video::{MetalDrmDeviceData, MetalRenderContext, PendingDrmDevice},
|
||||
backends::metal::video::{
|
||||
MetalDrmDeviceData, MetalLeaseData, MetalRenderContext, PendingDrmDevice,
|
||||
},
|
||||
dbus::{DbusError, SignalHandler},
|
||||
drm_feedback::DrmFeedback,
|
||||
gfx_api::GfxError,
|
||||
|
|
@ -165,6 +167,53 @@ impl Backend for MetalBackend {
|
|||
})
|
||||
}
|
||||
|
||||
fn clear(&self) {
|
||||
self.pause_handler.take();
|
||||
self.resume_handler.take();
|
||||
self.ctx.take();
|
||||
self.device_holder.devices.clear();
|
||||
for dev in self.device_holder.input_devices.take() {
|
||||
if let Some(dev) = dev {
|
||||
dev.inputdev.take();
|
||||
dev.events.take();
|
||||
dev.cb.take();
|
||||
}
|
||||
}
|
||||
for (_, dev) in self.device_holder.drm_devices.lock().drain() {
|
||||
dev.futures.clear();
|
||||
for crtc in dev.dev.crtcs.values() {
|
||||
crtc.connector.take();
|
||||
}
|
||||
dev.dev.handle_events.handle_events.take();
|
||||
dev.dev.on_change.clear();
|
||||
let clear_lease = |lease: &mut MetalLeaseData| {
|
||||
lease.connectors.clear();
|
||||
lease.crtcs.clear();
|
||||
lease.planes.clear();
|
||||
};
|
||||
for (_, mut lease) in dev.dev.leases.lock().drain() {
|
||||
clear_lease(&mut lease);
|
||||
}
|
||||
for (_, mut lease) in dev.dev.leases_to_break.lock().drain() {
|
||||
clear_lease(&mut lease);
|
||||
}
|
||||
for (_, connector) in dev.connectors.lock().drain() {
|
||||
{
|
||||
let d = &mut *connector.display.borrow_mut();
|
||||
d.crtcs.clear();
|
||||
}
|
||||
connector.primary_plane.take();
|
||||
connector.cursor_plane.take();
|
||||
connector.crtc.take();
|
||||
connector.on_change.clear();
|
||||
connector.present_trigger.clear();
|
||||
connector.render_result.take();
|
||||
connector.active_framebuffer.take();
|
||||
connector.next_framebuffer.take();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn into_any(self: Rc<Self>) -> Rc<dyn Any> {
|
||||
self
|
||||
}
|
||||
|
|
|
|||
|
|
@ -323,12 +323,12 @@ impl ConnectorDisplayData {
|
|||
linear_ids!(MetalLeaseIds, MetalLeaseId, u64);
|
||||
|
||||
pub struct MetalLeaseData {
|
||||
lease: DrmLease,
|
||||
_lessee: Rc<dyn BackendDrmLessee>,
|
||||
connectors: Vec<Rc<MetalConnector>>,
|
||||
crtcs: Vec<Rc<MetalCrtc>>,
|
||||
planes: Vec<Rc<MetalPlane>>,
|
||||
revoked: Cell<bool>,
|
||||
pub lease: DrmLease,
|
||||
pub _lessee: Rc<dyn BackendDrmLessee>,
|
||||
pub connectors: Vec<Rc<MetalConnector>>,
|
||||
pub crtcs: Vec<Rc<MetalCrtc>>,
|
||||
pub planes: Vec<Rc<MetalPlane>>,
|
||||
pub revoked: Cell<bool>,
|
||||
}
|
||||
|
||||
impl MetalLeaseData {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue