From 495accfec99542e8550e4be97b1b41fce82fe217 Mon Sep 17 00:00:00 2001 From: poire-z Date: Wed, 26 Apr 2017 21:46:46 +0200 Subject: [PATCH] Reduce memory leaks when switching credocuments CRE cache, hyphdict and fonts can be initialized only once when first credocument is opened. Previously, they were recreated for each document, and as previous instances were probably not free'd, this caused memory leaks. --- frontend/document/credocument.lua | 8 +++++--- frontend/document/documentregistry.lua | 5 +++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index 5b6abdad1..443e0ba02 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -9,6 +9,9 @@ local ffi = require("ffi") local lfs = require("libs/libkoreader-lfs") local logger = require("logger") +-- engine can be initialized only once, on first document opened +local engine_initialized = false + local CreDocument = Document:new{ -- this is defined in kpvcrlib/crengine/crengine/include/lvdocview.h SCROLL_VIEW_MODE = 0, @@ -16,7 +19,6 @@ local CreDocument = Document:new{ _document = false, _loaded = false, - engine_initilized = false, line_space_percent = 100, default_font = G_reader_settings:readSetting("cre_font") or "Noto Serif", @@ -47,7 +49,7 @@ function CreDocument:cacheInit() end function CreDocument:engineInit() - if not self.engine_initilized then + if not engine_initialized then require "libs/libkoreader-cre" -- initialize cache self:cacheInit() @@ -66,7 +68,7 @@ function CreDocument:engineInit() end end - self.engine_initilized = true + engine_initialized = true end end diff --git a/frontend/document/documentregistry.lua b/frontend/document/documentregistry.lua index 48bba2e84..027f95a7e 100644 --- a/frontend/document/documentregistry.lua +++ b/frontend/document/documentregistry.lua @@ -28,6 +28,11 @@ function DocumentRegistry:getProvider(file) end function DocumentRegistry:openDocument(file) + -- force a GC, so that any previous document used memory can be reused + -- immediately by this new document without having to wait for the + -- next regular gc. The second call may help reclaming more memory. + collectgarbage() + collectgarbage() if not self.registry[file] then local provider = self:getProvider(file) if provider ~= nil then