From ebcd5883e28963a4a759bc61f6249a4baef11962 Mon Sep 17 00:00:00 2001 From: Vreixo Formoso Date: Wed, 23 Jan 2008 00:34:27 +0100 Subject: [PATCH] Update burn_source to version 1, that adds cancel() function. --- demo/iso.c | 2 +- demo/iso_modify.c | 2 +- demo/iso_ms.c | 2 +- src/buffer.c | 7 +++++++ src/ecma119.c | 21 ++++++++++++++++++++- 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/demo/iso.c b/demo/iso.c index 509008b..cee6b3d 100644 --- a/demo/iso.c +++ b/demo/iso.c @@ -170,7 +170,7 @@ int main(int argc, char **argv) return 1; } - while (burn_src->read(burn_src, buf, 2048) == 2048) { + while (burn_src->read_xt(burn_src, buf, 2048) == 2048) { fwrite(buf, 1, 2048, fd); } fclose(fd); diff --git a/demo/iso_modify.c b/demo/iso_modify.c index cfd1da4..5333c21 100644 --- a/demo/iso_modify.c +++ b/demo/iso_modify.c @@ -119,7 +119,7 @@ int main(int argc, char **argv) return 1; } - while (burn_src->read(burn_src, buf, 2048) == 2048) { + while (burn_src->read_xt(burn_src, buf, 2048) == 2048) { fwrite(buf, 1, 2048, fd); } fclose(fd); diff --git a/demo/iso_ms.c b/demo/iso_ms.c index 18d5597..760a8f7 100644 --- a/demo/iso_ms.c +++ b/demo/iso_ms.c @@ -122,7 +122,7 @@ int main(int argc, char **argv) return 1; } - while (burn_src->read(burn_src, buf, 2048) == 2048) { + while (burn_src->read_xt(burn_src, buf, 2048) == 2048) { fwrite(buf, 1, 2048, fd); } fclose(fd); diff --git a/src/buffer.c b/src/buffer.c index 6feec4c..a0986ea 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -253,6 +253,13 @@ void iso_ring_buffer_writer_close(IsoRingBuffer *buf, int error) void iso_ring_buffer_reader_close(IsoRingBuffer *buf, int error) { pthread_mutex_lock(&buf->mutex); + + if (buf->rend) { + /* reader already closed */ + pthread_mutex_unlock(&buf->mutex); + return; + } + buf->rend = error ? 2 : 1; /* ensure no writer is waiting */ diff --git a/src/ecma119.c b/src/ecma119.c index 7cd406c..8a42b83 100644 --- a/src/ecma119.c +++ b/src/ecma119.c @@ -1103,6 +1103,22 @@ static void bs_free_data(struct burn_source *bs) ecma119_image_free(target); } +int bs_cancel(struct burn_source *bs) +{ + Ecma119Image *target = (Ecma119Image*)bs->data; + + iso_msg_debug(target->image->id, "Reader thread being cancelled"); + + /* forces writer to stop if it is still running */ + iso_ring_buffer_reader_close(target->buffer, ISO_CANCELED); + + /* wait until writer thread finishes */ + pthread_join(target->wthread, NULL); + + iso_msg_debug(target->image->id, "Writer thread joined"); + return ISO_SUCCESS; +} + static int bs_set_size(struct burn_source *bs, off_t size) { @@ -1140,10 +1156,13 @@ int iso_image_create_burn_source(IsoImage *image, Ecma119WriteOpts *opts, } source->refcount = 1; - source->read = bs_read; + source->version = 1; + source->read = NULL; source->get_size = bs_get_size; source->set_size = bs_set_size; source->free_data = bs_free_data; + source->read_xt = bs_read; + source->cancel = bs_cancel; source->data = target; *burn_src = source;