diff --git a/ChangeLog b/ChangeLog index 025a87ab..b7b36598 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,9 @@ - return of vips_init(), but just for bindings - revised type.c to make it more binding-friendly +8/9/14 started 7.40.8 +- fix configure on rhel6 [Lovell] + 21/8/14 started 7.40.7 - width and height were swapped in matlab load - set interpretation more carefully on matlab load @@ -12,6 +15,8 @@ - fix memleak in VipsArray [Lovell] - fix memleak in webp load from buffer [Lovell] - fix memleak in png save to buffer [Lovell] +- make out of order read in png and jpg a fatal error +- add thread_shutdown() to C++ (and thereby to python) 12/8/14 started 7.40.6 - more doc fixes diff --git a/configure.ac b/configure.ac index 9193a866..bd861ec9 100644 --- a/configure.ac +++ b/configure.ac @@ -37,9 +37,9 @@ VIPS_VERSION_STRING=$VIPS_VERSION-`date` # binary interface changes backwards compatible?: increment age # binary interface changes not backwards compatible?: reset age to 0 -LIBRARY_CURRENT=38 -LIBRARY_REVISION=5 -LIBRARY_AGE=0 +LIBRARY_CURRENT=39 +LIBRARY_REVISION=0 +LIBRARY_AGE=1 # patched into include/vips/version.h AC_SUBST(VIPS_VERSION) @@ -411,7 +411,7 @@ PACKAGES_USED="$PACKAGES_USED glib-2.0 libxml-2.0 gmodule-2.0 gobject-2.0" # after 2.28 we have a monotonic timer PKG_CHECK_MODULES(MONOTONIC, glib-2.0 >= 2.28,[ AC_DEFINE(HAVE_MONOTONIC_TIME,1,[define if your glib has g_get_monotonic_time().]) - ],[ + ],[: ] ) @@ -432,7 +432,7 @@ PKG_CHECK_MODULES(THREADS, glib-2.0 >= 2.32,[ # with 2.36 and after the type system inits itself PKG_CHECK_MODULES(TYPE_INIT, glib-2.0 < 2.36,[ AC_DEFINE(NEED_TYPE_INIT,1,[define if your glib needs g_type_init().]) - ],[ + ],[: ] ) diff --git a/libvips/conversion/sequential.c b/libvips/conversion/sequential.c index f9e392c1..5ab04cc0 100644 --- a/libvips/conversion/sequential.c +++ b/libvips/conversion/sequential.c @@ -71,7 +71,7 @@ #include "pconversion.h" /* Stall threads that run ahead for up to this long, in seconds. Normally they - * will be woken up long before this, once their data is ready. The timeout is + * will be woken once their data is ready and long before this. The timeout is * just to prevent a total crash in the case of accidental deadlock. * * This has to be a long time: if we're trying to use all cores on a busy diff --git a/libvips/foreign/jpeg2vips.c b/libvips/foreign/jpeg2vips.c index 2483de3c..666ec61c 100644 --- a/libvips/foreign/jpeg2vips.c +++ b/libvips/foreign/jpeg2vips.c @@ -916,7 +916,11 @@ read_jpeg_generate( VipsRegion *or, /* And check that y_pos is correct. It should be, since we are inside * a vips_sequential(). */ - g_assert( r->top == jpeg->y_pos ); + if( r->top != jpeg->y_pos ) { + vips_error( "VipsJpeg", + _( "out of order read at line %d" ), jpeg->y_pos ); + return( -1 ); + } /* Here for longjmp() from vips__new_error_exit(). */ diff --git a/libvips/foreign/vipspng.c b/libvips/foreign/vipspng.c index 8c107385..551a976e 100644 --- a/libvips/foreign/vipspng.c +++ b/libvips/foreign/vipspng.c @@ -483,7 +483,11 @@ png2vips_generate( VipsRegion *or, /* And check that y_pos is correct. It should be, since we are inside * a vips_sequential(). */ - g_assert( r->top == read->y_pos ); + if( r->top != read->y_pos ) { + vips_error( "vipspng", + _( "out of order read at line %d" ), read->y_pos ); + return( -1 ); + } for( y = 0; y < r->height; y++ ) { png_bytep q = (png_bytep) VIPS_REGION_ADDR( or, 0, r->top + y ); diff --git a/libvipsCC/VImage.cc b/libvipsCC/VImage.cc index 5709762d..f229d1d9 100644 --- a/libvipsCC/VImage.cc +++ b/libvipsCC/VImage.cc @@ -64,6 +64,11 @@ void shutdown() vips_shutdown(); } +void thread_shutdown() +{ + vips_thread_shutdown(); +} + void VImage::refblock::debug_print() { std::list::iterator i; diff --git a/libvipsCC/include/vips/VImage.h b/libvipsCC/include/vips/VImage.h index c37deac8..cead3969 100644 --- a/libvipsCC/include/vips/VImage.h +++ b/libvipsCC/include/vips/VImage.h @@ -63,6 +63,7 @@ VIPS_NAMESPACE_START /* vips_init() and vips_shutdown as namespaced C++ functions. */ bool init( const char *argv0 = "nothing" ); +void thread_shutdown( void ); void shutdown( void ); /* A VIPS callback, our name for im_callback_fn. @@ -451,6 +452,8 @@ VIPS_NAMESPACE_END // Other VIPS protos we need extern "C" { extern int im_init_world( const char *argv0 ); +extern int im_init_world( const char *argv0 ); +extern void vips_thread_shutdown( void ); extern void im__print_all(); extern void im_col_Lab2XYZ( float, float, float, diff --git a/tools/vipsthumbnail.c b/tools/vipsthumbnail.c index cb250fc2..a946bc0e 100644 --- a/tools/vipsthumbnail.c +++ b/tools/vipsthumbnail.c @@ -490,7 +490,7 @@ thumbnail_shrink( VipsObject *process, VipsImage *in, if( vips_tilecache( in, &t[4], "tile_width", in->Xsize, "tile_height", 10, - "max_tiles", (nlines * 2) / 10, + "max_tiles", 1 + (nlines * 2) / 10, "access", VIPS_ACCESS_SEQUENTIAL, "threaded", TRUE, NULL ) )