diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2020-06-05 00:10:14 +0200 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2020-06-05 00:11:37 +0200 |
commit | 57d89675b01b49c573b14c1fd0be413d52b8ccdd (patch) | |
tree | 78f4bb9f02223a8e5cb0e724c9cc1dd28ac863a0 /components/script | |
parent | 3367db6067a8d76061e7884e54cc61ce44012442 (diff) | |
download | servo-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.py | 12 |
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 ) + |