* [yew-devel] [PATCH yew-widget-toolkit v2 0/2] improve error message on store locks and add non-panicking functions
@ 2025-05-06 12:44 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
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Shannon Sterz @ 2025-05-06 12:44 UTC (permalink / raw)
To: yew-devel
this series adds more context to a locking failure in the first commit.
the second commit then adds functions that allow components to recover
from not being able to acquire a lock, instead of simply panicking.
--
changes since v1 (thanks @ Dominik):
- rephrase the commit message of the first commit
changes since rfc:
- don't use `UnwrapThrowExt` as it does not improve error handling
meaningfully. (thanks @ Dominik)
- add `try_read()` and `try_write()` functions to allow components to
recover from not being able to acquire a lock instead of panicking.
--
Shannon Sterz (2):
store: use try_borrow and expect for better error messages
store: add try_read() and try_write() functions
src/state/store.rs | 32 +++++++++++++++++++++++++-------
1 file changed, 25 insertions(+), 7 deletions(-)
--
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 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
* [yew-devel] applied: [PATCH yew-widget-toolkit v2 0/2] improve error message on store locks and add non-panicking 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 ` [yew-devel] [PATCH yew-widget-toolkit v2 2/2] store: add try_read() and try_write() functions Shannon Sterz
@ 2025-05-07 8:25 ` Dietmar Maurer
2 siblings, 0 replies; 4+ messages in thread
From: Dietmar Maurer @ 2025-05-07 8:25 UTC (permalink / raw)
To: Yew framework devel list at Proxmox, Shannon Sterz
applied
_______________________________________________
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
end of thread, other threads:[~2025-05-07 8:25 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 ` [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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox