From 76d782195e3cc19832ad57ffffda4e953c6970b3 Mon Sep 17 00:00:00 2001 From: HampusM Date: Tue, 4 Feb 2025 18:04:32 +0100 Subject: chore(ecs): use parking_lot for inner rwlock of Lock --- ecs/Cargo.toml | 1 + ecs/src/lock.rs | 19 +++++++------------ ecs/src/system.rs | 7 +++---- 3 files changed, 11 insertions(+), 16 deletions(-) (limited to 'ecs') diff --git a/ecs/Cargo.toml b/ecs/Cargo.toml index 738998f..4945171 100644 --- a/ecs/Cargo.toml +++ b/ecs/Cargo.toml @@ -10,6 +10,7 @@ thiserror = "1.0.49" tracing = "0.1.39" linkme = "0.3.29" hashbrown = "0.15.2" +parking_lot = "0.12.3" ecs-macros = { path = "../ecs-macros" } util-macros = { path = "../util-macros" } diff --git a/ecs/src/lock.rs b/ecs/src/lock.rs index bc5351f..74b0415 100644 --- a/ecs/src/lock.rs +++ b/ecs/src/lock.rs @@ -1,6 +1,7 @@ use std::mem::transmute; use std::ops::{Deref, DerefMut}; -use std::sync::{PoisonError, RwLock, RwLockReadGuard, RwLockWriteGuard, TryLockError}; + +use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard}; use crate::type_name::TypeName; @@ -27,10 +28,8 @@ where /// Returns `Err` if unavailable (A mutable handle is hold). pub fn read_nonblock(&self) -> Result, Error> { - let guard = self.inner.try_read().or_else(|err| match err { - TryLockError::WouldBlock => Err(Error::ReadUnavailable), - TryLockError::Poisoned(poison_err) => Ok(poison_err.into_inner()), - })?; + let guard = self.inner.try_read().ok_or(Error::ReadUnavailable)?; + tracing::trace!("Acquired lock to value of type {}", guard.type_name()); Ok(ReadGuard { inner: guard }) @@ -42,10 +41,8 @@ where /// Returns `Err` if unavailable (A mutable or immutable handle is hold). pub fn write_nonblock(&self) -> Result, Error> { - let guard = self.inner.try_write().or_else(|err| match err { - TryLockError::WouldBlock => Err(Error::WriteUnavailable), - TryLockError::Poisoned(poison_err) => Ok(poison_err.into_inner()), - })?; + let guard = self.inner.try_write().ok_or(Error::WriteUnavailable)?; + tracing::trace!( "Acquired mutable lock to value of type {}", guard.type_name() @@ -56,9 +53,7 @@ where pub fn into_inner(self) -> Value { - self.inner - .into_inner() - .unwrap_or_else(PoisonError::into_inner) + self.inner.into_inner() } } diff --git a/ecs/src/system.rs b/ecs/src/system.rs index a810741..48c2723 100644 --- a/ecs/src/system.rs +++ b/ecs/src/system.rs @@ -3,7 +3,6 @@ use std::convert::Infallible; use std::fmt::Debug; use std::marker::PhantomData; use std::ops::{Deref, DerefMut}; -use std::panic::{RefUnwindSafe, UnwindSafe}; use ecs_macros::Component; use seq_macro::seq; @@ -49,7 +48,7 @@ macro_rules! impl_system { impl<'world, Func, #(TParam~I,)*> System<'world, fn(#(TParam~I,)*)> for Func where - Func: Fn(#(TParam~I,)*) + Copy + RefUnwindSafe + UnwindSafe + 'static, + Func: Fn(#(TParam~I,)*) + Copy + 'static, #(TParam~I: Param<'world, Input = ()>,)* { type Input = Infallible; @@ -123,7 +122,7 @@ pub trait Into pub struct TypeErased { - data: Box, + data: Box, run: Box, } @@ -151,7 +150,7 @@ impl Debug for TypeErased } /// Function in [`TypeErased`] used to run the system. -type TypeErasedRunFn = dyn Fn(&dyn Any, &World) + RefUnwindSafe + UnwindSafe; +type TypeErasedRunFn = dyn Fn(&dyn Any, &World); /// A parameter to a [`System`]. pub trait Param<'world> -- cgit v1.2.3-18-g5258