aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2020-06-05 00:10:14 +0200
committerSimon Sapin <simon.sapin@exyr.org>2020-06-05 00:11:37 +0200
commit57d89675b01b49c573b14c1fd0be413d52b8ccdd (patch)
tree78f4bb9f02223a8e5cb0e724c9cc1dd28ac863a0 /components/script
parent3367db6067a8d76061e7884e54cc61ce44012442 (diff)
downloadservo-57d89675b01b49c573b14c1fd0be413d52b8ccdd.tar.gz
servo-57d89675b01b49c573b14c1fd0be413d52b8ccdd.zip
Use atomic pointers instead of `static mut` for DOM proxy handlers
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py12
1 files changed, 9 insertions, 3 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 5440884ab16..b0361d6ca47 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -2750,7 +2750,9 @@ class CGWrapMethod(CGAbstractMethod):
unforgeable = CopyUnforgeablePropertiesToInstance(self.descriptor)
if self.descriptor.proxy:
create = """
-let handler = RegisterBindings::proxy_handlers::%(concreteType)s;
+let handler: *const libc::c_void =
+ RegisterBindings::proxy_handlers::%(concreteType)s
+ .load(std::sync::atomic::Ordering::Acquire);
rooted!(in(*cx) let obj = NewProxyObject(
*cx,
handler,
@@ -6744,7 +6746,10 @@ class CGRegisterProxyHandlersMethod(CGAbstractMethod):
def definition_body(self):
return CGList([
- CGGeneric("proxy_handlers::%s = Bindings::%s::DefineProxyHandler();"
+ CGGeneric("proxy_handlers::%s.store(\n"
+ " Bindings::%s::DefineProxyHandler() as *mut _,\n"
+ " std::sync::atomic::Ordering::Release,\n"
+ ");"
% (desc.name, '::'.join([desc.name + 'Binding'] * 2)))
for desc in self.descriptors
], "\n")
@@ -6758,7 +6763,8 @@ class CGRegisterProxyHandlers(CGThing):
"#[allow(non_upper_case_globals)]\n" +
"pub mod proxy_handlers {\n" +
"".join(
- " pub static mut %s: *const libc::c_void = std::ptr::null();\n"
+ " pub static %s: std::sync::atomic::AtomicPtr<libc::c_void> =\n"
+ " std::sync::atomic::AtomicPtr::new(std::ptr::null_mut());\n"
% desc.name
for desc in descriptors
) +