From b6b44399b9cf4dffe034189c4a2333a2c7173d95 Mon Sep 17 00:00:00 2001 From: malc Date: Fri, 15 Apr 2011 23:39:42 +0400 Subject: [PATCH] Do not leak memory when reloading document --- link.c | 36 ++++++++++++++++++++++++++++++------ main.ml | 8 ++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/link.c b/link.c index e27671d..39bb8de 100644 --- a/link.c +++ b/link.c @@ -336,13 +336,33 @@ static void die (fz_error error) static void openxref (char *filename) { + int i; fz_error error; state.pig = NULL; - if (state.xref) { + + for (i = 0; i < state.texcount; ++i) { + state.texowners[i].slice = NULL; + } + + if (state.cache) { + fz_free_glyph_cache (state.cache); + } + + state.cache = fz_new_glyph_cache (); + if (!state.cache) { + errx (1, "fz_newglyph_cache failed"); + } + + if (state.xref) { + if (state.xref->store) { + pdf_free_store (state.xref->store); + state.xref->store = NULL; + } pdf_free_xref (state.xref); state.xref = NULL; } + if (state.pagedims) { free (state.pagedims); state.pagedims = NULL; @@ -966,6 +986,15 @@ mainloop (void *unused) unlinkpage (ptr); state.pig = ptr; } + else if (!strncmp ("drop", p, 4)) { + void *ptr; + + ret = sscanf (p + 4, " %p", &ptr); + if (ret != 1) { + errx (1, "malformed drop `%.*s' ret=%d", len, p, ret); + } + freepage (ptr); + } else if (!strncmp ("search", p, 6)) { int icase, pageno, y, ret, len2, forward; char *pattern; @@ -1740,11 +1769,6 @@ CAMLprim value ml_init (value sock_v) state.sock = Int_val (sock_v); #endif - state.cache = fz_new_glyph_cache (); - if (!state.cache) { - errx (1, "fz_newglyph_cache failed"); - } - #ifdef _WIN32 InitializeCriticalSection (&critsec); state.thread = CreateThread (NULL, 0, mainloop, NULL, 0, NULL); diff --git a/main.ml b/main.ml index e62616b..d7b3a1a 100644 --- a/main.ml +++ b/main.ml @@ -70,6 +70,11 @@ let cbrfollowlen b = b.rc <- b.len; ;; +let cbclear b v = + b.len <- 0; + Array.fill b.store 0 (Array.length b.store) v; +;; + type layout = { pageno : int ; pagedimno : int @@ -908,7 +913,10 @@ let doreshape w h = let opendoc path = invalidate (); state.path <- path; + Hashtbl.iter + (fun k v -> if validopaque v then wcmd "drop" [`s v]) state.pagemap; Hashtbl.clear state.pagemap; + cbclear state.pagecache ""; writecmd state.csock ("open " ^ path ^ "\000"); Glut.setWindowTitle ("llpp " ^ Filename.basename path); -- 2.11.4.GIT