2012/2/8 Maksym Veremeyenko <ve...@m1stereo.tv>:
> 08.02.12 06:19, Dan Dennedy написав(ла):
>
>>> 2012/1/16 Maksym Veremeyenko<ve...@m1stereo.tv>:
>>>>
>>>> wrong test code where mlt_consumer_stop was called immediately after
>>>> mlt_consumer_start caused that sideeffect.
>>>>
>>>> to resolve such condition i attached a patch that properly determinate
>>>> consumer's thread finish and avoid writing /trailer/ if no /header was
>>>> written..
>>
>>
>> My testing with sdl and decklink consumers showed that they were not
>> vulnerable to this, but indeed avformat was. I resolved this a little
>> differently, and committed it.
>>
>
> the goal of that patch was to disable setting/altering flag /running/ inside
> thread - that could cause some leaks and some race condition i notified
> about...

Well, the more critical goal was to fix a segfault, but I see your
point now about using "running" to cleanup "thread." I did not like
your conversion of the thread property from data to a int64; do you
know how data properties provide destruction? Also, my testing
revealed some additional pointer checks required inside
consumer_thread. Comment on this applied to head:

diff --git a/src/modules/avformat/consumer_avformat.c
b/src/modules/avformat/consumer_avformat.c
index fb52df3..cd63431 100644
--- a/src/modules/avformat/consumer_avformat.c
+++ b/src/modules/avformat/consumer_avformat.c
@@ -350,18 +350,18 @@ static int consumer_stop( mlt_consumer consumer )
 {
        // Get the properties
        mlt_properties properties = MLT_CONSUMER_PROPERTIES( consumer );
+       pthread_t *thread = mlt_properties_get_data( properties, "thread", NULL 
);

        // Check that we're running
-       if ( mlt_properties_get_int( properties, "running" ) )
+       if ( thread )
        {
-               // Get the thread
-               pthread_t *thread = mlt_properties_get_data( properties, 
"thread", NULL );
-
                // Stop the thread
                mlt_properties_set_int( properties, "running", 0 );

                // Wait for termination
                pthread_join( *thread, NULL );
+
+               mlt_properties_set( properties, "thread", NULL );
        }

        return 0;
@@ -1436,12 +1436,12 @@ static void *consumer_thread( void *arg )
 #endif
                        {
                                mlt_log_error( MLT_CONSUMER_SERVICE( consumer 
), "Could not open
'%s'\n", filename );
-                               mlt_properties_set_int( properties, "running", 
0 );
+                               terminated = 1;
                        }
                }
        
                // Write the stream header.
-               if ( mlt_properties_get_int( properties, "running" ) )
+               if ( !terminated && mlt_properties_get_int( properties, 
"running" ) )
 #if LIBAVFORMAT_VERSION_INT >= ((53<<16)+(2<<8)+0)
                        avformat_write_header( oc, NULL );
 #else
@@ -1452,7 +1452,7 @@ static void *consumer_thread( void *arg )
        else
        {
                mlt_log_error( MLT_CONSUMER_SERVICE( consumer ), "Invalid output
format parameters\n" );
-               mlt_properties_set_int( properties, "running", 0 );
+               terminated = 1;
        }
 #endif

@@ -1462,7 +1462,7 @@ static void *consumer_thread( void *arg )

        // Last check - need at least one stream
        if ( !audio_st[0] && !video_st )
-               mlt_properties_set_int( properties, "running", 0 );
+               terminated = 1;

        // Get the starting time (can ignore the times above)
        gettimeofday( &ante, NULL );
@@ -1957,8 +1957,6 @@ on_fatal_error:
        av_free( oc );

        // Just in case we terminated on pause
-       mlt_properties_set_int( properties, "running", 0 );
-
        mlt_consumer_stopped( consumer );
        mlt_properties_close( frame_meta_properties );

------------------------------------------------------------------------------
Keep Your Developer Skills Current with LearnDevNow!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-d2d
_______________________________________________
Mlt-devel mailing list
Mlt-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mlt-devel

Reply via email to