]> git.sesse.net Git - mlt/commitdiff
Add mlt_service_cache_purge and remove purge in mlt_service_close.
authorDan Dennedy <dan@dennedy.org>
Thu, 17 Dec 2009 05:19:33 +0000 (21:19 -0800)
committerDan Dennedy <dan@dennedy.org>
Thu, 17 Dec 2009 05:19:33 +0000 (21:19 -0800)
The avformat producer holds references to cache items within frame
objects. This means mlt_service_close can not purge the cache because
frames may be closed after the producer.

src/framework/mlt_service.c
src/framework/mlt_service.h
src/modules/gtk2/producer_pixbuf.c
src/modules/qimage/producer_qimage.c

index 69dd6132f98e5861d1af38174f04580d592b1792..7ccfcd93083c2d38eab78348993b5b4119e6e4a6 100644 (file)
@@ -66,7 +66,6 @@ static void mlt_service_disconnect( mlt_service this );
 static void mlt_service_connect( mlt_service this, mlt_service that );
 static int service_get_frame( mlt_service this, mlt_frame_ptr frame, int index );
 static void mlt_service_property_changed( mlt_listener, mlt_properties owner, mlt_service this, void **args );
-static void purge_cache( mlt_service self );
 
 /** Initialize a service.
  *
@@ -635,7 +634,6 @@ void mlt_service_close( mlt_service this )
                        free( base->in );
                        pthread_mutex_destroy( &base->mutex );
                        free( base );
-                       purge_cache( this );
                        mlt_properties_close( &this->parent );
                }
        }
@@ -651,7 +649,7 @@ void mlt_service_close( mlt_service this )
  * \param self a service
  */
 
-static void purge_cache( mlt_service self )
+void mlt_service_cache_purge( mlt_service self )
 {
        mlt_properties caches = mlt_properties_get_data( mlt_global_properties(), "caches", NULL );
 
index 89b128e11c6d3305c433d44e66174d7f02502f02..3521759dcb1b86b1dfceebbf2c70e9af6fc64177 100644 (file)
@@ -93,9 +93,11 @@ extern void mlt_service_apply_filters( mlt_service self, mlt_frame frame, int in
 extern mlt_filter mlt_service_filter( mlt_service self, int index );
 extern mlt_profile mlt_service_profile( mlt_service self );
 extern void mlt_service_close( mlt_service self );
+
 extern void mlt_service_cache_put( mlt_service self, const char *name, void* data, int size, mlt_destructor destructor );
 extern mlt_cache_item mlt_service_cache_get( mlt_service self, const char *name );
 extern void mlt_service_cache_set_size( mlt_service self, const char *name, int size );
+extern void mlt_service_cache_purge( mlt_service self );
 
 #endif
 
index e9395ec93704eda9a28cca66725443b1695b16fb..6f87772bb5510ac6264d521a61c13ec2a400485c 100644 (file)
@@ -485,6 +485,7 @@ static void producer_close( mlt_producer parent )
        producer_pixbuf this = parent->child;
        pthread_mutex_destroy( &this->mutex );
        parent->close = NULL;
+       mlt_service_cache_purge( MLT_PRODUCER_SERVICE(parent) );
        mlt_producer_close( parent );
        mlt_properties_close( this->filenames );
        free( this );
index bf7db6fe7780f4d069a5cb009420a4fd280522cd..a290899edca3438d3577dddf0fb1fbd967eba3e5 100644 (file)
@@ -271,6 +271,7 @@ static void producer_close( mlt_producer parent )
        producer_qimage this = parent->child;
        pthread_mutex_destroy( &this->mutex );
        parent->close = NULL;
+       mlt_service_cache_purge( MLT_PRODUCER_SERVICE(parent) );
        mlt_producer_close( parent );
        mlt_properties_close( this->filenames );
        free( this );