fix up new buffer.c

and make getpoint() use the threading system
This commit is contained in:
John Cupitt 2016-10-14 09:00:21 +01:00
parent b4d6d6c590
commit ded6f17fa8
4 changed files with 31 additions and 33 deletions

View File

@ -1,4 +1,5 @@
13/10/16 started 8.5.0
- rewritten buffer system is safer and frees memory earlier
27/9/16 started 8.4.2
- small doc improvements

4
TODO
View File

@ -1,3 +1,7 @@
- getpoint() doesn't use a worker, it just calls vips_region_prepare()
directly
we should crop to a mem buffer instead
- rework buffer.c, it's getting ugly

View File

@ -19,6 +19,10 @@
* - redo as a class
* 16/12/14
* - free the input region much earlier
* 14/10/16
* - crop to a memory image rather than using a region ... this means we
* use workers to calculate pixels and therefore use per-thread caching
* in the revised buffer system
*/
/*
@ -86,9 +90,8 @@ vips_getpoint_build( VipsObject *object )
{
VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( object );
VipsGetpoint *getpoint = (VipsGetpoint *) object;
VipsImage **t = (VipsImage **) vips_object_local_array( object, 2 );
VipsRect area;
VipsRegion *region;
double *vector;
int n;
VipsArrayDouble *out_array;
@ -96,31 +99,15 @@ vips_getpoint_build( VipsObject *object )
if( VIPS_OBJECT_CLASS( vips_getpoint_parent_class )->build( object ) )
return( -1 );
/* <0 ruled out already.
*/
if( getpoint->x >= getpoint->in->Xsize ||
getpoint->y >= getpoint->in->Ysize ) {
vips_error( class->nickname,
"%s", _( "coordinates out of range" ) );
return( -1 );
}
if( vips_check_coding_known( class->nickname, getpoint->in ) ||
!(region = vips_region_new( getpoint->in )) )
t[1] = vips_image_new_memory();
if( vips_crop( getpoint->in, &t[0],
getpoint->x, getpoint->y, 1, 1, NULL ) ||
vips_image_write( t[0], t[1] ) )
return( -1 );
area.left = getpoint->x;
area.top = getpoint->y;
area.width = 1;
area.height = 1;
if( vips_region_prepare( region, &area ) ||
!(vector = vips__ink_to_vector( class->nickname, getpoint->in,
VIPS_REGION_ADDR( region, area.left, area.top ),
&n )) ) {
VIPS_UNREF( region );
if( !(vector = vips__ink_to_vector( class->nickname,
getpoint->in, VIPS_IMAGE_ADDR( t[1], 0, 0 ), &n )) )
return( -1 );
}
VIPS_UNREF( region );
out_array = vips_array_double_new( vector, n );
g_object_set( object,

View File

@ -55,10 +55,10 @@
*/
/*
*/
#define DEBUG_VERBOSE
#define DEBUG_CREATE
#define DEBUG
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
@ -101,6 +101,7 @@ vips_buffer_print( VipsBuffer *buffer )
printf( "area.width = %d, ", buffer->area.width );
printf( "area.height = %d, ", buffer->area.height );
printf( "done = %d, ", buffer->done );
printf( "cache = %p, ", buffer->cache );
printf( "buf = %p, ", buffer->buf );
printf( "bsize = %zd\n", buffer->bsize );
}
@ -210,6 +211,10 @@ vips_buffer_free( VipsBuffer *buffer )
g_mutex_unlock( vips__global_lock );
#endif /*DEBUG*/
#ifdef DEBUG_VERBOSE
printf( "vips_buffer_free: freeing buffer %p\n", buffer );
#endif /*DEBUG_VERBOSE*/
}
static void
@ -281,8 +286,8 @@ buffer_cache_new( VipsBufferThread *buffer_thread, VipsImage *im )
g_slist_prepend( vips__buffer_cache_all, cache );
g_mutex_unlock( vips__global_lock );
printf( "buffer_cache_new: new cache %p for thread %p\n",
cache, g_thread_self() );
printf( "buffer_cache_new: new cache %p for thread %p on image %p\n",
cache, g_thread_self(), im );
printf( "\t(%d caches now)\n",
g_slist_length( vips__buffer_cache_all ) );
#endif /*DEBUG_CREATE*/
@ -362,12 +367,6 @@ vips_buffer_done( VipsBuffer *buffer )
if( !buffer->done &&
(cache = buffer_cache_get( im )) ) {
#ifdef DEBUG_VERBOSE
printf( "vips_buffer_done: thread %p adding to cache %p\n",
g_thread_self(), cache );
vips_buffer_print( buffer );
#endif /*DEBUG_VERBOSE*/
g_assert( !g_slist_find( cache->buffers, buffer ) );
g_assert( !buffer->cache );
@ -375,6 +374,13 @@ vips_buffer_done( VipsBuffer *buffer )
buffer->cache = cache;
cache->buffers = g_slist_prepend( cache->buffers, buffer );
#ifdef DEBUG_VERBOSE
printf( "vips_buffer_done: "
"thread %p adding buffer %p to cache %p\n",
g_thread_self(), buffer, cache );
vips_buffer_print( buffer );
#endif /*DEBUG_VERBOSE*/
}
}