Auto merge of #14278 - emilio:layout-data-in-script, r=Ms2ger

style: Don't assert when the final rule tree GC happens in script.

This should silence the assertions in https://github.com/servo/servo/issues/14213.

r? @Ms2ger

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/14278)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-11-20 14:23:39 -06:00 committed by GitHub
commit 976989fc8d

View file

@ -427,15 +427,23 @@ impl StrongRuleNode {
}
unsafe fn pop_from_free_list(&self) -> Option<WeakRuleNode> {
debug_assert!(thread_state::get().is_layout() &&
!thread_state::get().is_worker());
// NB: This can run from the root node destructor, so we can't use
// `get()`, since it asserts the refcount is bigger than zero.
let me = &*self.ptr;
debug_assert!(me.is_root());
// FIXME(#14213): Apparently the layout data can be gone from script.
//
// That's... suspicious, but it's fine if it happens for the rule tree
// case, so just don't crash in the case we're doing the final GC in
// script.
debug_assert!(!thread_state::get().is_worker() &&
(thread_state::get().is_layout() ||
(thread_state::get().is_script() &&
me.refcount.load(Ordering::SeqCst) == 0)));
let current = me.next_free.load(Ordering::SeqCst);
if current == FREE_LIST_SENTINEL {
return None;
}