X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_properties.c;h=4b0f76bb91e68027ebd1716256b1dd9f1089c740;hb=25f69a94909b67a20d84bc0503c954d0a491ca36;hp=7a7010e7f07748bf8343d5e75f41032e48f00c9c;hpb=23571c330fd1644833dcb73661ac987eda177200;p=melted diff --git a/src/framework/mlt_properties.c b/src/framework/mlt_properties.c index 7a7010e..4b0f76b 100644 --- a/src/framework/mlt_properties.c +++ b/src/framework/mlt_properties.c @@ -42,21 +42,38 @@ typedef struct } property_list; +/** Memory leak checks. +*/ + +#ifdef _MLT_PROPERTY_CHECKS_ +static int properties_created = 0; +static int properties_destroyed = 0; +#endif + /** Basic implementation. */ int mlt_properties_init( mlt_properties this, void *child ) { - // NULL all methods - memset( this, 0, sizeof( struct mlt_properties_s ) ); + if ( this != NULL ) + { +#ifdef _MLT_PROPERTY_CHECKS_ + // Increment number of properties created + properties_created ++; +#endif - // Assign the child of the object - this->child = child; + // NULL all methods + memset( this, 0, sizeof( struct mlt_properties_s ) ); - // Allocate the private structure - this->private = calloc( sizeof( property_list ), 1 ); + // Assign the child of the object + this->child = child; - return this->private == NULL; + // Allocate the private structure + this->private = calloc( sizeof( property_list ), 1 ); + } + + // Check that initialisation was successful + return this != NULL && this->private == NULL; } /** Constructor for stand alone object. @@ -520,7 +537,8 @@ void mlt_properties_dump( mlt_properties this, FILE *output ) property_list *list = this->private; int i = 0; for ( i = 0; i < list->count; i ++ ) - fprintf( stderr, "%s = %s\n", list->name[ i ], mlt_properties_get( this, list->name[ i ] ) ); + if ( mlt_properties_get( this, list->name[ i ] ) != NULL ) + fprintf( output, "%s=%s\n", list->name[ i ], mlt_properties_get( this, list->name[ i ] ) ); } /** Close the list. @@ -528,23 +546,34 @@ void mlt_properties_dump( mlt_properties this, FILE *output ) void mlt_properties_close( mlt_properties this ) { - property_list *list = this->private; - int index = 0; - - // Clean up names and values - for ( index = list->count - 1; index >= 0; index -- ) + if ( this != NULL ) { - free( list->name[ index ] ); - mlt_property_close( list->value[ index ] ); - } + property_list *list = this->private; + int index = 0; - // Clear up the list - free( list->name ); - free( list->value ); - free( list ); + // Clean up names and values + for ( index = list->count - 1; index >= 0; index -- ) + { + free( list->name[ index ] ); + mlt_property_close( list->value[ index ] ); + } - // Free this now if this has no child - if ( this->child == NULL ) - free( this ); + // Clear up the list + free( list->name ); + free( list->value ); + free( list ); + + // Free this now if this has no child + if ( this->child == NULL ) + free( this ); + +#ifdef _MLT_PROPERTY_CHECKS_ + // Increment destroyed count + properties_destroyed ++; + + // Show current stats - these should match when the app is closed + fprintf( stderr, "Created %d, destroyed %d\n", properties_created, properties_destroyed ); +#endif + } }