diff options
author | Glenn Watson <gw@intuitionlibrary.com> | 2014-05-08 15:45:20 +1000 |
---|---|---|
committer | Glenn Watson <gw@intuitionlibrary.com> | 2014-05-08 15:45:20 +1000 |
commit | d11716e27b539a98bba64f25c79c06ad92a409aa (patch) | |
tree | 8a3eeaa0810f8d4e9e7d824112926f2e0d5a129e | |
parent | 15d3257a29125103e368787f7e9790ee4314b29f (diff) | |
download | servo-d11716e27b539a98bba64f25c79c06ad92a409aa.tar.gz servo-d11716e27b539a98bba64f25c79c06ad92a409aa.zip |
Fix for parallel data race in layout code. Fixes #2308.
-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 { |