From f0f39904a2361e1d249a4fe359660d9c6516afe8 Mon Sep 17 00:00:00 2001 From: Bobby Holley Date: Tue, 2 Aug 2016 22:03:15 -0700 Subject: [PATCH] Explicitly allocate and deallocate our initial computed values. This allows us to trigger style struct destructors before Gecko's leak checking runs. --- components/style/properties/gecko.mako.rs | 37 +++++++++++++++-------- ports/geckolib/gecko_bindings/bindings.rs | 1 + ports/geckolib/glue.rs | 9 ++++++ 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 24893da9f7b..bb8fd5220fa 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -100,7 +100,30 @@ impl ComputedValues { ComputedValues::inherit_from(parent) } - pub fn initial_values() -> &'static Self { &*INITIAL_GECKO_VALUES } + pub fn initial_values() -> &'static Self { + unsafe { + debug_assert!(!INITIAL_GECKO_VALUES.is_null()); + &*INITIAL_GECKO_VALUES + } + } + + pub unsafe fn initialize() { + debug_assert!(INITIAL_GECKO_VALUES.is_null()); + INITIAL_GECKO_VALUES = Box::into_raw(Box::new(ComputedValues { + % for style_struct in data.style_structs: + ${style_struct.ident}: style_structs::${style_struct.name}::initial(), + % endfor + custom_properties: None, + shareable: true, + writing_mode: WritingMode::empty(), + root_font_size: longhands::font_size::get_initial_value(), + })); + } + + pub unsafe fn shutdown() { + debug_assert!(!INITIAL_GECKO_VALUES.is_null()); + let _ = Box::from_raw(INITIAL_GECKO_VALUES); + } #[inline] pub fn do_cascade_property(f: F) { @@ -1338,17 +1361,7 @@ ${impl_style_struct(style_struct)} ${define_ffi_struct_accessor(style_struct)} % endfor -lazy_static! { - pub static ref INITIAL_GECKO_VALUES: ComputedValues = ComputedValues { - % for style_struct in data.style_structs: - ${style_struct.ident}: style_structs::${style_struct.name}::initial(), - % endfor - custom_properties: None, - shareable: true, - writing_mode: WritingMode::empty(), - root_font_size: longhands::font_size::get_initial_value(), - }; -} +static mut INITIAL_GECKO_VALUES: *mut ComputedValues = 0 as *mut ComputedValues; static CASCADE_PROPERTY: [CascadePropertyFn; ${len(data.longhands)}] = [ % for property in data.longhands: diff --git a/ports/geckolib/gecko_bindings/bindings.rs b/ports/geckolib/gecko_bindings/bindings.rs index 10d2bbb7c43..309805e6ae8 100644 --- a/ports/geckolib/gecko_bindings/bindings.rs +++ b/ports/geckolib/gecko_bindings/bindings.rs @@ -368,6 +368,7 @@ extern "C" { pub fn Servo_AddRefComputedValues(arg1: *mut ServoComputedValues); pub fn Servo_ReleaseComputedValues(arg1: *mut ServoComputedValues); pub fn Servo_Initialize(); + pub fn Servo_Shutdown(); pub fn Servo_RestyleDocument(doc: *mut RawGeckoDocument, set: *mut RawServoStyleSet); pub fn Servo_RestyleSubtree(node: *mut RawGeckoNode, diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index f0c7f2446d4..98932fb8efc 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -76,6 +76,15 @@ pub extern "C" fn Servo_Initialize() -> () { // // See https://doc.rust-lang.org/log/env_logger/index.html for instructions. env_logger::init().unwrap(); + + // Allocate our default computed values. + unsafe { ComputedValues::initialize(); } +} + +#[no_mangle] +pub extern "C" fn Servo_Shutdown() -> () { + // Destroy our default computed values. + unsafe { ComputedValues::shutdown(); } } fn restyle_subtree(node: GeckoNode, raw_data: *mut RawServoStyleSet) {