argh still deadlocks on example.rb
This commit is contained in:
parent
4ef825014d
commit
0c87863222
@ -1,3 +1,6 @@
|
|||||||
|
4/9/12 started 7.30.2
|
||||||
|
- sequential stops all threads on error
|
||||||
|
|
||||||
6/8/12 started 7.30.1
|
6/8/12 started 7.30.1
|
||||||
- fixes to dzsave: shrink down to a 1x1 pixel tile, round image size up on
|
- fixes to dzsave: shrink down to a 1x1 pixel tile, round image size up on
|
||||||
shrink, write a .dzi file with the pyramid params, default tile size and
|
shrink, write a .dzi file with the pyramid params, default tile size and
|
||||||
|
2
TODO
2
TODO
@ -1,3 +1,5 @@
|
|||||||
|
- still deadlocks on example.rb
|
||||||
|
|
||||||
blocking bugs
|
blocking bugs
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# also update the version number in the m4 macros below
|
# also update the version number in the m4 macros below
|
||||||
|
|
||||||
AC_INIT([vips], [7.30.1], [vipsip@jiscmail.ac.uk])
|
AC_INIT([vips], [7.30.2], [vipsip@jiscmail.ac.uk])
|
||||||
# required for gobject-introspection
|
# required for gobject-introspection
|
||||||
AC_PREREQ(2.62)
|
AC_PREREQ(2.62)
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ AC_CONFIG_MACRO_DIR([m4])
|
|||||||
# user-visible library versioning
|
# user-visible library versioning
|
||||||
m4_define([vips_major_version], [7])
|
m4_define([vips_major_version], [7])
|
||||||
m4_define([vips_minor_version], [30])
|
m4_define([vips_minor_version], [30])
|
||||||
m4_define([vips_micro_version], [1])
|
m4_define([vips_micro_version], [2])
|
||||||
m4_define([vips_version],
|
m4_define([vips_version],
|
||||||
[vips_major_version.vips_minor_version.vips_micro_version])
|
[vips_major_version.vips_minor_version.vips_micro_version])
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ VIPS_VERSION_STRING=$VIPS_VERSION-`date`
|
|||||||
# binary interface changes not backwards compatible?: reset age to 0
|
# binary interface changes not backwards compatible?: reset age to 0
|
||||||
|
|
||||||
LIBRARY_CURRENT=33
|
LIBRARY_CURRENT=33
|
||||||
LIBRARY_REVISION=4
|
LIBRARY_REVISION=5
|
||||||
LIBRARY_AGE=1
|
LIBRARY_AGE=1
|
||||||
|
|
||||||
# patched into include/vips/version.h
|
# patched into include/vips/version.h
|
||||||
|
@ -402,12 +402,11 @@ vips_embed_build( VipsObject *object )
|
|||||||
if( vips_image_copy_fields( conversion->out, embed->in ) )
|
if( vips_image_copy_fields( conversion->out, embed->in ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
/* embed is used in many places. SMALLTILE would force most
|
/* embed is used in many places. We don't really care about
|
||||||
* pipelines into SMALLTILE mode, so stick with THINSTRIP,
|
* geometry, so use ANY to avoid disturbing all pipelines.
|
||||||
* even though SMALLTILE might be a little faster for us.
|
|
||||||
*/
|
*/
|
||||||
vips_demand_hint( conversion->out,
|
vips_demand_hint( conversion->out,
|
||||||
VIPS_DEMAND_STYLE_FATSTRIP, embed->in, NULL );
|
VIPS_DEMAND_STYLE_ANY, embed->in, NULL );
|
||||||
|
|
||||||
conversion->out->Xsize = embed->width;
|
conversion->out->Xsize = embed->width;
|
||||||
conversion->out->Ysize = embed->height;
|
conversion->out->Ysize = embed->height;
|
||||||
|
@ -285,7 +285,7 @@ vips_insert_build( VipsObject *object )
|
|||||||
if( vips_image_copy_fields_array( conversion->out, arry ) )
|
if( vips_image_copy_fields_array( conversion->out, arry ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
vips_demand_hint_array( conversion->out,
|
vips_demand_hint_array( conversion->out,
|
||||||
VIPS_DEMAND_STYLE_SMALLTILE, arry );
|
VIPS_DEMAND_STYLE_ANY, arry );
|
||||||
|
|
||||||
/* Calculate geometry.
|
/* Calculate geometry.
|
||||||
*/
|
*/
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
* - remove skip forward, instead do thread stalling and have an
|
* - remove skip forward, instead do thread stalling and have an
|
||||||
* integrated cache
|
* integrated cache
|
||||||
* - use linecache
|
* - use linecache
|
||||||
|
* 4/9/12
|
||||||
|
* - stop all threads on error
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -77,6 +79,11 @@ typedef struct _VipsSequential {
|
|||||||
* when we start.
|
* when we start.
|
||||||
*/
|
*/
|
||||||
int y_pos;
|
int y_pos;
|
||||||
|
|
||||||
|
/* If one thread gets an error, we must stop all threads, otherwise we
|
||||||
|
* can stall and never wake.
|
||||||
|
*/
|
||||||
|
int error;
|
||||||
} VipsSequential;
|
} VipsSequential;
|
||||||
|
|
||||||
typedef VipsConversionClass VipsSequentialClass;
|
typedef VipsConversionClass VipsSequentialClass;
|
||||||
@ -115,6 +122,13 @@ retry:
|
|||||||
|
|
||||||
VIPS_DEBUG_MSG( "thread %p has lock ...\n", g_thread_self() );
|
VIPS_DEBUG_MSG( "thread %p has lock ...\n", g_thread_self() );
|
||||||
|
|
||||||
|
/* If we've seen an error, everything must stop or we'll deadlock.
|
||||||
|
*/
|
||||||
|
if( sequential->error ) {
|
||||||
|
g_mutex_unlock( sequential->lock );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
if( r->top > sequential->y_pos &&
|
if( r->top > sequential->y_pos &&
|
||||||
sequential->y_pos > 0 ) {
|
sequential->y_pos > 0 ) {
|
||||||
/* We have started reading (y_pos > 0) and this request is for
|
/* We have started reading (y_pos > 0) and this request is for
|
||||||
@ -144,8 +158,14 @@ retry:
|
|||||||
area.top = sequential->y_pos;
|
area.top = sequential->y_pos;
|
||||||
area.width = 1;
|
area.width = 1;
|
||||||
area.height = r->top - sequential->y_pos;
|
area.height = r->top - sequential->y_pos;
|
||||||
if( vips_region_prepare( ir, &area ) )
|
if( vips_region_prepare( ir, &area ) ) {
|
||||||
|
VIPS_DEBUG_MSG( "thread %p error, unlocking ...\n",
|
||||||
|
g_thread_self() );
|
||||||
|
sequential->error = -1;
|
||||||
|
g_cond_broadcast( sequential->ready );
|
||||||
|
g_mutex_unlock( sequential->lock );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
sequential->y_pos = VIPS_RECT_BOTTOM( &area );
|
sequential->y_pos = VIPS_RECT_BOTTOM( &area );
|
||||||
}
|
}
|
||||||
@ -156,7 +176,10 @@ retry:
|
|||||||
VIPS_DEBUG_MSG( "thread %p reading ...\n", g_thread_self() );
|
VIPS_DEBUG_MSG( "thread %p reading ...\n", g_thread_self() );
|
||||||
if( vips_region_prepare( ir, r ) ||
|
if( vips_region_prepare( ir, r ) ||
|
||||||
vips_region_region( or, ir, r, r->left, r->top ) ) {
|
vips_region_region( or, ir, r, r->left, r->top ) ) {
|
||||||
VIPS_DEBUG_MSG( "thread %p unlocking ...\n", g_thread_self() );
|
VIPS_DEBUG_MSG( "thread %p error, unlocking ...\n",
|
||||||
|
g_thread_self() );
|
||||||
|
sequential->error = -1;
|
||||||
|
g_cond_broadcast( sequential->ready );
|
||||||
g_mutex_unlock( sequential->lock );
|
g_mutex_unlock( sequential->lock );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
@ -262,6 +285,7 @@ vips_sequential_init( VipsSequential *sequential )
|
|||||||
sequential->lock = g_mutex_new();
|
sequential->lock = g_mutex_new();
|
||||||
sequential->ready = g_cond_new();
|
sequential->ready = g_cond_new();
|
||||||
sequential->tile_height = 1;
|
sequential->tile_height = 1;
|
||||||
|
sequential->error = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -401,7 +401,7 @@ im_tile_cache( IMAGE *in, IMAGE *out,
|
|||||||
|
|
||||||
if( im_piocheck( in, out ) ||
|
if( im_piocheck( in, out ) ||
|
||||||
im_cp_desc( out, in ) ||
|
im_cp_desc( out, in ) ||
|
||||||
im_demand_hint( out, IM_SMALLTILE, in, NULL ) ||
|
im_demand_hint( out, IM_ANY, in, NULL ) ||
|
||||||
!(read = read_new( in, out,
|
!(read = read_new( in, out,
|
||||||
tile_width, tile_height, max_tiles )) ||
|
tile_width, tile_height, max_tiles )) ||
|
||||||
im_generate( out,
|
im_generate( out,
|
||||||
|
@ -325,7 +325,7 @@ vips_demand_hint_array( VipsImage *image, VipsDemandStyle hint, VipsImage **in )
|
|||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf( "vips_demand_hint_array: set dhint for \"%s\" to %s\n",
|
printf( "vips_demand_hint_array: set dhint for \"%s\" to %s\n",
|
||||||
im->filename,
|
image->filename,
|
||||||
vips_enum_nick( VIPS_TYPE_DEMAND_STYLE, image->dhint ) );
|
vips_enum_nick( VIPS_TYPE_DEMAND_STYLE, image->dhint ) );
|
||||||
printf( "\toperation requested %s\n",
|
printf( "\toperation requested %s\n",
|
||||||
vips_enum_nick( VIPS_TYPE_DEMAND_STYLE, hint ) );
|
vips_enum_nick( VIPS_TYPE_DEMAND_STYLE, hint ) );
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
|
|
||||||
static int thumbnail_size = 128;
|
static int thumbnail_size = 128;
|
||||||
static char *output_format = "tn_%s.jpg";
|
static char *output_format = "tn_%s.jpg";
|
||||||
static char *interpolator = "bilinear";;
|
static char *interpolator = "bilinear";
|
||||||
static gboolean nosharpen = FALSE;
|
static gboolean nosharpen = FALSE;
|
||||||
static char *export_profile = NULL;
|
static char *export_profile = NULL;
|
||||||
static char *import_profile = NULL;
|
static char *import_profile = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user