X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_pool.c;h=e4d47dd40392ee31d28d8f20d1b9c7ec278be4ce;hb=51f99c29759e71318c4c575f8a68cf1b5d1c5137;hp=87da0df1273a415f22c4f34842896a2b376c99ba;hpb=f5a438b319b560eccf511ebf3eed5db9edbac1de;p=melted diff --git a/src/framework/mlt_pool.c b/src/framework/mlt_pool.c index 87da0df..e4d47dd 100644 --- a/src/framework/mlt_pool.c +++ b/src/framework/mlt_pool.c @@ -1,21 +1,23 @@ -/* - * mlt_pool.c -- memory pooling functionality - * Copyright (C) 2003-2004 Ushodaya Enterprises Limited - * Author: Charles Yates +/** + * \file mlt_pool.c + * \brief memory pooling functionality * - * 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. + * Copyright (C) 2003-2008 Ushodaya Enterprises Limited + * \author Charles Yates * - * This program is distributed in the hope that it will be useful, + * 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 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" @@ -35,8 +37,8 @@ static mlt_properties pools = NULL; -/** Private pooling structure. -*/ +/** \brief Pool (memory) class + */ typedef struct mlt_pool_s { @@ -47,6 +49,9 @@ typedef struct mlt_pool_s } *mlt_pool; +/** \brief private to mlt_pool_s, for tracking items to release + */ + typedef struct mlt_release_s { mlt_pool pool; @@ -294,6 +299,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. */ @@ -311,13 +344,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 %c\n", pool->size, pool->count, mlt_deque_count( pool->stack ), - pool->count != mlt_deque_count( pool->stack ) ? '*' : ' ' ); + mlt_log( NULL, MLT_LOG_DEBUG, "%s: size %d allocated %d returned %d %c\n", __FUNCTION__, + pool->size, pool->count, mlt_deque_count( pool->stack ), + pool->count != mlt_deque_count( pool->stack ) ? '*' : ' ' ); } #endif