* [yew-devel] [PATCH yew-widget-toolkit v2 1/2] store: use try_borrow and expect for better error messages
2025-05-06 12:44 [yew-devel] [PATCH yew-widget-toolkit v2 0/2] improve error message on store locks and add non-panicking functions Shannon Sterz
@ 2025-05-06 12:44 ` Shannon Sterz
2025-05-06 12:44 ` [yew-devel] [PATCH yew-widget-toolkit v2 2/2] store: add try_read() and try_write() functions Shannon Sterz
2025-05-07 8:25 ` [yew-devel] applied: [PATCH yew-widget-toolkit v2 0/2] improve error message on store locks and add non-panicking functions Dietmar Maurer
2 siblings, 0 replies; 4+ messages in thread
From: Shannon Sterz @ 2025-05-06 12:44 UTC (permalink / raw)
To: yew-devel
this commit adds more context for panics based on failed locks. this
is done by using `try_borrow()` and calling `expect()` on the result.
Signed-off-by: Shannon Sterz <s.sterz@proxmox.com>
---
src/state/store.rs | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/state/store.rs b/src/state/store.rs
index bde7d9da..67e72b77 100644
--- a/src/state/store.rs
+++ b/src/state/store.rs
@@ -130,7 +130,10 @@ impl<T: 'static> Store<T> {
/// Panics if the value is currently mutably locked.
pub fn read(&self) -> StoreReadGuard<T> {
StoreReadGuard {
- state: self.inner.borrow(),
+ state: self
+ .inner
+ .try_borrow()
+ .expect("Could not acquire read lock on store!"),
}
}
@@ -142,7 +145,11 @@ impl<T: 'static> Store<T> {
/// When the returned [StoreWriteGuard] is dropped, the store listeners
/// are notified. To prevent that use [StoreWriteGuard::skip_update]
pub fn write(&self) -> StoreWriteGuard<T> {
- let state = self.inner.borrow_mut();
+ let state = self
+ .inner
+ .try_borrow_mut()
+ .expect("Could not acquire write lock on store!");
+
StoreWriteGuard {
state,
update: true,
--
2.39.5
_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
* [yew-devel] [PATCH yew-widget-toolkit v2 2/2] store: add try_read() and try_write() functions
2025-05-06 12:44 [yew-devel] [PATCH yew-widget-toolkit v2 0/2] improve error message on store locks and add non-panicking functions Shannon Sterz
2025-05-06 12:44 ` [yew-devel] [PATCH yew-widget-toolkit v2 1/2] store: use try_borrow and expect for better error messages Shannon Sterz
@ 2025-05-06 12:44 ` Shannon Sterz
2025-05-07 8:25 ` [yew-devel] applied: [PATCH yew-widget-toolkit v2 0/2] improve error message on store locks and add non-panicking functions Dietmar Maurer
2 siblings, 0 replies; 4+ messages in thread
From: Shannon Sterz @ 2025-05-06 12:44 UTC (permalink / raw)
To: yew-devel
these let users of the store decide whether failure to acquire a lock
on a store is critical enough to panic or whether this scenario can be
handled just fine.
Signed-off-by: Shannon Sterz <s.sterz@proxmox.com>
---
src/state/store.rs | 37 ++++++++++++++++++++++++-------------
1 file changed, 24 insertions(+), 13 deletions(-)
diff --git a/src/state/store.rs b/src/state/store.rs
index 67e72b77..42cb53b3 100644
--- a/src/state/store.rs
+++ b/src/state/store.rs
@@ -3,6 +3,7 @@ use std::ops::Range;
use std::ops::{Deref, DerefMut};
use std::rc::Rc;
+use anyhow::Error;
use derivative::Derivative;
use slab::Slab;
@@ -129,12 +130,18 @@ impl<T: 'static> Store<T> {
///
/// Panics if the value is currently mutably locked.
pub fn read(&self) -> StoreReadGuard<T> {
- StoreReadGuard {
- state: self
- .inner
- .try_borrow()
- .expect("Could not acquire read lock on store!"),
- }
+ self.try_read()
+ .expect("Could not acquire read lock on store!")
+ }
+
+ /// Try to lock this store for read access.
+ ///
+ /// Will return an error if the lock could not be acquired due to a write lock still being in
+ /// place.
+ pub fn try_read(&self) -> Result<StoreReadGuard<T>, Error> {
+ Ok(StoreReadGuard {
+ state: self.inner.try_borrow()?,
+ })
}
/// Lock this store for write access.
@@ -145,15 +152,19 @@ impl<T: 'static> Store<T> {
/// When the returned [StoreWriteGuard] is dropped, the store listeners
/// are notified. To prevent that use [StoreWriteGuard::skip_update]
pub fn write(&self) -> StoreWriteGuard<T> {
- let state = self
- .inner
- .try_borrow_mut()
- .expect("Could not acquire write lock on store!");
+ self.try_write()
+ .expect("Could not acquire write lock on store!")
+ }
- StoreWriteGuard {
- state,
+ /// Try to lock this store for write access.
+ ///
+ /// Will return an error if the lock could not be acquired due to a read or write lock still
+ /// being in place.
+ pub fn try_write(&self) -> Result<StoreWriteGuard<T>, Error> {
+ Ok(StoreWriteGuard {
+ state: self.inner.try_borrow_mut()?,
update: true,
- }
+ })
}
// DataStore trait implementation, so that we can use those
--
2.39.5
_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel
^ permalink raw reply [flat|nested] 4+ messages in thread