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