From 1b408bdd8ffb4988453defb098d989a133850e45 Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Mon, 23 Mar 2015 15:59:19 -0700 Subject: [PATCH 1/2] Memory leak fixes (wip) --- src/glyphs.cpp | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/glyphs.cpp b/src/glyphs.cpp index 55cca879e..8aae9a575 100644 --- a/src/glyphs.cpp +++ b/src/glyphs.cpp @@ -168,10 +168,35 @@ NAN_METHOD(Range) { NanReturnUndefined(); } +struct ft_library_guard { + ft_library_guard(FT_Library lib) : + library_(lib) {} + + ~ft_library_guard() + { + if (library_) FT_Done_FreeType(library_); + } + + FT_Library library_; +}; + +struct ft_glyph_guard { + ft_glyph_guard(FT_Glyph glyph) : + glyph_(glyph) {} + + ~ft_glyph_guard() + { + if (glyph_) FT_Done_Glyph(glyph_); + } + + FT_Glyph glyph_; +}; + void LoadAsync(uv_work_t* req) { LoadBaton* baton = static_cast(req->data); FT_Library library = nullptr; + ft_library_guard library_guard(library); FT_Error error = FT_Init_FreeType(&library); if (error) { /* LCOV_EXCL_START */ @@ -205,7 +230,6 @@ void LoadAsync(uv_work_t* req) { FT_Done_Face(ft_face); } } - FT_Done_FreeType(library); }; void AfterLoad(uv_work_t* req) { @@ -246,6 +270,7 @@ void RangeAsync(uv_work_t* req) { } FT_Library library = nullptr; + ft_library_guard library_guard(library); FT_Error error = FT_Init_FreeType(&library); if (error) { /* LCOV_EXCL_START */ @@ -309,8 +334,6 @@ void RangeAsync(uv_work_t* req) { } baton->message = glyphs.SerializeAsString(); - - FT_Done_FreeType(library); } void AfterRange(uv_work_t* req) { @@ -506,19 +529,13 @@ void RenderSDF(glyph_info &glyph, float cutoff, FT_Face ft_face) { - // // Check if char is already in cache - // glyph_info_cache_type::const_iterator itr; - // itr = glyph_info_cache_.find(glyph.glyph_index); - // if (itr != glyph_info_cache_.end()) { - // glyph = itr->second; - // return; - // } if (FT_Load_Glyph (ft_face, glyph.glyph_index, FT_LOAD_NO_HINTING)) { return; } FT_Glyph ft_glyph; + ft_glyph_guard glyph_guard(ft_glyph); if (FT_Get_Glyph(ft_face->glyph, &ft_glyph)) return; int advance = ft_face->glyph->metrics.horiAdvance / 64; @@ -645,8 +662,6 @@ void RenderSDF(glyph_info &glyph, glyph.bitmap[i] = static_cast(255 - n); } } - - FT_Done_Glyph(ft_glyph); } } // ns node_fontnik From c493204b1636bfa40180b3b0ec2aa64f6cdc9e33 Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Mon, 23 Mar 2015 17:21:38 -0700 Subject: [PATCH 2/2] Fix leaks --- src/glyphs.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/glyphs.cpp b/src/glyphs.cpp index 8aae9a575..b8b010eca 100644 --- a/src/glyphs.cpp +++ b/src/glyphs.cpp @@ -169,34 +169,34 @@ NAN_METHOD(Range) { } struct ft_library_guard { - ft_library_guard(FT_Library lib) : + ft_library_guard(FT_Library * lib) : library_(lib) {} ~ft_library_guard() { - if (library_) FT_Done_FreeType(library_); + if (library_) FT_Done_FreeType(*library_); } - FT_Library library_; + FT_Library * library_; }; struct ft_glyph_guard { - ft_glyph_guard(FT_Glyph glyph) : + ft_glyph_guard(FT_Glyph * glyph) : glyph_(glyph) {} ~ft_glyph_guard() { - if (glyph_) FT_Done_Glyph(glyph_); + if (glyph_) FT_Done_Glyph(*glyph_); } - FT_Glyph glyph_; + FT_Glyph * glyph_; }; void LoadAsync(uv_work_t* req) { LoadBaton* baton = static_cast(req->data); FT_Library library = nullptr; - ft_library_guard library_guard(library); + ft_library_guard library_guard(&library); FT_Error error = FT_Init_FreeType(&library); if (error) { /* LCOV_EXCL_START */ @@ -270,7 +270,7 @@ void RangeAsync(uv_work_t* req) { } FT_Library library = nullptr; - ft_library_guard library_guard(library); + ft_library_guard library_guard(&library); FT_Error error = FT_Init_FreeType(&library); if (error) { /* LCOV_EXCL_START */ @@ -534,8 +534,8 @@ void RenderSDF(glyph_info &glyph, return; } - FT_Glyph ft_glyph; - ft_glyph_guard glyph_guard(ft_glyph); + FT_Glyph ft_glyph = nullptr; + ft_glyph_guard glyph_guard(&ft_glyph); if (FT_Get_Glyph(ft_face->glyph, &ft_glyph)) return; int advance = ft_face->glyph->metrics.horiAdvance / 64;