diff options
Diffstat (limited to 'filter')
-rw-r--r-- | filter/buffer.c | 18 | ||||
-rw-r--r-- | filter/filec.c | 26 | ||||
-rw-r--r-- | filter/filer.c | 1 | ||||
-rw-r--r-- | filter/filter.c | 22 | ||||
-rw-r--r-- | filter/pipeline.c | 25 |
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; } |