possible fix for tiff write assert fail

This commit is contained in:
John Cupitt 2013-09-25 12:57:36 +01:00
parent 6641d70652
commit 111a82c06e
4 changed files with 14 additions and 14 deletions

12
TODO
View File

@ -33,15 +33,15 @@
that means we've not taken ownership
so it's probably ->strip or ->copy in dzsave, since we don't pass ownership
in a strict manner
ooo crash shows up in gdb on work PC
add take_ownership to dzsave and see if the ->NULL on the thread changes
vips_region_buffer() is called directly by dzsave ... could it be one of
those?
vips_region_buffer() is being called from find_tile() in vips2tiff.c
vips_sink_tile() calls the work function from many threads with
start/gen/stop, so we have to be careful when moving regions between threads
find_tile() now tags regions as unowned after vips_region_buffer(), is that
enough? also, benchmark

View File

@ -697,7 +697,7 @@ find_new_tile( PyramidLayer *layer )
{
int i;
/* Exisiting buffer we have finished with?
/* Existing buffer we have finished with?
*/
for( i = 0; i < MAX_LAYER_BUFFER; i++ )
if( layer->tiles[i].bits == PYR_ALL )
@ -710,7 +710,7 @@ find_new_tile( PyramidLayer *layer )
if( !(layer->tiles[i].tile =
vips_region_new( layer->tw->im )) )
return( -1 );
vips__region_no_ownership( layer->tiles[i].tile );
return( i );
}
@ -749,6 +749,7 @@ find_tile( PyramidLayer *layer, VipsRect *pos )
return( -1 );
if( vips_region_buffer( layer->tiles[i].tile, pos ) )
return( -1 );
vips__region_no_ownership( layer->tiles[i].tile );
layer->tiles[i].bits = PYR_NONE;
/* Do any quadrants of this tile fall entirely outside the image?

View File

@ -373,7 +373,8 @@ vips__region_take_ownership( VipsRegion *region )
* Not sure if this will ever happen: if it does, we'll
* need to dup the buffer.
*/
g_assert( !region->buffer || region->buffer->ref_count == 1 );
g_assert( !region->buffer ||
region->buffer->ref_count == 1 );
region->thread = g_thread_self();
}

View File

@ -338,11 +338,9 @@ vips_sink_base_progress( void *a )
* Loops over an image. @generate is called for every pixel in the image, with
* the @reg argument being a region of pixels for processing.
*
* Each set of
* pixels is @tile_width by @tile_height pixels (less at the image edges).
* This is handy for things like
* writing a tiled TIFF image, where tiles have to be generated with a certain
* size.
* Each set of pixels is @tile_width by @tile_height pixels (less at the
* image edges). This is handy for things like writing a tiled TIFF image,
* where tiles have to be generated with a certain size.
*
* See also: vips_sink(), vips_get_tile_size().
*