Skip to content

Commit aef4320

Browse files
committed
backend/rs/server: Removed destroy objects from known_registries
For use with the `wl_fixes` protocol.
1 parent 4d5f211 commit aef4320

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

wayland-backend/src/rs/server_impl/handle.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ impl<D> State<D> {
4141

4242
pub(crate) fn cleanup<'a>(&mut self) -> impl FnOnce(&super::Handle, &mut D) + 'a {
4343
let dead_clients = self.clients.cleanup(&mut self.pending_destructors);
44-
self.registry.cleanup(&dead_clients);
44+
self.registry.cleanup(&dead_clients, &self.pending_destructors);
4545
// return a closure that will do the cleanup once invoked
4646
let pending_destructors = std::mem::take(&mut self.pending_destructors);
4747
move |handle, data| {

wayland-backend/src/rs/server_impl/registry.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::types::server::{GlobalInfo, InvalidId};
88

99
use super::{
1010
client::{Client, ClientStore},
11+
handle::PendingDestructor,
1112
ClientId, GlobalHandler, GlobalId, InnerGlobalId, InnerObjectId, ObjectId,
1213
};
1314

@@ -127,9 +128,17 @@ impl<D> Registry<D> {
127128
Some((target_global.interface, target_global.id.clone(), target_global.handler.clone()))
128129
}
129130

130-
pub(crate) fn cleanup(&mut self, dead_clients: &[Client<D>]) {
131-
self.known_registries
132-
.retain(|obj_id| !dead_clients.iter().any(|cid| cid.id == obj_id.client_id))
131+
pub(crate) fn cleanup(
132+
&mut self,
133+
dead_clients: &[Client<D>],
134+
pending_destructors: &[PendingDestructor<D>],
135+
) {
136+
// Remote registries with client id matching any dead clients, or object
137+
// id matching pending destructors.
138+
self.known_registries.retain(|obj_id| {
139+
!dead_clients.iter().any(|cid| cid.id == obj_id.client_id)
140+
&& !pending_destructors.iter().any(|(_, _, id)| id == obj_id)
141+
})
133142
}
134143

135144
pub(crate) fn disable_global(&mut self, id: InnerGlobalId, clients: &mut ClientStore<D>) {

0 commit comments

Comments
 (0)