aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBobby Holley <bobbyholley@gmail.com>2018-01-11 13:48:36 -0800
committerBobby Holley <bobbyholley@gmail.com>2018-01-12 10:19:06 -0800
commitac74cf7a603621444411b3dd4b37a157df73b5cc (patch)
tree3c55089beb24720f6760e03b04d85afeef8aff8f
parenta061f2a89f4b733216e9d5b3c0dbc5dfa49fcc26 (diff)
downloadservo-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.rs4
-rw-r--r--ports/geckolib/glue.rs11
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)
}