X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_pool.c;h=ebf0081abdac3d722ab1a9d5c4cecf6d9f312243;hb=4112170ce8053261b9c67f58df87c2a3573b6602;hp=7c8657c4193e207efd5b5e5c200da302313e8f19;hpb=bf3264b9e340ba5c11cbf59835a8af3db94e0cc2;p=melted diff --git a/src/framework/mlt_pool.c b/src/framework/mlt_pool.c index 7c8657c..ebf0081 100644 --- a/src/framework/mlt_pool.c +++ b/src/framework/mlt_pool.c @@ -1,7 +1,10 @@ -/* - * mlt_pool.c -- memory pooling functionality - * Copyright (C) 2003-2004 Ushodaya Enterprises Limited - * Author: Charles Yates +/** + * \file mlt_pool.c + * \brief memory pooling functionality + * \see mlt_pool_s + * + * Copyright (C) 2003-2009 Ushodaya Enterprises Limited + * \author Charles Yates * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -30,23 +33,25 @@ #include #endif -/** Singleton repositories -*/ +/** global singleton for tracking pools */ static mlt_properties pools = NULL; -/** Private pooling structure. -*/ +/** \brief Pool (memory) class + */ typedef struct mlt_pool_s { - pthread_mutex_t lock; - mlt_deque stack; - int size; - int count; + pthread_mutex_t lock; ///< lock to prevent race conditions + mlt_deque stack; ///< a stack of addresses to memory blocks + int size; ///< the size of the memory block as a power of 2 + int count; ///< the number of blocks in the pool } *mlt_pool; +/** \brief private to mlt_pool_s, for tracking items to release + */ + typedef struct mlt_release_s { mlt_pool pool; @@ -55,7 +60,11 @@ typedef struct mlt_release_s *mlt_release; /** Create a pool. -*/ + * + * \private \memberof mlt_pool_s + * \param size the size of the memory blocks to hold as some power of two + * \return a new pool object + */ static mlt_pool pool_init( int size ) { @@ -80,7 +89,11 @@ static mlt_pool pool_init( int size ) } /** Get an item from the pool. -*/ + * + * \private \memberof mlt_pool_s + * \param this a pool + * \return an opaque pointer + */ static void *pool_fetch( mlt_pool this ) { @@ -124,7 +137,7 @@ static void *pool_fetch( mlt_pool this ) release->references = 1; // Determine the ptr - ptr = ( void * )release + sizeof( struct mlt_release_s ); + ptr = ( char * )release + sizeof( struct mlt_release_s ); } } @@ -137,7 +150,10 @@ static void *pool_fetch( mlt_pool this ) } /** Return an item to the pool. -*/ + * + * \private \memberof mlt_pool_s + * \param ptr an opaque pointer + */ static void pool_return( void *ptr ) { @@ -145,7 +161,7 @@ static void pool_return( void *ptr ) if ( ptr != NULL ) { // Get the release pointer - mlt_release that = ptr - sizeof( struct mlt_release_s ); + mlt_release that = ( void * )(( char * )ptr - sizeof( struct mlt_release_s )); // Get the pool mlt_pool this = that->pool; @@ -170,12 +186,15 @@ static void pool_return( void *ptr ) if ( ptr != NULL ) { // Free the release itself - free( ptr - sizeof( struct mlt_release_s ) ); + free( ( char * )ptr - sizeof( struct mlt_release_s ) ); } } /** Destroy a pool. -*/ + * + * \private \memberof mlt_pool_s + * \param this a pool + */ static void pool_close( mlt_pool this ) { @@ -188,7 +207,7 @@ static void pool_close( mlt_pool this ) while ( ( release = mlt_deque_pop_back( this->stack ) ) != NULL ) { // We'll free this item now - free( release - sizeof( struct mlt_release_s ) ); + free( ( char * )release - sizeof( struct mlt_release_s ) ); } // We can now close the stack @@ -202,8 +221,10 @@ static void pool_close( mlt_pool this ) } } -/** Initialise the pool. -*/ +/** Initialise the global pool. + * + * \public \memberof mlt_pool_s + */ void mlt_pool_init( ) { @@ -231,7 +252,10 @@ void mlt_pool_init( ) } /** Allocate size bytes from the pool. -*/ + * + * \public \memberof mlt_pool_s + * \param size the number of bytes + */ void *mlt_pool_alloc( int size ) { @@ -254,7 +278,11 @@ void *mlt_pool_alloc( int size ) } /** Allocate size bytes from the pool. -*/ + * + * \public \memberof mlt_pool_s + * \param ptr an opaque pointer - can be in the pool or a new block to allocate + * \param size the number of bytes + */ void *mlt_pool_realloc( void *ptr, int size ) { @@ -265,7 +293,7 @@ void *mlt_pool_realloc( void *ptr, int size ) if ( ptr != NULL ) { // Get the release pointer - mlt_release that = ptr - sizeof( struct mlt_release_s ); + mlt_release that = ( void * )(( char * )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 ) ) @@ -295,7 +323,10 @@ void *mlt_pool_realloc( void *ptr, int size ) } /** Purge unused items in the pool. -*/ + * + * A form of garbage collection. + * \public \memberof mlt_pool_s + */ void mlt_pool_purge( ) { @@ -315,7 +346,7 @@ void mlt_pool_purge( ) // We'll free all unused items now while ( ( release = mlt_deque_pop_back( this->stack ) ) != NULL ) - free( release - sizeof( struct mlt_release_s ) ); + free( ( char * )release - sizeof( struct mlt_release_s ) ); // Unlock the pool pthread_mutex_unlock( &this->lock ); @@ -323,7 +354,10 @@ void mlt_pool_purge( ) } /** Release the allocated memory. -*/ + * + * \public \memberof mlt_pool_s + * \param release an opaque pointer of a block in the pool + */ void mlt_pool_release( void *release ) { @@ -332,20 +366,22 @@ void mlt_pool_release( void *release ) } /** Close the pool. -*/ + * + * \public \memberof mlt_pool_s + */ 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