all: fix memory leaks
This commit is contained in:
parent
56e3eee629
commit
e5c0916a25
15 changed files with 147 additions and 54 deletions
|
|
@ -27,6 +27,7 @@ pub fn handle(state: &Rc<State>, connector: &Rc<dyn Connector>) {
|
|||
connected: Cell::new(false),
|
||||
name: connector.kernel_id().to_string(),
|
||||
drm_dev: drm_dev.clone(),
|
||||
async_event: Rc::new(AsyncEvent::default()),
|
||||
});
|
||||
if let Some(dev) = drm_dev {
|
||||
dev.connectors.set(id, data.clone());
|
||||
|
|
@ -51,9 +52,8 @@ struct ConnectorHandler {
|
|||
|
||||
impl ConnectorHandler {
|
||||
async fn handle(self) {
|
||||
let ae = Rc::new(AsyncEvent::default());
|
||||
{
|
||||
let ae = ae.clone();
|
||||
let ae = self.data.async_event.clone();
|
||||
self.data.connector.on_change(Rc::new(move || ae.trigger()));
|
||||
}
|
||||
if let Some(config) = self.state.config.get() {
|
||||
|
|
@ -63,11 +63,11 @@ impl ConnectorHandler {
|
|||
while let Some(event) = self.data.connector.event() {
|
||||
match event {
|
||||
ConnectorEvent::Removed => break 'outer,
|
||||
ConnectorEvent::Connected(mi) => self.handle_connected(&ae, mi).await,
|
||||
ConnectorEvent::Connected(mi) => self.handle_connected(mi).await,
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
ae.triggered().await;
|
||||
self.data.async_event.triggered().await;
|
||||
}
|
||||
if let Some(config) = self.state.config.get() {
|
||||
config.del_connector(self.id);
|
||||
|
|
@ -76,7 +76,7 @@ impl ConnectorHandler {
|
|||
self.state.connectors.remove(&self.id);
|
||||
}
|
||||
|
||||
async fn handle_connected(&self, ae: &Rc<AsyncEvent>, info: MonitorInfo) {
|
||||
async fn handle_connected(&self, info: MonitorInfo) {
|
||||
log::info!("Connector {} connected", self.data.connector.kernel_id());
|
||||
self.data.connected.set(true);
|
||||
let name = self.state.globals.name();
|
||||
|
|
@ -151,7 +151,7 @@ impl ConnectorHandler {
|
|||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
ae.triggered().await;
|
||||
self.data.async_event.triggered().await;
|
||||
}
|
||||
log::info!("Connector {} disconnected", self.data.connector.kernel_id());
|
||||
if let Some(config) = self.state.config.get() {
|
||||
|
|
|
|||
|
|
@ -12,10 +12,12 @@ pub fn handle(state: &Rc<State>, dev: Rc<dyn InputDevice>) {
|
|||
seat: Default::default(),
|
||||
device: dev.clone(),
|
||||
});
|
||||
let ae = Rc::new(AsyncEvent::default());
|
||||
let oh = DeviceHandler {
|
||||
state: state.clone(),
|
||||
dev: dev.clone(),
|
||||
data: data.clone(),
|
||||
ae: ae.clone(),
|
||||
};
|
||||
let handler = state.eng.spawn(oh.handle());
|
||||
state.input_device_handlers.borrow_mut().insert(
|
||||
|
|
@ -24,21 +26,22 @@ pub fn handle(state: &Rc<State>, dev: Rc<dyn InputDevice>) {
|
|||
handler,
|
||||
id: dev.id(),
|
||||
data,
|
||||
async_event: ae,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
pub struct DeviceHandler {
|
||||
pub state: Rc<State>,
|
||||
pub dev: Rc<dyn InputDevice>,
|
||||
pub data: Rc<DeviceHandlerData>,
|
||||
struct DeviceHandler {
|
||||
state: Rc<State>,
|
||||
dev: Rc<dyn InputDevice>,
|
||||
data: Rc<DeviceHandlerData>,
|
||||
ae: Rc<AsyncEvent>,
|
||||
}
|
||||
|
||||
impl DeviceHandler {
|
||||
pub async fn handle(self) {
|
||||
let ae = Rc::new(AsyncEvent::default());
|
||||
{
|
||||
let ae = ae.clone();
|
||||
let ae = self.ae.clone();
|
||||
self.dev.on_change(Rc::new(move || ae.trigger()));
|
||||
}
|
||||
if let Some(config) = self.state.config.get() {
|
||||
|
|
@ -63,7 +66,7 @@ impl DeviceHandler {
|
|||
// nothing
|
||||
}
|
||||
}
|
||||
ae.triggered().await;
|
||||
self.ae.triggered().await;
|
||||
}
|
||||
if let Some(config) = self.state.config.get() {
|
||||
config.del_input_device(self.dev.id());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue