diff --git a/headers/private/media/StreamerPlugin.h b/headers/private/media/StreamerPlugin.h index e25290c5bd..7701b7eefa 100644 --- a/headers/private/media/StreamerPlugin.h +++ b/headers/private/media/StreamerPlugin.h @@ -4,7 +4,6 @@ #include #include -#include #include #include "MediaPlugin.h" @@ -28,7 +27,7 @@ private: virtual void _ReservedStreamer5(); MediaPlugin* fMediaPlugin; - BReferenceable fReference; + int32 fRefCount; uint32 fReserved[5]; // needed for plug-in reference count management diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp index d9b6ccd486..89c3325744 100644 --- a/src/kits/media/PluginManager.cpp +++ b/src/kits/media/PluginManager.cpp @@ -6,6 +6,7 @@ #include +#include #include #include #include @@ -595,6 +596,8 @@ PluginManager::DestroyEncoder(Encoder* encoder) status_t PluginManager::CreateStreamer(Streamer** streamer, BUrl url, BDataIO** source) { + BAutolock _(fLocker); + TRACE("PluginManager::CreateStreamer enter\n"); entry_ref refs[MAX_STREAMERS]; @@ -632,7 +635,7 @@ PluginManager::CreateStreamer(Streamer** streamer, BUrl url, BDataIO** source) } (*streamer)->fMediaPlugin = plugin; - (*streamer)->fReference.AcquireReference(); + (*streamer)->fRefCount += 1; BDataIO* streamSource = NULL; if ((*streamer)->Sniff(url, &streamSource) == B_OK) { @@ -653,22 +656,23 @@ PluginManager::CreateStreamer(Streamer** streamer, BUrl url, BDataIO** source) void PluginManager::DestroyStreamer(Streamer* streamer) { + BAutolock _(fLocker); + if (streamer != NULL) { TRACE("PluginManager::DestroyStreamer(%p, plugin: %p)\n", streamer, streamer->fMediaPlugin); + // NOTE: We have to put the plug-in after deleting the streamer, // since otherwise we may actually unload the code for the // destructor... - MediaPlugin* plugin = streamer->fMediaPlugin; + // Delete the streamer only when every reference is released - // we avoid to call ReleaseReference on the last object - // and handle deletion when the streamer is destroyed. - if (streamer->fReference.CountReferences() == 1) { + if (streamer->fRefCount == 1) { delete streamer; PutPlugin(plugin); } else - streamer->fReference.ReleaseReference(); + streamer->fRefCount -= 1; } } diff --git a/src/kits/media/StreamerPlugin.cpp b/src/kits/media/StreamerPlugin.cpp index 86d240797d..d680abe441 100644 --- a/src/kits/media/StreamerPlugin.cpp +++ b/src/kits/media/StreamerPlugin.cpp @@ -8,7 +8,8 @@ Streamer::Streamer() : - fMediaPlugin(NULL) + fMediaPlugin(NULL), + fRefCount(0) { }