From 8023d6bafd42e6b8574c0a62c5cacfa8fec78ec6 Mon Sep 17 00:00:00 2001 From: Dario Casalinuovo Date: Mon, 31 Oct 2016 23:34:48 +0100 Subject: [PATCH] PluginManager: Move reference counting in the MediaPlugin * Ideally we should support this feature by default to allow future improvements to the plugins management. * Fixes the major memory corruption that lead to various crashes on exit in MediaPlayer. --- headers/private/media/MediaPlugin.h | 6 ++++++ headers/private/media/StreamerPlugin.h | 2 -- src/kits/media/MediaPlugin.cpp | 2 ++ src/kits/media/PluginManager.cpp | 11 ++++++----- src/kits/media/StreamerPlugin.cpp | 3 +-- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/headers/private/media/MediaPlugin.h b/headers/private/media/MediaPlugin.h index 5def56c84d..27b4071654 100644 --- a/headers/private/media/MediaPlugin.h +++ b/headers/private/media/MediaPlugin.h @@ -13,6 +13,12 @@ class MediaPlugin { public: MediaPlugin(); virtual ~MediaPlugin(); + +private: + // needed for plug-in reference count management + friend class PluginManager; + + int32 fRefCount; }; class Decoder; diff --git a/headers/private/media/StreamerPlugin.h b/headers/private/media/StreamerPlugin.h index 7701b7eefa..e16b3ee275 100644 --- a/headers/private/media/StreamerPlugin.h +++ b/headers/private/media/StreamerPlugin.h @@ -27,10 +27,8 @@ private: virtual void _ReservedStreamer5(); MediaPlugin* fMediaPlugin; - int32 fRefCount; uint32 fReserved[5]; - // needed for plug-in reference count management friend class PluginManager; }; diff --git a/src/kits/media/MediaPlugin.cpp b/src/kits/media/MediaPlugin.cpp index 99f50ebe13..74a8f6fb8e 100644 --- a/src/kits/media/MediaPlugin.cpp +++ b/src/kits/media/MediaPlugin.cpp @@ -8,6 +8,8 @@ MediaPlugin::MediaPlugin() + : + fRefCount(0) { } diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp index 89c3325744..6037444371 100644 --- a/src/kits/media/PluginManager.cpp +++ b/src/kits/media/PluginManager.cpp @@ -635,7 +635,7 @@ PluginManager::CreateStreamer(Streamer** streamer, BUrl url, BDataIO** source) } (*streamer)->fMediaPlugin = plugin; - (*streamer)->fRefCount += 1; + plugin->fRefCount += 1; BDataIO* streamSource = NULL; if ((*streamer)->Sniff(url, &streamSource) == B_OK) { @@ -666,13 +666,14 @@ PluginManager::DestroyStreamer(Streamer* streamer) // since otherwise we may actually unload the code for the // destructor... MediaPlugin* plugin = streamer->fMediaPlugin; + delete streamer; - // Delete the streamer only when every reference is released - if (streamer->fRefCount == 1) { - delete streamer; + // Delete the plugin only when every reference is released + if (plugin->fRefCount == 1) { + plugin->fRefCount = 0; PutPlugin(plugin); } else - streamer->fRefCount -= 1; + plugin->fRefCount -= 1; } } diff --git a/src/kits/media/StreamerPlugin.cpp b/src/kits/media/StreamerPlugin.cpp index d680abe441..86d240797d 100644 --- a/src/kits/media/StreamerPlugin.cpp +++ b/src/kits/media/StreamerPlugin.cpp @@ -8,8 +8,7 @@ Streamer::Streamer() : - fMediaPlugin(NULL), - fRefCount(0) + fMediaPlugin(NULL) { }