diff options
Diffstat (limited to 'src/components/main/layout/parallel.rs')
-rw-r--r-- | src/components/main/layout/parallel.rs | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/components/main/layout/parallel.rs b/src/components/main/layout/parallel.rs index 983ba09d4d5..44ce3b9fad8 100644 --- a/src/components/main/layout/parallel.rs +++ b/src/components/main/layout/parallel.rs @@ -299,7 +299,15 @@ fn recalc_style_for_node(unsafe_layout_node: UnsafeLayoutNode, } &None => fail!("no layout data"), } + } + // It's *very* important that this block is in a separate scope to the block above, + // to avoid a data race that can occur (github issue #2308). The block above issues + // a borrow on the node layout data. That borrow must be dropped before the child + // nodes are actually pushed into the work queue. Otherwise, it's possible for a child + // node to get into construct_flows() and move up it's parent hierarchy, which can call + // borrow on the layout data before it is dropped from the block above. + if child_count != 0 { // Enqueue kids. for kid in node.children() { proxy.push(WorkUnit { |