]> git.sesse.net Git - mlt/blobdiff - src/framework/mlt_pool.c
src/framework/*: improve the doxygen documentation (work in progress). This also...
[mlt] / src / framework / mlt_pool.c
index e908cbf76deda0de5816738c04748b8579cc367e..d58d02cabddda0bc7dab3664614d31176fc2c9a5 100644 (file)
@@ -1,38 +1,44 @@
-/*
- * mlt_pool.c -- memory pooling functionality
- * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
- * Author: Charles Yates <charles.yates@pandora.be>
+/**
+ * \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 <charles.yates@pandora.be>
  *
- * 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"
 #include "mlt_deque.h"
 
 #include <stdlib.h>
-#include <malloc.h>
 #include <string.h>
 #include <pthread.h>
 
+// Not nice - memalign is defined here apparently?
+#ifdef linux
+#include <malloc.h>
+#endif
+
 /** Singleton repositories
 */
 
 static mlt_properties pools = NULL;
 
-/** Private pooling structure.
-*/
+/** \brief Pool (memory) class
+ */
 
 typedef struct mlt_pool_s
 {
@@ -43,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;
@@ -101,7 +110,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 +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.
 */
 
@@ -303,11 +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\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