Skip to content

Commit

Permalink
Agent: Avoiding clone of WorkerBridge and WorkerProviderState (#3435)
Browse files Browse the repository at this point in the history
* Agent V2: fix #3434 by avoiding clone of WorkerBridge

* remove the Clone of WorkerProviderState
  • Loading branch information
deftsp committed Oct 9, 2023
1 parent da3f726 commit 04909dd
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 24 deletions.
2 changes: 1 addition & 1 deletion packages/yew-agent/src/scope_ext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ where
W: Worker + 'static,
{
let inner = self
.context::<WorkerProviderState<W>>((|_| {}).into())
.context::<Rc<WorkerProviderState<W>>>((|_| {}).into())
.expect_throw("failed to bridge to agent.")
.0
.create_bridge(callback);
Expand Down
6 changes: 3 additions & 3 deletions packages/yew-agent/src/worker/hooks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ pub struct UseWorkerBridgeHandle<T>
where
T: Worker,
{
inner: WorkerBridge<T>,
inner: Rc<WorkerBridge<T>>,
ctr: UseReducerDispatcher<BridgeIdState>,
}

Expand Down Expand Up @@ -84,7 +84,7 @@ where
{
let ctr = use_reducer(BridgeIdState::default);

let worker_state = use_context::<WorkerProviderState<T>>()
let worker_state = use_context::<Rc<WorkerProviderState<T>>>()
.expect_throw("cannot find a provider for current agent.");

let on_output = Rc::new(on_output);
Expand All @@ -106,7 +106,7 @@ where
});

UseWorkerBridgeHandle {
inner: (*bridge).clone(),
inner: bridge,
ctr: ctr.dispatcher(),
}
}
Expand Down
26 changes: 6 additions & 20 deletions packages/yew-agent/src/worker/provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ where
id: usize,
spawn_bridge_fn: Rc<dyn Fn() -> WorkerBridge<W>>,
reach: Reach,
held_bridge: Rc<RefCell<Option<WorkerBridge<W>>>>,
held_bridge: RefCell<Option<Rc<WorkerBridge<W>>>>,
}

impl<W> fmt::Debug for WorkerProviderState<W>
Expand All @@ -63,13 +63,13 @@ where
W: Worker,
W::Output: 'static,
{
fn get_held_bridge(&self) -> WorkerBridge<W> {
fn get_held_bridge(&self) -> Rc<WorkerBridge<W>> {
let mut held_bridge = self.held_bridge.borrow_mut();

match held_bridge.as_mut() {
Some(m) => m.clone(),
None => {
let bridge = (self.spawn_bridge_fn)();
let bridge = Rc::new((self.spawn_bridge_fn)());
*held_bridge = Some(bridge.clone());
bridge
}
Expand All @@ -88,20 +88,6 @@ where
}
}

impl<W> Clone for WorkerProviderState<W>
where
W: Worker,
{
fn clone(&self) -> Self {
Self {
id: self.id,
spawn_bridge_fn: self.spawn_bridge_fn.clone(),
reach: self.reach,
held_bridge: self.held_bridge.clone(),
}
}
}

impl<W> PartialEq for WorkerProviderState<W>
where
W: Worker,
Expand Down Expand Up @@ -141,7 +127,7 @@ where
id: get_next_id(),
spawn_bridge_fn,
reach: *reach,
held_bridge: Rc::default(),
held_bridge: Default::default(),
};

if *reach == Reach::Public && !*lazy {
Expand All @@ -152,8 +138,8 @@ where
};

html! {
<ContextProvider<WorkerProviderState<W>> context={(*state).clone()}>
<ContextProvider<Rc<WorkerProviderState<W>>> context={state.clone()}>
{children}
</ContextProvider<WorkerProviderState<W>>>
</ContextProvider<Rc<WorkerProviderState<W>>>>
}
}

0 comments on commit 04909dd

Please sign in to comment.