[Mlt-devel] SF.net SVN: mlt: [1154] trunk/mlt/src/framework
Brought to you by:
ddennedy,
lilo_booter
From: <dde...@us...> - 2008-06-30 01:53:08
|
Revision: 1154 http://mlt.svn.sourceforge.net/mlt/?rev=1154&view=rev Author: ddennedy Date: 2008-06-29 18:53:07 -0700 (Sun, 29 Jun 2008) Log Message: ----------- mlt_properties.c, mlt_service.c: bugfix to make reference counting and service closure truly thread-safe. As it was, reference count increment and decrement operations were not atomic and not protected comprehensively. Modified Paths: -------------- trunk/mlt/src/framework/mlt_properties.c trunk/mlt/src/framework/mlt_service.c Modified: trunk/mlt/src/framework/mlt_properties.c =================================================================== --- trunk/mlt/src/framework/mlt_properties.c 2008-06-30 01:50:06 UTC (rev 1153) +++ trunk/mlt/src/framework/mlt_properties.c 2008-06-30 01:53:07 UTC (rev 1154) @@ -28,7 +28,7 @@ #include <string.h> #include <ctype.h> #include <stdarg.h> - +#include <pthread.h> #include <sys/types.h> #include <dirent.h> @@ -46,6 +46,7 @@ int size; mlt_properties mirror; int ref_count; + pthread_mutex_t mutex; } property_list; @@ -82,6 +83,7 @@ // Increment the ref count ( ( property_list * )this->local )->ref_count = 1; + pthread_mutex_init( &( ( property_list * )this->local )->mutex, NULL );; } // Check that initialisation was successful @@ -186,12 +188,15 @@ int mlt_properties_inc_ref( mlt_properties this ) { + int result = 0; if ( this != NULL ) { property_list *list = this->local; - return ++ list->ref_count; + pthread_mutex_lock( &list->mutex ); + result = ++ list->ref_count; + pthread_mutex_unlock( &list->mutex ); } - return 0; + return result; } /** Maintain ref count to allow multiple uses of an mlt object. @@ -199,12 +204,15 @@ int mlt_properties_dec_ref( mlt_properties this ) { + int result = 0; if ( this != NULL ) { property_list *list = this->local; - return -- list->ref_count; + pthread_mutex_lock( &list->mutex ); + result = -- list->ref_count; + pthread_mutex_unlock( &list->mutex ); } - return 0; + return result; } /** Return the ref count of this object. @@ -903,6 +911,7 @@ } // Clear up the list + pthread_mutex_destroy( &list->mutex ); free( list->name ); free( list->value ); free( list ); Modified: trunk/mlt/src/framework/mlt_service.c =================================================================== --- trunk/mlt/src/framework/mlt_service.c 2008-06-30 01:50:06 UTC (rev 1153) +++ trunk/mlt/src/framework/mlt_service.c 2008-06-30 01:53:07 UTC (rev 1154) @@ -188,11 +188,7 @@ // Increment the reference count on this producer if ( producer != NULL ) - { - mlt_service_lock( producer ); mlt_properties_inc_ref( MLT_SERVICE_PROPERTIES( producer ) ); - mlt_service_unlock( producer ); - } // Now we disconnect the producer service from its consumer mlt_service_disconnect( producer ); @@ -499,10 +495,8 @@ void mlt_service_close( mlt_service this ) { - mlt_service_lock( this ); if ( this != NULL && mlt_properties_dec_ref( MLT_SERVICE_PROPERTIES( this ) ) <= 0 ) { - mlt_service_unlock( this ); if ( this->close != NULL ) { this->close( this->close_object ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |