Update burn_source to version 1, that adds cancel() function.

This commit is contained in:
Vreixo Formoso 2008-01-23 00:34:27 +01:00
parent ae679b0f61
commit ebcd5883e2
5 changed files with 30 additions and 4 deletions

View File

@ -170,7 +170,7 @@ int main(int argc, char **argv)
return 1; 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); fwrite(buf, 1, 2048, fd);
} }
fclose(fd); fclose(fd);

View File

@ -119,7 +119,7 @@ int main(int argc, char **argv)
return 1; 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); fwrite(buf, 1, 2048, fd);
} }
fclose(fd); fclose(fd);

View File

@ -122,7 +122,7 @@ int main(int argc, char **argv)
return 1; 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); fwrite(buf, 1, 2048, fd);
} }
fclose(fd); fclose(fd);

View File

@ -253,6 +253,13 @@ void iso_ring_buffer_writer_close(IsoRingBuffer *buf, int error)
void iso_ring_buffer_reader_close(IsoRingBuffer *buf, int error) void iso_ring_buffer_reader_close(IsoRingBuffer *buf, int error)
{ {
pthread_mutex_lock(&buf->mutex); pthread_mutex_lock(&buf->mutex);
if (buf->rend) {
/* reader already closed */
pthread_mutex_unlock(&buf->mutex);
return;
}
buf->rend = error ? 2 : 1; buf->rend = error ? 2 : 1;
/* ensure no writer is waiting */ /* ensure no writer is waiting */

View File

@ -1103,6 +1103,22 @@ static void bs_free_data(struct burn_source *bs)
ecma119_image_free(target); 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 static
int bs_set_size(struct burn_source *bs, off_t size) 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->refcount = 1;
source->read = bs_read; source->version = 1;
source->read = NULL;
source->get_size = bs_get_size; source->get_size = bs_get_size;
source->set_size = bs_set_size; source->set_size = bs_set_size;
source->free_data = bs_free_data; source->free_data = bs_free_data;
source->read_xt = bs_read;
source->cancel = bs_cancel;
source->data = target; source->data = target;
*burn_src = source; *burn_src = source;