summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2011-12-14 19:08:56 +0000
committerRobin Watts <robin.watts@artifex.com>2011-12-15 00:43:24 +0000
commit313e8f82816c839b3de47e1137a91414bb95a327 (patch)
treef680cd6ebc26e51dab5cd0b9a5337ce49197f6ac /apps
parent09c8ebeea83f11ccac07bad76e516460e2c8e0f7 (diff)
downloadmupdf-313e8f82816c839b3de47e1137a91414bb95a327.tar.xz
Rework pdf_store to fz_store, a part of fz_context.
Firstly, we rename pdf_store to fz_store, reflecting the fact that there are no pdf specific dependencies on it. Next, we rework it so that all the objects that can be stored in the store start with an fz_storable structure. This consists of a reference count, and a function used to free the object when the reference count reaches zero. All the keep/drop functions are then reimplemented by calling fz_keep_sharable/fz_drop_sharable. The 'drop' functions as supplied by the callers are thus now 'free' functions, only called if the reference count drops to 0. The store changes to keep all the items in the store in the linked list (which becomes a doubly linked one). We still make use of the hashtable to index into this list quickly, but we now have the objects in an LRU ordering within the list. Every object is put into the store, with a size record; this is an estimate of how much memory would be freed by freeing that object. The store is moved into the context and given a maximum size; when new things are inserted into the store, care is taken to ensure that we do not expand beyond this size. We evict any stored items (that are not in use) starting from the least recently used. Finding an object in the store now takes a reference to it already. LOCK and UNLOCK comments are used to indicate where locks need to be taken and released to ensure thread safety.
Diffstat (limited to 'apps')
-rw-r--r--apps/pdfapp.c6
-rw-r--r--apps/pdfclean.c2
-rw-r--r--apps/pdfdraw.c4
-rw-r--r--apps/pdfextract.c2
-rw-r--r--apps/pdfshow.c2
-rw-r--r--apps/win_main.c2
-rw-r--r--apps/xpsdraw.c2
7 files changed, 8 insertions, 12 deletions
diff --git a/apps/pdfapp.c b/apps/pdfapp.c
index 9893af39..c1e026fe 100644
--- a/apps/pdfapp.c
+++ b/apps/pdfapp.c
@@ -259,10 +259,6 @@ void pdfapp_close(pdfapp_t *app)
if (app->xref)
{
- if (app->xref->store)
- pdf_free_store(app->ctx, app->xref->store);
- app->xref->store = NULL;
-
pdf_free_xref(app->xref);
app->xref = NULL;
}
@@ -347,7 +343,7 @@ static void pdfapp_loadpage_pdf(pdfapp_t *app)
pdf_free_page(app->ctx, page);
- pdf_age_store(app->ctx, app->xref->store, 3);
+ fz_age_store(app->ctx, 3);
}
static void pdfapp_loadpage_xps(pdfapp_t *app)
diff --git a/apps/pdfclean.c b/apps/pdfclean.c
index e13ad0f6..e8c27359 100644
--- a/apps/pdfclean.c
+++ b/apps/pdfclean.c
@@ -767,7 +767,7 @@ int main(int argc, char **argv)
if (argc - fz_optind > 0)
subset = 1;
- ctx = fz_new_context(&fz_alloc_default);
+ ctx = fz_new_context(&fz_alloc_default, FZ_STORE_UNLIMITED);
if (!ctx)
{
fprintf(stderr, "cannot initialise context\n");
diff --git a/apps/pdfdraw.c b/apps/pdfdraw.c
index 861d2b3f..af1d5ad7 100644
--- a/apps/pdfdraw.c
+++ b/apps/pdfdraw.c
@@ -263,7 +263,7 @@ static void drawpage(pdf_xref *xref, int pagenum)
if (showmd5 || showtime)
printf("\n");
- pdf_age_store(ctx, xref->store, 3);
+ fz_age_store(ctx, 3);
fz_flush_warnings(ctx);
}
@@ -362,7 +362,7 @@ int main(int argc, char **argv)
if (accelerate)
fz_accelerate();
- ctx = fz_new_context(&fz_alloc_default);
+ ctx = fz_new_context(&fz_alloc_default, FZ_STORE_UNLIMITED);
if (!ctx)
{
fprintf(stderr, "cannot initialise context\n");
diff --git a/apps/pdfextract.c b/apps/pdfextract.c
index c32a25c5..590bf13f 100644
--- a/apps/pdfextract.c
+++ b/apps/pdfextract.c
@@ -178,7 +178,7 @@ int main(int argc, char **argv)
infile = argv[fz_optind++];
- ctx = fz_new_context(&fz_alloc_default);
+ ctx = fz_new_context(&fz_alloc_default, FZ_STORE_UNLIMITED);
if (!ctx)
{
fprintf(stderr, "cannot initialise context\n");
diff --git a/apps/pdfshow.c b/apps/pdfshow.c
index c437f262..0c3feaf2 100644
--- a/apps/pdfshow.c
+++ b/apps/pdfshow.c
@@ -189,7 +189,7 @@ int main(int argc, char **argv)
filename = argv[fz_optind++];
- ctx = fz_new_context(&fz_alloc_default);
+ ctx = fz_new_context(&fz_alloc_default, FZ_STORE_UNLIMITED);
if (!ctx)
{
fprintf(stderr, "cannot initialise context\n");
diff --git a/apps/win_main.c b/apps/win_main.c
index eb0e6085..0af83aec 100644
--- a/apps/win_main.c
+++ b/apps/win_main.c
@@ -831,7 +831,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShow
fz_accelerate();
- ctx = fz_new_context(&fz_alloc_default);
+ ctx = fz_new_context(&fz_alloc_default, FZ_STORE_UNLIMITED);
if (!ctx)
{
fprintf(stderr, "cannot initialise context\n");
diff --git a/apps/xpsdraw.c b/apps/xpsdraw.c
index a7223574..f583057e 100644
--- a/apps/xpsdraw.c
+++ b/apps/xpsdraw.c
@@ -314,7 +314,7 @@ int main(int argc, char **argv)
if (accelerate)
fz_accelerate();
- ctx = fz_new_context(&fz_alloc_default);
+ ctx = fz_new_context(&fz_alloc_default, FZ_STORE_UNLIMITED);
if (!ctx)
{
fprintf(stderr, "cannot initialise context\n");