X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_pool.c;h=7c8657c4193e207efd5b5e5c200da302313e8f19;hb=f0f9e433051b21e14471bb48bc5d140e6c2b14c5;hp=daa0d297b28e0573f44327cde91529e4283cf856;hpb=7ac623df605d7daa8125b189cf77a937cfe03888;p=melted diff --git a/src/framework/mlt_pool.c b/src/framework/mlt_pool.c index daa0d29..7c8657c 100644 --- a/src/framework/mlt_pool.c +++ b/src/framework/mlt_pool.c @@ -3,29 +3,33 @@ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited * Author: Charles Yates * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, + * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "mlt_properties.h" #include "mlt_deque.h" #include -#include #include #include +// Not nice - memalign is defined here apparently? +#ifdef linux +#include +#endif + /** Singleton repositories */ @@ -101,11 +105,18 @@ static void *pool_fetch( mlt_pool this ) else { // We need to generate a release item +#ifdef linux mlt_release release = memalign( 16, this->size ); +#else + mlt_release release = malloc( this->size ); +#endif // Initialise it if ( release != NULL ) { + // Increment the number of items allocated to this pool + this->count ++; + // Assign the pool release->pool = this; @@ -242,6 +253,75 @@ void *mlt_pool_alloc( int size ) return pool_fetch( pool ); } +/** Allocate size bytes from the pool. +*/ + +void *mlt_pool_realloc( void *ptr, int size ) +{ + // Result to return + void *result = NULL; + + // Check if we actually have an address + if ( ptr != NULL ) + { + // Get the release pointer + mlt_release that = ptr - sizeof( struct mlt_release_s ); + + // If the current pool this ptr belongs to is big enough + if ( size > that->pool->size - sizeof( struct mlt_release_s ) ) + { + // Allocate + result = mlt_pool_alloc( size ); + + // Copy + memcpy( result, ptr, that->pool->size - sizeof( struct mlt_release_s ) ); + + // Release + mlt_pool_release( ptr ); + } + else + { + // Nothing to do + result = ptr; + } + } + else + { + // Simply allocate + result = mlt_pool_alloc( size ); + } + + return result; +} + +/** Purge unused items in the pool. +*/ + +void mlt_pool_purge( ) +{ + int i = 0; + + // For each pool + for ( i = 0; i < mlt_properties_count( pools ); i ++ ) + { + // Get the pool + mlt_pool this = mlt_properties_get_data_at( pools, i, NULL ); + + // Pointer to unused memory + void *release = NULL; + + // Lock the pool + pthread_mutex_lock( &this->lock ); + + // We'll free all unused items now + while ( ( release = mlt_deque_pop_back( this->stack ) ) != NULL ) + free( release - sizeof( struct mlt_release_s ) ); + + // Unlock the pool + pthread_mutex_unlock( &this->lock ); + } +} + /** Release the allocated memory. */ @@ -256,6 +336,19 @@ void mlt_pool_release( void *release ) void mlt_pool_close( ) { +#ifdef _MLT_POOL_CHECKS_ + // Stats dump on close + int i = 0; + fprintf( stderr, "Usage:\n\n" ); + for ( i = 0; i < mlt_properties_count( pools ); i ++ ) + { + mlt_pool pool = mlt_properties_get_data_at( pools, i, NULL ); + if ( pool->count ) + fprintf( stderr, "%d: allocated %d returned %d %c\n", pool->size, pool->count, mlt_deque_count( pool->stack ), + pool->count != mlt_deque_count( pool->stack ) ? '*' : ' ' ); + } +#endif + // Close the properties mlt_properties_close( pools ); }