PluginManger: Remove BReferenceable and add locking
This commit is contained in:
parent
ed31589c37
commit
42a3f9477d
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,8 @@
|
||||||
|
|
||||||
Streamer::Streamer()
|
Streamer::Streamer()
|
||||||
:
|
:
|
||||||
fMediaPlugin(NULL)
|
fMediaPlugin(NULL),
|
||||||
|
fRefCount(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue