summaryrefslogtreecommitdiff
path: root/ecs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2025-02-04 18:04:32 +0100
committerHampusM <hampus@hampusmat.com>2025-02-04 18:04:32 +0100
commit76d782195e3cc19832ad57ffffda4e953c6970b3 (patch)
treebd237c61ff895bd71e79a05338727c0ed68ef677 /ecs
parent0d75299fe6b04e0866a44ad484b42703c6a9aa26 (diff)
chore(ecs): use parking_lot for inner rwlock of Lock
Diffstat (limited to 'ecs')
-rw-r--r--ecs/Cargo.toml1
-rw-r--r--ecs/src/lock.rs19
-rw-r--r--ecs/src/system.rs7
3 files changed, 11 insertions, 16 deletions
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<ReadGuard<Value>, 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<WriteGuard<Value>, 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<Impl>
pub struct TypeErased
{
- data: Box<dyn Any + RefUnwindSafe + UnwindSafe>,
+ data: Box<dyn Any>,
run: Box<TypeErasedRunFn>,
}
@@ -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>