make file format readers close fds early
we were using two fds per open image, now we just use one jpg, magick, tiff, png
This commit is contained in:
parent
cdeec4a912
commit
fc5a4a917a
@ -8,6 +8,7 @@
|
||||
- add magicload_buffer() [mcuelenaere]
|
||||
- added test_foreign.py, plus more test images
|
||||
- rewritten tiff writer is about 3 - 4x faster at making pyramids
|
||||
- jpg, magick, png, tiff readers now use only 1 fd per input image
|
||||
|
||||
6/2/15 started 7.42.3
|
||||
- bump version for back-compat ABI change
|
||||
|
@ -64,6 +64,9 @@
|
||||
* 20/1/15
|
||||
* - don't call jpeg_finish_decompress(), all it does is read and check
|
||||
* the tail of the file
|
||||
* 26/2/15
|
||||
* - close the jpeg read down early for a header read ... this saves an
|
||||
* fd during jpg read, handy for large numbers of input images
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -166,6 +169,8 @@ typedef struct _ReadJpeg {
|
||||
gboolean autorotate;
|
||||
} ReadJpeg;
|
||||
|
||||
/* This can be called many times.
|
||||
*/
|
||||
static int
|
||||
readjpeg_free( ReadJpeg *jpeg )
|
||||
{
|
||||
@ -199,7 +204,7 @@ readjpeg_free( ReadJpeg *jpeg )
|
||||
VIPS_FREE( jpeg->filename );
|
||||
jpeg->eman.fp = NULL;
|
||||
|
||||
/* I don't think this can fail.
|
||||
/* I don't think this can fail. It's harmless to call many times.
|
||||
*/
|
||||
jpeg_destroy_decompress( &jpeg->cinfo );
|
||||
|
||||
@ -1111,6 +1116,12 @@ vips__jpeg_read_file( const char *filename, VipsImage *out,
|
||||
if( vips__jpeg_read( jpeg, out, header_only ) )
|
||||
return( -1 );
|
||||
|
||||
/* We can kill off the decompress early if this is just a header read.
|
||||
* This saves an fd during read.
|
||||
*/
|
||||
if( header_only )
|
||||
readjpeg_free( jpeg );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
@ -44,6 +44,9 @@
|
||||
* - add @density option
|
||||
* 16/2/15 mcuelenaere
|
||||
* - add blob read
|
||||
* 26/2/15
|
||||
* - close the read down early for a header read ... this saves an
|
||||
* fd during file read, handy for large numbers of input images
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -127,11 +130,13 @@ typedef struct _Read {
|
||||
GMutex *lock;
|
||||
} Read;
|
||||
|
||||
static int
|
||||
read_destroy( VipsImage *im, Read *read )
|
||||
/* Can be called many times.
|
||||
*/
|
||||
static void
|
||||
read_free( Read *read )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf( "magick2vips: read_destroy: %s\n", read->filename );
|
||||
printf( "magick2vips: read_free: %s\n", read->filename );
|
||||
#endif /*DEBUG*/
|
||||
|
||||
VIPS_FREE( read->filename );
|
||||
@ -140,6 +145,14 @@ read_destroy( VipsImage *im, Read *read )
|
||||
VIPS_FREE( read->frames );
|
||||
DestroyExceptionInfo( &read->exception );
|
||||
VIPS_FREEF( vips_g_mutex_free, read->lock );
|
||||
}
|
||||
|
||||
/* Can be called many times.
|
||||
*/
|
||||
static int
|
||||
read_close( VipsImage *im, Read *read )
|
||||
{
|
||||
read_free( read );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -173,7 +186,7 @@ read_new( const char *filename, VipsImage *im, gboolean all_frames,
|
||||
read->frame_height = 0;
|
||||
read->lock = vips_g_mutex_new();
|
||||
|
||||
g_signal_connect( im, "close", G_CALLBACK( read_destroy ), read );
|
||||
g_signal_connect( im, "close", G_CALLBACK( read_close ), read );
|
||||
|
||||
if( !read->image_info )
|
||||
return( NULL );
|
||||
@ -741,6 +754,10 @@ vips__magick_read_header( const char *filename, VipsImage *im,
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
/* Just a header read: we can free the read early and save an fd.
|
||||
*/
|
||||
read_free( read );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
@ -154,6 +154,9 @@
|
||||
* - read any XMP metadata
|
||||
* 19/1/15
|
||||
* - try to handle 8-bit colormaps
|
||||
* 26/2/15
|
||||
* - close the read down early for a header read ... this saves an
|
||||
* fd during file read, handy for large numbers of input images
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -1678,12 +1681,20 @@ read_stripwise( ReadTiff *rtiff, VipsImage *out )
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
/* Can be called many times.
|
||||
*/
|
||||
static void
|
||||
readtiff_destroy( VipsObject *object, ReadTiff *rtiff )
|
||||
readtiff_free( ReadTiff *rtiff )
|
||||
{
|
||||
VIPS_FREEF( TIFFClose, rtiff->tiff );
|
||||
}
|
||||
|
||||
static void
|
||||
readtiff_close( VipsObject *object, ReadTiff *rtiff )
|
||||
{
|
||||
readtiff_free( rtiff );
|
||||
}
|
||||
|
||||
static ReadTiff *
|
||||
readtiff_new( VipsImage *out, int page, gboolean readbehind )
|
||||
{
|
||||
@ -1710,7 +1721,7 @@ readtiff_new( VipsImage *out, int page, gboolean readbehind )
|
||||
rtiff->contig_buf = NULL;
|
||||
|
||||
g_signal_connect( out, "close",
|
||||
G_CALLBACK( readtiff_destroy ), rtiff );
|
||||
G_CALLBACK( readtiff_close ), rtiff );
|
||||
|
||||
if( rtiff->page < 0 || rtiff->page > 1000000 ) {
|
||||
vips_error( "tiff2vips", _( "bad page number %d" ),
|
||||
@ -1918,6 +1929,10 @@ vips__tiff_read_header( const char *filename, VipsImage *out, int page )
|
||||
if( parse_header( rtiff, out ) )
|
||||
return( -1 );
|
||||
|
||||
/* Just a header read: we can free the tiff read early and save an fd.
|
||||
*/
|
||||
readtiff_free( rtiff );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
@ -52,6 +52,9 @@
|
||||
* - don't check profiles, helps with libpng >=1.6.11
|
||||
* 27/10/14 Lovell
|
||||
* - add @filter option
|
||||
* 26/2/15
|
||||
* - close the read down early for a header read ... this saves an
|
||||
* fd during file read, handy for large numbers of input images
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -150,6 +153,8 @@ typedef struct {
|
||||
|
||||
} Read;
|
||||
|
||||
/* Can be called many times.
|
||||
*/
|
||||
static void
|
||||
read_destroy( Read *read )
|
||||
{
|
||||
@ -423,6 +428,10 @@ vips__png_header( const char *name, VipsImage *out )
|
||||
png2vips_header( read, out ) )
|
||||
return( -1 );
|
||||
|
||||
/* Just a header read: we can free the read early and save an fd.
|
||||
*/
|
||||
read_destroy( read );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user