servo / font-kit

A cross-platform font loading library written in Rust
Apache License 2.0
678 stars 100 forks source link

`select_best_match` leaks memory on Mac #161

Closed kaiwk closed 3 years ago

kaiwk commented 3 years ago

The code below keeps increasing memory usage on Mac

use font_kit::family_name::FamilyName;
use font_kit::handle::Handle;
use font_kit::properties::Properties;
use font_kit::source::SystemSource;
use std::env;
use std::thread;
use std::time::Duration;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let families = vec![FamilyName::Title("Times".to_string())];
    let mut i = 0;
    loop {
        let properties = Properties::default();
        let handle = SystemSource::new().select_best_match(&families, &properties)?;
        std::thread::sleep(Duration::from_secs(2));
        i += 1;
        if i > 10000 {
            break;
        }
    }
    Ok(())
}
kaiwk commented 3 years ago

Looks like we should use CTFontManagerCreateFontDescriptorFromData in loaders::core_text::Font::from_bytes from this post.

Also, you should consider using CTFontManagerCreateFontDescriptorFromData() or CTFontManagerCreateFontDescriptorsFromURL() and then CTFontCreateWithFontDescriptor(), avoiding CGFont entirely.