X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_pool.c;h=ee1d2441f9b65dcd925338064df9696aa0dc4b28;hb=2ff111fe322cfdea5b879dd7912a8a375af62aff;hp=e908cbf76deda0de5816738c04748b8579cc367e;hpb=2c0cf75e5da5906e48c5a6398bd48d04501283b9;p=melted diff --git a/src/framework/mlt_pool.c b/src/framework/mlt_pool.c index e908cbf..ee1d244 100644 --- a/src/framework/mlt_pool.c +++ b/src/framework/mlt_pool.c @@ -22,10 +22,14 @@ #include "mlt_deque.h" #include -#include #include #include +// Not nice - memalign is defined here apparently? +#ifdef linux +#include +#endif + /** Singleton repositories */ @@ -101,7 +105,11 @@ 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 ) @@ -286,6 +294,34 @@ void *mlt_pool_realloc( void *ptr, int 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. */ @@ -303,11 +339,13 @@ 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\n", pool->size, pool->count, mlt_deque_count( pool->stack ) ); + 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