[haiku-commits] haiku: hrev50532 - src/kits/media

  • From: b.vitruvio@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 7 Sep 2016 20:45:13 +0200 (CEST)

hrev50532 adds 1 changeset to branch 'master'
old head: 3ff901ac715531f0c3158c6a6884506c17198425
new head: ac8ca41623ab1052e4327353a36257b2810b3387
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=ac8ca41623ab+%5E3ff901ac7155

----------------------------------------------------------------------------

ac8ca41623ab: Fix StreamerPlugin reference counting
  
  * BReferenceable deleted itself when the latest
  reference was released causing a double free.
  * The code now avoid to call the function when
  we are about to delete the object.

                                [ Dario Casalinuovo <b.vitruvio@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev50532
Commit:      ac8ca41623ab1052e4327353a36257b2810b3387
URL:         http://cgit.haiku-os.org/haiku/commit/?id=ac8ca41623ab
Author:      Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date:        Wed Sep  7 18:24:55 2016 UTC

----------------------------------------------------------------------------

1 file changed, 6 insertions(+), 5 deletions(-)
src/kits/media/PluginManager.cpp | 11 ++++++-----

----------------------------------------------------------------------------

diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index 49cd9fe..d9b6ccd 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -632,12 +632,12 @@ PluginManager::CreateStreamer(Streamer** streamer, BUrl 
url, BDataIO** source)
                }
 
                (*streamer)->fMediaPlugin = plugin;
+               (*streamer)->fReference.AcquireReference();
 
                BDataIO* streamSource = NULL;
                if ((*streamer)->Sniff(url, &streamSource) == B_OK) {
                        TRACE("PluginManager::CreateStreamer: Sniff success\n");
                        *source = streamSource;
-                       (*streamer)->fReference.AcquireReference();
                        return B_OK;
                }
 
@@ -661,13 +661,14 @@ PluginManager::DestroyStreamer(Streamer* streamer)
                // destructor...
 
                MediaPlugin* plugin = streamer->fMediaPlugin;
-               streamer->fReference.ReleaseReference();
-
                // Delete the streamer only when every reference is released
-               if (streamer->fReference.CountReferences() == 0) {
+               // we avoid to call ReleaseReference on the last object
+               // and handle deletion when the streamer is destroyed.
+               if (streamer->fReference.CountReferences() == 1) {
                        delete streamer;
                        PutPlugin(plugin);
-               }
+               } else
+                       streamer->fReference.ReleaseReference();
        }
 }
 


Other related posts: