summaryrefslogtreecommitdiff
path: root/filter
diff options
context:
space:
mode:
Diffstat (limited to 'filter')
-rw-r--r--filter/buffer.c18
-rw-r--r--filter/filec.c26
-rw-r--r--filter/filer.c1
-rw-r--r--filter/filter.c22
-rw-r--r--filter/pipeline.c25
5 files changed, 54 insertions, 38 deletions
diff --git a/filter/buffer.c b/filter/buffer.c
index 1b7a0793..79339456 100644
--- a/filter/buffer.c
+++ b/filter/buffer.c
@@ -8,6 +8,7 @@ fz_newbuffer(fz_buffer **bp, int size)
b = *bp = fz_malloc(sizeof(fz_buffer));
if (!b) return fz_outofmem;
+ b->nrefs = 1;
b->ownsdata = 1;
b->bp = fz_malloc(size);
if (!b->bp) { fz_free(b); return fz_outofmem; }
@@ -28,6 +29,7 @@ fz_newbufferwithdata(fz_buffer **bp, unsigned char *data, int size)
b = *bp = fz_malloc(sizeof(fz_buffer));
if (!b) return fz_outofmem;
+ b->nrefs = 1;
b->ownsdata = 0;
b->bp = data;
@@ -39,12 +41,22 @@ fz_newbufferwithdata(fz_buffer **bp, unsigned char *data, int size)
return nil;
}
+fz_buffer *
+fz_keepbuffer(fz_buffer *buf)
+{
+ buf->nrefs ++;
+ return buf;
+}
+
void
fz_dropbuffer(fz_buffer *buf)
{
- if (buf->ownsdata)
- fz_free(buf->bp);
- fz_free(buf);
+ if (--buf->nrefs == 0)
+ {
+ if (buf->ownsdata)
+ fz_free(buf->bp);
+ fz_free(buf);
+ }
}
fz_error *
diff --git a/filter/filec.c b/filter/filec.c
index 4c132b33..5ea3c75a 100644
--- a/filter/filec.c
+++ b/filter/filec.c
@@ -67,8 +67,8 @@ fz_openfile(fz_file **filep, char *path, int mode)
cleanup:
*filep = nil;
close(fd);
- fz_free(file->out);
- fz_free(file->in);
+ fz_dropbuffer(file->out);
+ fz_dropbuffer(file->in);
fz_free(file);
return error;
}
@@ -93,7 +93,7 @@ fz_openbuffer(fz_file **filep, fz_buffer *buf, int mode)
if (mode == FZ_READ)
{
- file->out = buf;
+ file->out = fz_keepbuffer(buf);
error = fz_newbuffer(&file->in, FZ_BUFSIZE);
if (error)
goto cleanup;
@@ -104,7 +104,7 @@ fz_openbuffer(fz_file **filep, fz_buffer *buf, int mode)
error = fz_newbuffer(&file->out, FZ_BUFSIZE);
if (error)
goto cleanup;
- file->in = buf;
+ file->in = fz_keepbuffer(buf);
}
return nil;
@@ -130,19 +130,11 @@ fz_closefile(fz_file *file)
file->error = nil;
}
- if (file->fd == -1) /* open to buffer not file */
- {
- if (file->mode == FZ_READ)
- fz_dropbuffer(file->in);
- else
- fz_dropbuffer(file->out);
- }
- else
- {
- fz_dropbuffer(file->in);
- fz_dropbuffer(file->out);
+ if (file->fd != -1) /* open to real file */
close(file->fd);
- }
+
+ fz_dropbuffer(file->in);
+ fz_dropbuffer(file->out);
if (file->filter)
fz_dropfilter(file->filter);
@@ -178,7 +170,7 @@ fz_pushfilter(fz_file *file, fz_filter *filter)
file->in->eof = 0;
}
- file->filter = filter;
+ file->filter = fz_keepfilter(filter);
}
else
diff --git a/filter/filer.c b/filter/filer.c
index 29e04558..24f9a214 100644
--- a/filter/filer.c
+++ b/filter/filer.c
@@ -233,6 +233,7 @@ fz_readfile(fz_buffer **bufp, fz_file *file)
return fz_outofmem;
}
+ real->nrefs = 1;
real->ownsdata = 1;
real->bp = buf;
real->rp = buf;
diff --git a/filter/filter.c b/filter/filter.c
index 25bbd441..4bd8c4ff 100644
--- a/filter/filter.c
+++ b/filter/filter.c
@@ -1,8 +1,8 @@
#include <fitz.h>
-fz_error fz_kioneedin = { "<ioneedin>", "<process>", "filter.c", 0, 1 };
-fz_error fz_kioneedout = { "<ioneedout>", "<process>", "filter.c", 0, 1 };
-fz_error fz_kiodone = { "<iodone>", "<process>", "filter.c", 0, 1 };
+fz_error fz_kioneedin = { -1, "<ioneedin>", "<process>", "filter.c", 0 };
+fz_error fz_kioneedout = { -1, "<ioneedout>", "<process>", "filter.c", 0 };
+fz_error fz_kiodone = { -1, "<iodone>", "<process>", "filter.c", 0 };
fz_error *
fz_process(fz_filter *f, fz_buffer *in, fz_buffer *out)
@@ -31,11 +31,21 @@ fz_process(fz_filter *f, fz_buffer *in, fz_buffer *out)
return reason;
}
+fz_filter *
+fz_keepfilter(fz_filter *f)
+{
+ f->nrefs ++;
+ return f;
+}
+
void
fz_dropfilter(fz_filter *f)
{
- if (f->drop)
- f->drop(f);
- fz_free(f);
+ if (--f->nrefs == 0)
+ {
+ if (f->drop)
+ f->drop(f);
+ fz_free(f);
+ }
}
diff --git a/filter/pipeline.c b/filter/pipeline.c
index 4ac0da58..7b7f4252 100644
--- a/filter/pipeline.c
+++ b/filter/pipeline.c
@@ -19,10 +19,10 @@ fz_error *
fz_chainpipeline(fz_filter **fp, fz_filter *head, fz_filter *tail, fz_buffer *buf)
{
FZ_NEWFILTER(fz_pipeline, p, pipeline);
- p->head = head;
- p->tail = tail;
+ p->head = fz_keepfilter(head);
+ p->tail = fz_keepfilter(tail);
p->tailneedsin = 1;
- p->buffer = buf;
+ p->buffer = fz_keepbuffer(buf);
return nil;
}
@@ -30,24 +30,25 @@ void
fz_unchainpipeline(fz_filter *filter, fz_filter **oldfp, fz_buffer **oldbp)
{
fz_pipeline *p = (fz_pipeline*)filter;
- *oldfp = p->head;
- *oldbp = p->buffer;
- fz_dropfilter(p->tail);
- fz_free(p);
+
+ *oldfp = fz_keepfilter(p->head);
+ *oldbp = fz_keepbuffer(p->buffer);
+
+ fz_dropfilter(filter);
}
fz_error *
fz_newpipeline(fz_filter **fp, fz_filter *head, fz_filter *tail)
{
- fz_error *err;
+ fz_error *error;
FZ_NEWFILTER(fz_pipeline, p, pipeline);
- p->head = head;
- p->tail = tail;
+ p->head = fz_keepfilter(head);
+ p->tail = fz_keepfilter(tail);
p->tailneedsin = 1;
- err = fz_newbuffer(&p->buffer, FZ_BUFSIZE);
- if (err) { fz_free(p); return err; }
+ error = fz_newbuffer(&p->buffer, FZ_BUFSIZE);
+ if (error) { fz_free(p); return error; }
return nil;
}