[mythtv] [PATCH] Playlist feature UI tweaking

Kevin Kuphal kuphal at dls.net
Thu Jan 27 12:31:47 EST 2005


Joseph A. Caputo wrote:

>On Thursday 27 January 2005 10:48, Kevin Kuphal wrote:
>  
>
>>I think I found it.  In the randomize function it did a playList = 
>>randomList which for QStringLists makes a reference copy of the list.  
>>The randomPlay list is locally scoped and I think dies by the time you 
>>get over to playSelected which means the pointers are all messed up 
>>    
>>
>and 
>  
>
>>hence the segfault.
>>    
>>
>
>Nope; wrong.  QStringList is one of Qt's "implicitly shared" classes, 
>meaning that the internal storage is passed by reference, but the class 
>maintains a reference count, so even though the local stack variable 
>randomList goes out of scope, the underlying list data is preserved 
>because Qt knows that playList is still referencing it.  You'll 
>probably have to look deeper for the source of your segfault.
>
>This mechanism is the main reason why all of Qt's implicitly shared 
>classes should be passed *by value* when being used as the return value 
>of a function (though passing by reference is fine as in input 
>parameter).  So,
>
>const QStringList & someFunction()
>
>is bad; use
>
>QStringList someFunction()
>
>instead (not that this necessarily applies here, but it's a good thing 
>to know about Qt).  The shared mechanism also means that there is not 
>much overhead when passing by value (the size of the object is 
>independent of the size of the underlying list data, and the sharing 
>mechanism means copy takes constant time), so you wouldn't really gain 
>much by passing by reference anyway.
>
>The other thing to remember about Qt's implicit sharing mechanism is 
>that it employs a copy-on-write/modify mechanism.  Meaning that:
>
>playList = randomList
>
>Causes both variables to share a single copy of the underlying data 
>(with reference counts).  As soon as one of those variables is 
>modified, however, it causes the modified object to make a copy of the 
>data and detach from the shared copy (thus decrementing the reference 
>count).
>
>For more information on Qt's implicit sharing mechanism, see here:
>
>http://doc.trolltech.com/3.3/shclass.html
>  
>
Yeah, I came across that but couldn't tell specifically if the local 
scope would cause this problem or not.  I changed a bit of how the whole 
thing works anyways so we'll see when I get a chance to test if I 
eliminated the segfault by design or just by accident :)

Thank you for that write up, it was very detailed and helpful.

Kevin


More information about the mythtv-dev mailing list