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

This commit is contained in:
Emilio Cobos Álvarez 2016-11-18 17:33:22 +01:00
parent 72e4c6dc21
commit 5c98dffea6
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C

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;
}