diff --git a/packages/native-core/src/passes.rs b/packages/native-core/src/passes.rs index fd15e2ae6..c393cf119 100644 --- a/packages/native-core/src/passes.rs +++ b/packages/native-core/src/passes.rs @@ -310,11 +310,7 @@ impl AnyPass { } } -struct RawPointer(*mut T); -unsafe impl Send for RawPointer {} -unsafe impl Sync for RawPointer {} - -pub fn resolve_passes + Sync>( +pub fn resolve_passes + Sync + Send>( tree: &mut Tr, dirty_nodes: DirtyNodeStates, mut passes: Vec<&AnyPass>, @@ -342,19 +338,21 @@ pub fn resolve_passes + Sync>( let pass = passes.remove(i); resolving.push(pass_id); currently_borrowed |= pass_mask; - let tree_mut = tree as *mut _; - let raw_ptr = RawPointer(tree_mut); + let tree_mut_unbounded = unsafe { &mut *(tree as *mut _ as *mut Tr) }; let dirty_states = dirty_states.clone(); let nodes_updated = nodes_updated.clone(); let ctx = ctx.clone(); - s.spawn(move || unsafe { - // let tree_mut: &mut Tr = &mut *raw_ptr.0; - let raw = raw_ptr; + s.spawn(move || { // this is safe because the member_mask acts as a per-member mutex and we have verified that the pass does not overlap with any other pass - let tree_mut: &mut Tr = &mut *raw.0; let mut dirty = DirtyNodes::default(); - dirty_states.all_dirty(pass_id, &mut dirty, tree_mut); - pass.resolve(tree_mut, dirty, &dirty_states, &nodes_updated, &ctx); + dirty_states.all_dirty(pass_id, &mut dirty, tree_mut_unbounded); + pass.resolve( + tree_mut_unbounded, + dirty, + &dirty_states, + &nodes_updated, + &ctx, + ); }); } else { i += 1; diff --git a/packages/native-core/src/real_dom.rs b/packages/native-core/src/real_dom.rs index 2258f524b..4ef4d89c0 100644 --- a/packages/native-core/src/real_dom.rs +++ b/packages/native-core/src/real_dom.rs @@ -398,7 +398,7 @@ impl RealDom { impl RealDom where - Tree>: Sync, + Tree>: Sync + Send, { /// Update the state of the dom, after appling some mutations. This will keep the nodes in the dom up to date with their VNode counterparts. /// This will resolve the state in parallel diff --git a/packages/native-core/src/state.rs b/packages/native-core/src/state.rs index 54dad4997..9bedd19be 100644 --- a/packages/native-core/src/state.rs +++ b/packages/native-core/src/state.rs @@ -217,7 +217,7 @@ pub trait State: Default + Clone + 'static { const MASKS: &'static [NodeMask]; #[doc(hidden)] - fn update> + Sync>( + fn update> + Sync + Send>( dirty: DirtyNodeStates, tree: &mut T, ctx: SendAnyMap,