/* Pixels have been calculated: publish for other parts of this thread to see. */ void vips_buffer_done( VipsBuffer *buffer ) { if( !buffer->done ) { VipsImage *im = buffer->im; VipsBufferCache *cache = buffer_cache_get(); VipsBufferCacheList *cache_list; #ifdef DEBUG printf( "vips_buffer_done: thread %p adding to cache %p\n", g_thread_self(), cache ); vips_buffer_print( buffer ); #endif /*DEBUG*/ /* Look up and update the buffer list. */ if( !(cache_list = g_hash_table_lookup( cache->hash, im )) ) { cache_list = buffer_cache_list_new( cache, im ); g_hash_table_insert( cache->hash, im, cache_list ); } g_assert( !g_slist_find( cache_list->buffers, buffer ) ); g_assert( cache_list->thread == cache->thread ); cache_list->buffers = g_slist_prepend( cache_list->buffers, buffer ); buffer->done = TRUE; buffer->cache = cache; } }
static void * vips_buffer_dump( VipsBuffer *buffer, size_t *reserve, size_t *alive ) { vips_buffer_print( buffer ); g_assert( buffer->im ); g_assert( buffer->buf ); if( !buffer->cache && !buffer->done ) { /* Global buffer, not linked to any cache. */ printf( "global buffer %p, %.3g MB\n", buffer, buffer->bsize / (1024 * 1024.0) ); *alive += buffer->bsize; } else if( buffer->cache && buffer->done && !vips_rect_isempty( &buffer->area ) && g_slist_find( buffer->cache->buffers, buffer ) ) { /* Published on a thread. */ printf( "thread buffer %p, %.3g MB\n", buffer, buffer->bsize / (1024 * 1024.0) ); *alive += buffer->bsize; } else if( buffer->ref_count == 0 && buffer->cache && !buffer->done && vips_rect_isempty( &buffer->area ) && g_slist_find( buffer->cache->reserve, buffer ) ) /* Held in reserve. */ *reserve += buffer->bsize; else printf( "buffer craziness!\n" ); return( NULL ); }
static void * vips_buffer_dump( VipsBuffer *buffer, size_t *reserve, size_t *alive ) { vips_buffer_print( buffer ); if( buffer->im && buffer->buf && buffer->cache ) { printf( "buffer %p, %.3g MB\n", buffer, buffer->bsize / (1024 * 1024.0) ); *alive += buffer->bsize; } else if( buffer->im && buffer->buf && !buffer->cache ) *reserve += buffer->bsize; else printf( "buffer craziness!\n" ); return( NULL ); }
/* Pixels have been calculated: publish for other parts of this thread to see. */ void vips_buffer_done( VipsBuffer *buffer ) { if( !buffer->done ) { VipsImage *im = buffer->im; VipsBufferCache *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 ); buffer->done = TRUE; buffer->cache = cache; cache->buffers = g_slist_prepend( cache->buffers, buffer ); } }