* [yew-devel] [PATCH yew-widget-toolkit v1 1/2] store: use try_borrow and expect_throw for better error messages
@ 2025-05-06 11:54 Shannon Sterz
2025-05-06 11:54 ` [yew-devel] [PATCH yew-widget-toolkit v1 2/2] store: add try_read() and try_write() functions Shannon Sterz
2025-05-06 12:21 ` [yew-devel] [PATCH yew-widget-toolkit v1 1/2] store: use try_borrow and expect_throw for better error messages Dominik Csapak
0 siblings, 2 replies; 4+ messages in thread
From: Shannon Sterz @ 2025-05-06 11:54 UTC (permalink / raw)
To: yew-devel
this makes use of the `UnwrapThrowExt` trait to improve error messages
when acquring store locks. taking such locks in async functions can
sometimes lead to bugs that can be unreliably reproduced, this should
provide more information about the source of the error compared to
just panicking.
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 v1 2/2] store: add try_read() and try_write() functions
2025-05-06 11:54 [yew-devel] [PATCH yew-widget-toolkit v1 1/2] store: use try_borrow and expect_throw for better error messages Shannon Sterz
@ 2025-05-06 11:54 ` Shannon Sterz
2025-05-06 12:21 ` [yew-devel] [PATCH yew-widget-toolkit v1 1/2] store: use try_borrow and expect_throw for better error messages Dominik Csapak
1 sibling, 0 replies; 4+ messages in thread
From: Shannon Sterz @ 2025-05-06 11:54 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
* Re: [yew-devel] [PATCH yew-widget-toolkit v1 1/2] store: use try_borrow and expect_throw for better error messages
2025-05-06 11:54 [yew-devel] [PATCH yew-widget-toolkit v1 1/2] store: use try_borrow and expect_throw for better error messages Shannon Sterz
2025-05-06 11:54 ` [yew-devel] [PATCH yew-widget-toolkit v1 2/2] store: add try_read() and try_write() functions Shannon Sterz
@ 2025-05-06 12:21 ` Dominik Csapak
2025-05-06 12:26 ` Shannon Sterz
1 sibling, 1 reply; 4+ messages in thread
From: Dominik Csapak @ 2025-05-06 12:21 UTC (permalink / raw)
To: yew-devel
On 5/6/25 13:54, Shannon Sterz wrote:
> this makes use of the `UnwrapThrowExt` trait to improve error messages
nit: this is not true anymore in v1
could maybe fixed up on applying though
> when acquring store locks. taking such locks in async functions can
> sometimes lead to bugs that can be unreliably reproduced, this should
> provide more information about the source of the error compared to
> just panicking.
>
> 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,
_______________________________________________
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
* Re: [yew-devel] [PATCH yew-widget-toolkit v1 1/2] store: use try_borrow and expect_throw for better error messages
2025-05-06 12:21 ` [yew-devel] [PATCH yew-widget-toolkit v1 1/2] store: use try_borrow and expect_throw for better error messages Dominik Csapak
@ 2025-05-06 12:26 ` Shannon Sterz
0 siblings, 0 replies; 4+ messages in thread
From: Shannon Sterz @ 2025-05-06 12:26 UTC (permalink / raw)
To: Yew framework devel list at Proxmox, Dominik Csapak
On Tue May 6, 2025 at 2:21 PM CEST, Dominik Csapak wrote:
> On 5/6/25 13:54, Shannon Sterz wrote:
>> this makes use of the `UnwrapThrowExt` trait to improve error messages
>
> nit: this is not true anymore in v1
>
> could maybe fixed up on applying though
yes missed that sorry, will send a v2
>
>> when acquring store locks. taking such locks in async functions can
>> sometimes lead to bugs that can be unreliably reproduced, this should
>> provide more information about the source of the error compared to
>> just panicking.
>>
>> 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,
>
>
>
> _______________________________________________
> yew-devel mailing list
> yew-devel@lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel
_______________________________________________
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-06 12:26 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-05-06 11:54 [yew-devel] [PATCH yew-widget-toolkit v1 1/2] store: use try_borrow and expect_throw for better error messages Shannon Sterz
2025-05-06 11:54 ` [yew-devel] [PATCH yew-widget-toolkit v1 2/2] store: add try_read() and try_write() functions Shannon Sterz
2025-05-06 12:21 ` [yew-devel] [PATCH yew-widget-toolkit v1 1/2] store: use try_borrow and expect_throw for better error messages Dominik Csapak
2025-05-06 12:26 ` Shannon Sterz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox