fix(items): proper drop
This commit is contained in:
@@ -37,8 +37,8 @@ lazy_static! {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn capture(item: &Arc<Item>, acceptor: &Arc<ItemAcceptor>) {
|
pub fn capture(item: &Arc<Item>, acceptor: &Arc<ItemAcceptor>) {
|
||||||
if item.captured_acceptor.lock().upgrade().is_some() {
|
if let Some(acceptor) = item.captured_acceptor.lock().upgrade() {
|
||||||
release(item);
|
release(item, Some(&acceptor));
|
||||||
}
|
}
|
||||||
*item.captured_acceptor.lock() = Arc::downgrade(acceptor);
|
*item.captured_acceptor.lock() = Arc::downgrade(acceptor);
|
||||||
acceptor.handle_capture(item);
|
acceptor.handle_capture(item);
|
||||||
@@ -46,9 +46,9 @@ pub fn capture(item: &Arc<Item>, acceptor: &Arc<ItemAcceptor>) {
|
|||||||
ui.handle_capture_item(item, acceptor);
|
ui.handle_capture_item(item, acceptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn release(item: &Arc<Item>) {
|
fn release(item: &Item, acceptor: Option<&ItemAcceptor>) {
|
||||||
let mut captured_acceptor = item.captured_acceptor.lock();
|
let mut captured_acceptor = item.captured_acceptor.lock();
|
||||||
if let Some(acceptor) = captured_acceptor.upgrade() {
|
if let Some(acceptor) = captured_acceptor.upgrade().as_deref().or(acceptor) {
|
||||||
*captured_acceptor = Weak::default();
|
*captured_acceptor = Weak::default();
|
||||||
acceptor.handle_release(item);
|
acceptor.handle_release(item);
|
||||||
if let Some(ui) = item.type_info.ui.lock().upgrade() {
|
if let Some(ui) = item.type_info.ui.lock().upgrade() {
|
||||||
@@ -154,7 +154,7 @@ impl Item {
|
|||||||
|
|
||||||
fn release_flex(node: &Node, _calling_client: Arc<Client>, _data: &[u8]) -> Result<()> {
|
fn release_flex(node: &Node, _calling_client: Arc<Client>, _data: &[u8]) -> Result<()> {
|
||||||
let item = node.get_aspect("Item", "item", |n| &n.item)?;
|
let item = node.get_aspect("Item", "item", |n| &n.item)?;
|
||||||
release(item);
|
release(item, None);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -162,6 +162,7 @@ impl Item {
|
|||||||
impl Drop for Item {
|
impl Drop for Item {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
self.type_info.items.remove(self);
|
self.type_info.items.remove(self);
|
||||||
|
release(self, None);
|
||||||
if let Some(ui) = self.type_info.ui.lock().upgrade() {
|
if let Some(ui) = self.type_info.ui.lock().upgrade() {
|
||||||
ui.handle_destroy_item(self);
|
ui.handle_destroy_item(self);
|
||||||
}
|
}
|
||||||
@@ -292,7 +293,8 @@ pub struct ItemAcceptor {
|
|||||||
node: Weak<Node>,
|
node: Weak<Node>,
|
||||||
pub type_info: &'static TypeInfo,
|
pub type_info: &'static TypeInfo,
|
||||||
field: Arc<Field>,
|
field: Arc<Field>,
|
||||||
accepted: LifeLinkedNodeMap<String>,
|
accepted_aliases: LifeLinkedNodeMap<String>,
|
||||||
|
accepted_registry: Registry<Item>,
|
||||||
}
|
}
|
||||||
impl ItemAcceptor {
|
impl ItemAcceptor {
|
||||||
fn add_to(node: &Arc<Node>, type_info: &'static TypeInfo, field: Arc<Field>) {
|
fn add_to(node: &Arc<Node>, type_info: &'static TypeInfo, field: Arc<Field>) {
|
||||||
@@ -301,7 +303,8 @@ impl ItemAcceptor {
|
|||||||
node: Arc::downgrade(node),
|
node: Arc::downgrade(node),
|
||||||
type_info,
|
type_info,
|
||||||
field,
|
field,
|
||||||
accepted: Default::default(),
|
accepted_aliases: Default::default(),
|
||||||
|
accepted_registry: Registry::new(),
|
||||||
});
|
});
|
||||||
node.add_local_signal("capture", ItemAcceptor::capture_flex);
|
node.add_local_signal("capture", ItemAcceptor::capture_flex);
|
||||||
if let Some(ui) = type_info.ui.lock().upgrade() {
|
if let Some(ui) = type_info.ui.lock().upgrade() {
|
||||||
@@ -351,8 +354,9 @@ impl ItemAcceptor {
|
|||||||
let Some(node) = self.node.upgrade() else { return };
|
let Some(node) = self.node.upgrade() else { return };
|
||||||
let Some(client) = node.get_client() else { return };
|
let Some(client) = node.get_client() else { return };
|
||||||
|
|
||||||
|
self.accepted_registry.add_raw(item);
|
||||||
if let Ok(alias_node) = item.make_alias(&client, &node.path) {
|
if let Ok(alias_node) = item.make_alias(&client, &node.path) {
|
||||||
self.accepted.add(item.uid.clone(), &alias_node);
|
self.accepted_aliases.add(item.uid.clone(), &alias_node);
|
||||||
}
|
}
|
||||||
let _ = node.send_remote_signal(
|
let _ = node.send_remote_signal(
|
||||||
"capture",
|
"capture",
|
||||||
@@ -362,13 +366,17 @@ impl ItemAcceptor {
|
|||||||
fn handle_release(&self, item: &Item) {
|
fn handle_release(&self, item: &Item) {
|
||||||
let Some(node) = self.node.upgrade() else { return };
|
let Some(node) = self.node.upgrade() else { return };
|
||||||
|
|
||||||
self.accepted.remove(&item.uid);
|
self.accepted_registry.remove(item);
|
||||||
|
self.accepted_aliases.remove(&item.uid);
|
||||||
let _ = node.send_remote_signal("release", &serialize(&item.uid).unwrap());
|
let _ = node.send_remote_signal("release", &serialize(&item.uid).unwrap());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl Drop for ItemAcceptor {
|
impl Drop for ItemAcceptor {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
self.type_info.acceptors.remove(self);
|
self.type_info.acceptors.remove(self);
|
||||||
|
for item in self.accepted_registry.get_valid_contents() {
|
||||||
|
release(&item, Some(self));
|
||||||
|
}
|
||||||
if let Some(ui) = self.type_info.ui.lock().upgrade() {
|
if let Some(ui) = self.type_info.ui.lock().upgrade() {
|
||||||
ui.handle_destroy_acceptor(self);
|
ui.handle_destroy_acceptor(self);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user