public inbox for yew-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Shannon Sterz <s.sterz@proxmox.com>
To: yew-devel@lists.proxmox.com
Subject: [yew-devel] [RFC PATCH] store: use try_borrow and expect_throw for better error messages
Date: Mon,  5 May 2025 15:28:23 +0200	[thread overview]
Message-ID: <20250505132823.237431-1-s.sterz@proxmox.com> (raw)

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>
---

alternatively we could return the error here directly (or wrap it) and
let the call site handle such errors. however, that would require
breaking this public api, so i decided against this for now.

 src/state/store.rs | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/state/store.rs b/src/state/store.rs
index bde7d9da..b071182c 100644
--- a/src/state/store.rs
+++ b/src/state/store.rs
@@ -10,6 +10,8 @@ use yew::html::IntoEventCallback;
 use yew::prelude::*;
 use yew::virtual_dom::Key;

+use wasm_bindgen::UnwrapThrowExt;
+
 use crate::props::{
     ExtractKeyFn, ExtractPrimaryKey, FilterFn, IntoFilterFn, IntoSorterFn, SorterFn,
 };
@@ -130,7 +132,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_throw("Could not acquire read lock on store!"),
         }
     }

@@ -142,7 +147,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_throw("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


             reply	other threads:[~2025-05-05 13:28 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-05 13:28 Shannon Sterz [this message]
2025-05-06  8:49 ` Dominik Csapak
2025-05-06  9:09   ` Shannon Sterz
2025-05-06  9:19     ` Dominik Csapak

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250505132823.237431-1-s.sterz@proxmox.com \
    --to=s.sterz@proxmox.com \
    --cc=yew-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal