diff --git a/src/core/client.rs b/src/core/client.rs index da4cdef..8e49a32 100644 --- a/src/core/client.rs +++ b/src/core/client.rs @@ -3,7 +3,7 @@ use crate::nodes::field; use crate::nodes::spatial; use libstardustxr::messenger::Messenger; use mio::net::UnixStream; -use std::rc::Rc; +use std::sync::Arc; pub struct Client { pub messenger: Messenger, @@ -11,8 +11,8 @@ pub struct Client { } impl Client { - pub fn from_connection(connection: UnixStream) -> Rc { - let client = Rc::new(Client { + pub fn from_connection(connection: UnixStream) -> Arc { + let client = Arc::new(Client { messenger: Messenger::new(connection), scenegraph: Default::default(), }); diff --git a/src/core/eventloop.rs b/src/core/eventloop.rs index 88506b4..d868bef 100644 --- a/src/core/eventloop.rs +++ b/src/core/eventloop.rs @@ -6,7 +6,7 @@ use mio::unix::pipe; use mio::{Events, Interest, Poll, Token}; use slab::Slab; use std::io::Write; -use std::rc::Rc; +use std::sync::Arc; use std::thread::{self, JoinHandle}; pub struct EventLoop { @@ -24,7 +24,7 @@ impl EventLoop { let join_handle = thread::Builder::new() .name("event_loop".to_owned()) .spawn(move || -> Result<()> { - let mut clients: Slab>> = Slab::new(); + let mut clients: Slab>> = Slab::new(); let mut poll = Poll::new()?; let mut events = Events::with_capacity(1024); const LISTENER: Token = Token(usize::MAX - 1); diff --git a/src/core/scenegraph.rs b/src/core/scenegraph.rs index 6357af8..45a022d 100644 --- a/src/core/scenegraph.rs +++ b/src/core/scenegraph.rs @@ -4,8 +4,7 @@ use anyhow::Result; use libstardustxr::scenegraph; use libstardustxr::scenegraph::ScenegraphError; use std::cell::RefCell; -use std::rc::{Rc, Weak}; -use std::sync::Arc; +use std::sync::{Arc, Weak}; use core::hash::BuildHasherDefault; use dashmap::DashMap; @@ -18,17 +17,17 @@ pub struct Scenegraph { } impl Scenegraph { - pub fn get_client(&self) -> Rc { + pub fn get_client(&self) -> Arc { self.client.borrow().upgrade().unwrap() } - pub fn set_client(&self, client: &Rc) { - *self.client.borrow_mut() = Rc::downgrade(client); + pub fn set_client(&self, client: &Arc) { + *self.client.borrow_mut() = Arc::downgrade(client); } pub fn add_node(&self, node: Node) -> Arc { let mut node = node; - node.client = Rc::downgrade(&self.get_client()); + node.client = Arc::downgrade(&self.get_client()); let path = node.get_path().to_string(); let node_arc = Arc::new(node); self.nodes.insert(path, node_arc.clone()); diff --git a/src/nodes/core.rs b/src/nodes/core.rs index 4f86dd5..a6204ac 100644 --- a/src/nodes/core.rs +++ b/src/nodes/core.rs @@ -6,17 +6,16 @@ use anyhow::{anyhow, Result}; use libstardustxr::scenegraph::ScenegraphError; use nanoid::nanoid; use once_cell::sync::OnceCell; -use std::rc::{Rc, Weak}; use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::{Arc, Weak as WeakArc}; +use std::sync::{Arc, Weak}; use std::vec::Vec; use core::hash::BuildHasherDefault; use dashmap::DashMap; use rustc_hash::FxHasher; -pub type Signal = fn(&Node, Rc, &[u8]) -> Result<()>; -pub type Method = fn(&Node, Rc, &[u8]) -> Result>; +pub type Signal = fn(&Node, Arc, &[u8]) -> Result<()>; +pub type Method = fn(&Node, Arc, &[u8]) -> Result>; pub struct Node { uid: String, @@ -34,7 +33,7 @@ pub struct Node { } impl Node { - pub fn get_client(&self) -> Option> { + pub fn get_client(&self) -> Option> { self.client.clone().upgrade() } // pub fn get_name(&self) -> &str { @@ -74,7 +73,7 @@ impl Node { } } - pub fn destroy_flex(node: &Node, _calling_client: Rc, _data: &[u8]) -> Result<()> { + pub fn destroy_flex(node: &Node, _calling_client: Arc, _data: &[u8]) -> Result<()> { if node.is_destroyable() { node.destroy(); } @@ -90,7 +89,7 @@ impl Node { pub fn send_local_signal( &self, - calling_client: Rc, + calling_client: Arc, method: &str, data: &[u8], ) -> Result<(), ScenegraphError> { @@ -114,7 +113,7 @@ impl Node { } pub fn execute_local_method( &self, - calling_client: Rc, + calling_client: Arc, method: &str, data: &[u8], ) -> Result, ScenegraphError> { @@ -158,7 +157,7 @@ impl Node { } pub struct Alias { - original: WeakArc, + original: Weak, signals: Vec, methods: Vec, diff --git a/src/nodes/field.rs b/src/nodes/field.rs index fc97eb5..479eca8 100644 --- a/src/nodes/field.rs +++ b/src/nodes/field.rs @@ -8,7 +8,6 @@ use libstardustxr::{flex_to_quat, flex_to_vec3}; use parking_lot::Mutex; use portable_atomic::AtomicF32; use std::ops::Deref; -use std::rc::Rc; use std::sync::atomic::Ordering; use std::sync::Arc; @@ -63,7 +62,7 @@ pub trait FieldTrait { fn spatial_ref(&self) -> &Spatial; } -fn field_distance_flex(node: &Node, calling_client: Rc, data: &[u8]) -> Result> { +fn field_distance_flex(node: &Node, calling_client: Arc, data: &[u8]) -> Result> { let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; let reference_space = calling_client .scenegraph @@ -82,7 +81,7 @@ fn field_distance_flex(node: &Node, calling_client: Rc, data: &[u8]) -> .distance(reference_space.as_ref(), point.into()); Ok(FlexBuffable::from(distance).build_singleton()) } -fn field_normal_flex(node: &Node, calling_client: Rc, data: &[u8]) -> Result> { +fn field_normal_flex(node: &Node, calling_client: Arc, data: &[u8]) -> Result> { let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; let reference_space = calling_client .scenegraph @@ -103,7 +102,7 @@ fn field_normal_flex(node: &Node, calling_client: Rc, data: &[u8]) -> Re } fn field_closest_point_flex( node: &Node, - calling_client: Rc, + calling_client: Arc, data: &[u8], ) -> Result> { let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; @@ -171,7 +170,7 @@ impl BoxField { *self.size.lock() = size; } - pub fn set_size_flex(node: &Node, _calling_client: Rc, data: &[u8]) -> Result<()> { + pub fn set_size_flex(node: &Node, _calling_client: Arc, data: &[u8]) -> Result<()> { let root = flexbuffers::Reader::get_root(data)?; let size = flex_to_vec3!(root).ok_or_else(|| anyhow!("Size is invalid"))?; if let Field::Box(box_field) = node.field.get().unwrap().as_ref() { @@ -229,7 +228,7 @@ impl CylinderField { self.radius.store(radius, Ordering::Relaxed); } - pub fn set_size_flex(node: &Node, _calling_client: Rc, data: &[u8]) -> Result<()> { + pub fn set_size_flex(node: &Node, _calling_client: Arc, data: &[u8]) -> Result<()> { let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; let length = flex_vec.idx(0).as_f32(); let radius = flex_vec.idx(1).as_f32(); @@ -286,7 +285,7 @@ impl SphereField { self.radius.store(radius, Ordering::Relaxed); } - pub fn set_radius_flex(node: &Node, _calling_client: Rc, data: &[u8]) -> Result<()> { + pub fn set_radius_flex(node: &Node, _calling_client: Arc, data: &[u8]) -> Result<()> { let root = flexbuffers::Reader::get_root(data)?; if let Field::Sphere(sphere_field) = node.field.get().unwrap().as_ref() { sphere_field.set_radius(root.as_f32()); @@ -310,7 +309,7 @@ impl FieldTrait for SphereField { } } -pub fn create_interface(client: &Rc) { +pub fn create_interface(client: &Arc) { let node = Node::create("", "field", false); node.add_local_signal("createBoxField", create_box_field_flex); node.add_local_signal("createCylinderField", create_cylinder_field_flex); @@ -318,7 +317,7 @@ pub fn create_interface(client: &Rc) { client.scenegraph.add_node(node); } -pub fn create_box_field_flex(_node: &Node, calling_client: Rc, data: &[u8]) -> Result<()> { +pub fn create_box_field_flex(_node: &Node, calling_client: Arc, data: &[u8]) -> Result<()> { let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; let node = Node::create("/field", flex_vec.idx(0).get_str()?, true); let parent = get_spatial_parent_flex(&calling_client, flex_vec.idx(1).get_str()?)?; @@ -339,7 +338,7 @@ pub fn create_box_field_flex(_node: &Node, calling_client: Rc, data: &[u pub fn create_cylinder_field_flex( _node: &Node, - calling_client: Rc, + calling_client: Arc, data: &[u8], ) -> Result<()> { let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; @@ -363,7 +362,7 @@ pub fn create_cylinder_field_flex( pub fn create_sphere_field_flex( _node: &Node, - calling_client: Rc, + calling_client: Arc, data: &[u8], ) -> Result<()> { let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; diff --git a/src/nodes/spatial.rs b/src/nodes/spatial.rs index 30ba860..7791ed5 100644 --- a/src/nodes/spatial.rs +++ b/src/nodes/spatial.rs @@ -6,7 +6,6 @@ use libstardustxr::flex::flexbuffer_from_vector_arguments; use libstardustxr::push_to_vec; use libstardustxr::{flex_to_quat, flex_to_vec3}; use parking_lot::RwLock; -use std::rc::Rc; use std::sync::Arc; pub struct Spatial { @@ -91,7 +90,7 @@ impl Spatial { pub fn get_transform_flex( node: &Node, - calling_client: Rc, + calling_client: Arc, data: &[u8], ) -> Result> { let root = flexbuffers::Reader::get_root(data)?; @@ -123,7 +122,7 @@ impl Spatial { ); })) } - pub fn set_transform_flex(node: &Node, calling_client: Rc, data: &[u8]) -> Result<()> { + pub fn set_transform_flex(node: &Node, calling_client: Arc, data: &[u8]) -> Result<()> { let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; let reference_space_path = flex_vec.idx(0).as_str(); let reference_space_transform = if reference_space_path.is_empty() { @@ -151,7 +150,7 @@ impl Spatial { } pub fn get_spatial_parent_flex( - calling_client: &Rc, + calling_client: &Arc, node_path: &str, ) -> Result> { Ok(calling_client @@ -177,13 +176,13 @@ pub fn get_transform_pose_flex( )) } -pub fn create_interface(client: &Rc) { +pub fn create_interface(client: &Arc) { let node = Node::create("", "spatial", false); node.add_local_signal("createSpatial", create_spatial_flex); client.scenegraph.add_node(node); } -pub fn create_spatial_flex(_node: &Node, calling_client: Rc, data: &[u8]) -> Result<()> { +pub fn create_spatial_flex(_node: &Node, calling_client: Arc, data: &[u8]) -> Result<()> { let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; let spatial = Node::create("/spatial/spatial", flex_vec.idx(0).get_str()?, true); let parent = get_spatial_parent_flex(&calling_client, flex_vec.idx(1).get_str()?)?;