PluginManger: Remove BReferenceable and add locking

This commit is contained in:
Dario Casalinuovo 2016-09-25 23:10:04 +02:00
parent ed31589c37
commit 42a3f9477d
3 changed files with 13 additions and 9 deletions

View File

@ -4,7 +4,6 @@
#include <MediaIO.h> #include <MediaIO.h>
#include <MediaTrack.h> #include <MediaTrack.h>
#include <Referenceable.h>
#include <Url.h> #include <Url.h>
#include "MediaPlugin.h" #include "MediaPlugin.h"
@ -28,7 +27,7 @@ private:
virtual void _ReservedStreamer5(); virtual void _ReservedStreamer5();
MediaPlugin* fMediaPlugin; MediaPlugin* fMediaPlugin;
BReferenceable fReference; int32 fRefCount;
uint32 fReserved[5]; uint32 fReserved[5];
// needed for plug-in reference count management // needed for plug-in reference count management

View File

@ -6,6 +6,7 @@
#include <AdapterIO.h> #include <AdapterIO.h>
#include <Autolock.h>
#include <BufferIO.h> #include <BufferIO.h>
#include <DataIO.h> #include <DataIO.h>
#include <image.h> #include <image.h>
@ -595,6 +596,8 @@ PluginManager::DestroyEncoder(Encoder* encoder)
status_t status_t
PluginManager::CreateStreamer(Streamer** streamer, BUrl url, BDataIO** source) PluginManager::CreateStreamer(Streamer** streamer, BUrl url, BDataIO** source)
{ {
BAutolock _(fLocker);
TRACE("PluginManager::CreateStreamer enter\n"); TRACE("PluginManager::CreateStreamer enter\n");
entry_ref refs[MAX_STREAMERS]; entry_ref refs[MAX_STREAMERS];
@ -632,7 +635,7 @@ PluginManager::CreateStreamer(Streamer** streamer, BUrl url, BDataIO** source)
} }
(*streamer)->fMediaPlugin = plugin; (*streamer)->fMediaPlugin = plugin;
(*streamer)->fReference.AcquireReference(); (*streamer)->fRefCount += 1;
BDataIO* streamSource = NULL; BDataIO* streamSource = NULL;
if ((*streamer)->Sniff(url, &streamSource) == B_OK) { if ((*streamer)->Sniff(url, &streamSource) == B_OK) {
@ -653,22 +656,23 @@ PluginManager::CreateStreamer(Streamer** streamer, BUrl url, BDataIO** source)
void void
PluginManager::DestroyStreamer(Streamer* streamer) PluginManager::DestroyStreamer(Streamer* streamer)
{ {
BAutolock _(fLocker);
if (streamer != NULL) { if (streamer != NULL) {
TRACE("PluginManager::DestroyStreamer(%p, plugin: %p)\n", streamer, TRACE("PluginManager::DestroyStreamer(%p, plugin: %p)\n", streamer,
streamer->fMediaPlugin); streamer->fMediaPlugin);
// NOTE: We have to put the plug-in after deleting the streamer, // NOTE: We have to put the plug-in after deleting the streamer,
// since otherwise we may actually unload the code for the // since otherwise we may actually unload the code for the
// destructor... // destructor...
MediaPlugin* plugin = streamer->fMediaPlugin; MediaPlugin* plugin = streamer->fMediaPlugin;
// Delete the streamer only when every reference is released // Delete the streamer only when every reference is released
// we avoid to call ReleaseReference on the last object if (streamer->fRefCount == 1) {
// and handle deletion when the streamer is destroyed.
if (streamer->fReference.CountReferences() == 1) {
delete streamer; delete streamer;
PutPlugin(plugin); PutPlugin(plugin);
} else } else
streamer->fReference.ReleaseReference(); streamer->fRefCount -= 1;
} }
} }

View File

@ -8,7 +8,8 @@
Streamer::Streamer() Streamer::Streamer()
: :
fMediaPlugin(NULL) fMediaPlugin(NULL),
fRefCount(0)
{ {
} }