summaryrefslogtreecommitdiff
path: root/source/tools
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-07-08 12:04:35 +0200
committerTor Andersson <tor.andersson@artifex.com>2016-07-08 17:21:24 +0200
commit10d6eaa73164b58c91ae8a4537b8a8589038a01d (patch)
tree5b739b0c2202b42a9079ee3ecbd98c3d3b09b124 /source/tools
parentb53e7a42f7cc9756ed9fa1fed313271e3ae67855 (diff)
downloadmupdf-10d6eaa73164b58c91ae8a4537b8a8589038a01d.tar.xz
Separate close and drop functionality for devices and writers.
Closing a device or writer may throw exceptions, but much of the foreign language bindings (JNI and JS) depend on drop to never throw an exception (exceptions in finalizers are bad).
Diffstat (limited to 'source/tools')
-rw-r--r--source/tools/muconvert.c2
-rw-r--r--source/tools/mudraw.c11
-rw-r--r--source/tools/muraster.c9
-rw-r--r--source/tools/murun.c18
4 files changed, 27 insertions, 13 deletions
diff --git a/source/tools/muconvert.c b/source/tools/muconvert.c
index 95f01c4a..4fb3b071 100644
--- a/source/tools/muconvert.c
+++ b/source/tools/muconvert.c
@@ -162,6 +162,8 @@ int muconvert_main(int argc, char **argv)
fz_drop_document(ctx, doc);
}
+ fz_close_document_writer(ctx, out);
+
fz_drop_document_writer(ctx, out);
fz_drop_context(ctx);
return EXIT_SUCCESS;
diff --git a/source/tools/mudraw.c b/source/tools/mudraw.c
index 0521a9b0..16e12b6b 100644
--- a/source/tools/mudraw.c
+++ b/source/tools/mudraw.c
@@ -554,6 +554,7 @@ static void drawband(fz_context *ctx, fz_page *page, fz_display_list *list, cons
fz_run_display_list(ctx, list, dev, ctm, tbounds, cookie);
else
fz_run_page(ctx, page, dev, ctm, cookie);
+ fz_close_device(ctx, dev);
fz_drop_device(ctx, dev);
dev = NULL;
@@ -596,6 +597,7 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
else
fz_run_page(ctx, page, dev, &fz_identity, cookie);
fz_printf(ctx, out, "</page>\n");
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -628,6 +630,7 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
fz_run_display_list(ctx, list, dev, &fz_identity, &fz_infinite_rect, cookie);
else
fz_run_page(ctx, page, dev, &fz_identity, cookie);
+ fz_close_device(ctx, dev);
fz_drop_device(ctx, dev);
dev = NULL;
if (output_format == OUT_STEXT)
@@ -674,6 +677,7 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
fz_run_display_list(ctx, list, dev, &fz_identity, NULL, cookie);
else
fz_run_page(ctx, page, dev, &fz_identity, cookie);
+ fz_close_device(ctx, dev);
page_obj = pdf_add_page(ctx, pdfout, &mediabox, rotation, resources, contents);
pdf_insert_page(ctx, pdfout, -1, page_obj);
@@ -726,6 +730,7 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
fz_run_display_list(ctx, list, dev, &ctm, &tbounds, cookie);
else
fz_run_page(ctx, page, dev, &ctm, cookie);
+ fz_close_device(ctx, dev);
fz_drop_device(ctx, dev);
dev = NULL;
}
@@ -754,10 +759,8 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
fz_ps_output_context *psoc = NULL;
fz_mono_pcl_output_context *pmcoc = NULL;
fz_color_pcl_output_context *pccoc = NULL;
- fz_device *dev = NULL;
fz_bitmap *bit = NULL;
- fz_var(dev);
fz_var(pix);
fz_var(poc);
fz_var(psoc);
@@ -991,8 +994,6 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
{
fz_drop_bitmap(ctx, bit);
bit = NULL;
- fz_drop_device(ctx, dev);
- dev = NULL;
if (num_workers > 0)
{
int band;
@@ -1121,6 +1122,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
if (lowmemory)
fz_enable_device_hints(ctx, dev, FZ_NO_CACHE);
fz_run_page(ctx, page, dev, &fz_identity, &cookie);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -1153,6 +1155,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_run_display_list(ctx, list, dev, &fz_identity, &fz_infinite_rect, NULL);
else
fz_run_page(ctx, page, dev, &fz_identity, &cookie);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
diff --git a/source/tools/muraster.c b/source/tools/muraster.c
index e5d886f4..6a2cf87e 100644
--- a/source/tools/muraster.c
+++ b/source/tools/muraster.c
@@ -710,6 +710,7 @@ static int drawband(fz_context *ctx, fz_page *page, fz_display_list *list, const
fz_run_display_list(ctx, list, dev, ctm, tbounds, cookie);
else
fz_run_page(ctx, page, dev, ctm, cookie);
+ fz_close_device(ctx, dev);
fz_drop_device(ctx, dev);
dev = NULL;
@@ -726,12 +727,10 @@ static int drawband(fz_context *ctx, fz_page *page, fz_display_list *list, const
static int dodrawpage(fz_context *ctx, int pagenum, fz_cookie *cookie, render_details *render)
{
- fz_device *dev = NULL;
fz_pixmap *pix = NULL;
fz_bitmap *bit = NULL;
int errors_are_fatal = 0;
- fz_var(dev);
fz_var(pix);
fz_var(bit);
fz_var(errors_are_fatal);
@@ -852,8 +851,6 @@ static int dodrawpage(fz_context *ctx, int pagenum, fz_cookie *cookie, render_de
{
fz_drop_bitmap(ctx, bit);
bit = NULL;
- fz_drop_device(ctx, dev);
- dev = NULL;
if (render->num_workers > 0)
{
int band;
@@ -1198,9 +1195,11 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
#if GREY_FALLBACK != 0
test_dev = fz_new_test_device(ctx, &is_color, 0.01f, 0, list_dev);
fz_run_page(ctx, page, test_dev, &fz_identity, &cookie);
+ fz_close_device(ctx, test_dev);
#else
fz_run_page(ctx, page, list_dev, &fz_identity, &cookie);
#endif
+ fz_close_device(ctx, list_dev);
}
fz_always(ctx)
{
@@ -1229,6 +1228,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
{
test_dev = fz_new_test_device(ctx, &is_color, 0.01f, 0, test_dev);
fz_run_page(ctx, page, test_dev, &fz_identity, &cookie);
+ fz_close_device(ctx, test_dev);
}
fz_always(ctx)
{
@@ -1258,6 +1258,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_run_display_list(ctx, list, test_dev, &fz_identity, &fz_infinite_rect, &cookie);
else
fz_run_page(ctx, page, test_dev, &fz_identity, &cookie);
+ fz_close_device(ctx, test_dev);
}
fz_always(ctx)
{
diff --git a/source/tools/murun.c b/source/tools/murun.c
index a3eacaa8..fb35f0a0 100644
--- a/source/tools/murun.c
+++ b/source/tools/murun.c
@@ -178,7 +178,10 @@ static const char *require_js =
static void ffi_gc_fz_buffer(js_State *J, void *buf)
{
fz_context *ctx = js_getcontext(J);
- fz_drop_buffer(ctx, buf);
+ fz_try(ctx)
+ fz_drop_buffer(ctx, buf);
+ fz_catch(ctx)
+ rethrow(J);
}
static void ffi_gc_fz_document(js_State *J, void *doc)
@@ -1497,11 +1500,13 @@ static void ffi_Page_run(js_State *J)
} else {
device = new_js_device(ctx, J);
js_copy(J, 1); /* put the js device on the top so the callbacks know where to get it */
- fz_try(ctx)
+ fz_try(ctx) {
if (no_annots)
fz_run_page_contents(ctx, page, device, &ctm, NULL);
else
fz_run_page(ctx, page, device, &ctm, NULL);
+ fz_close_device(ctx, device);
+ }
fz_always(ctx)
fz_drop_device(ctx, device);
fz_catch(ctx)
@@ -1650,8 +1655,10 @@ static void ffi_Annotation_run(js_State *J)
} else {
device = new_js_device(ctx, J);
js_copy(J, 1); /* put the js device on the top so the callbacks know where to get it */
- fz_try(ctx)
+ fz_try(ctx) {
fz_run_annot(ctx, annot, device, &ctm, NULL);
+ fz_close_device(ctx, device);
+ }
fz_always(ctx)
fz_drop_device(ctx, device);
fz_catch(ctx)
@@ -2213,8 +2220,10 @@ static void ffi_DisplayList_run(js_State *J)
} else {
device = new_js_device(ctx, J);
js_copy(J, 1);
- fz_try(ctx)
+ fz_try(ctx) {
fz_run_display_list(ctx, list, device, &ctm, NULL, NULL);
+ fz_close_device(ctx, device);
+ }
fz_always(ctx)
fz_drop_device(ctx, device);
fz_catch(ctx)
@@ -2418,7 +2427,6 @@ static void ffi_DocumentWriter_endPage(js_State *J)
rethrow(J);
}
-
static void ffi_DocumentWriter_close(js_State *J)
{
fz_context *ctx = js_getcontext(J);