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();
}
}