diff options
author | Bobby Holley <bobbyholley@gmail.com> | 2018-01-11 13:48:36 -0800 |
---|---|---|
committer | Bobby Holley <bobbyholley@gmail.com> | 2018-01-12 10:19:06 -0800 |
commit | ac74cf7a603621444411b3dd4b37a157df73b5cc (patch) | |
tree | 3c55089beb24720f6760e03b04d85afeef8aff8f | |
parent | a061f2a89f4b733216e9d5b3c0dbc5dfa49fcc26 (diff) | |
download | servo-ac74cf7a603621444411b3dd4b37a157df73b5cc.tar.gz servo-ac74cf7a603621444411b3dd4b37a157df73b5cc.zip |
Add machinery to assert single-threadedness from geckolib.
MozReview-Commit-ID: 9LBNm2h5Ct3
-rw-r--r-- | components/style/gecko/generated/bindings.rs | 4 | ||||
-rw-r--r-- | ports/geckolib/glue.rs | 11 |
2 files changed, 15 insertions, 0 deletions
diff --git a/components/style/gecko/generated/bindings.rs b/components/style/gecko/generated/bindings.rs index 3e8276c8885..eacccb5dafc 100644 --- a/components/style/gecko/generated/bindings.rs +++ b/components/style/gecko/generated/bindings.rs @@ -1597,4 +1597,8 @@ extern "C" { pub fn Gecko_GetElementsWithId ( aDocument : * const nsIDocument , aId : * mut nsAtom , ) -> * const nsTArray < * mut Element > ; } extern "C" { pub fn Gecko_GetBoolPrefValue ( pref_name : * const :: std :: os :: raw :: c_char , ) -> bool ; +} extern "C" { + pub fn Gecko_IsInServoTraversal ( ) -> bool ; +} extern "C" { + pub fn Gecko_IsMainThread ( ) -> bool ; }
\ No newline at end of file diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 31ec4bfa6f7..abf966ce937 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -216,6 +216,16 @@ unsafe fn dummy_url_data() -> &'static RefPtr<URLExtraData> { RefPtr::from_ptr_ref(&DUMMY_URL_DATA) } +#[allow(dead_code)] +fn is_main_thread() -> bool { + unsafe { bindings::Gecko_IsMainThread() } +} + +#[allow(dead_code)] +fn is_in_servo_traversal() -> bool { + unsafe { bindings::Gecko_IsInServoTraversal() } +} + fn create_shared_context<'a>( global_style_data: &GlobalStyleData, guard: &'a SharedRwLockReadGuard, @@ -1335,6 +1345,7 @@ fn read_locked_arc<T, R, F>(raw: &<Locked<T> as HasFFI>::FFIType, func: F) -> R unsafe fn read_locked_arc_unchecked<T, R, F>(raw: &<Locked<T> as HasFFI>::FFIType, func: F) -> R where Locked<T>: HasArcFFI, F: FnOnce(&T) -> R { + debug_assert!(is_main_thread() && !is_in_servo_traversal()); read_locked_arc(raw, func) } |