hrev50531 adds 4 changesets to branch 'master'
old head: c6b4e47a504b154b1d726f4ab65502a449ae38ed
new head: 3ff901ac715531f0c3158c6a6884506c17198425
overview:
http://cgit.haiku-os.org/haiku/log/?qt=range&q=3ff901ac7155+%5Ec6b4e47a504b
----------------------------------------------------------------------------
95a5e6251580: MediaFile: Correctly delete the source on exit
* The delete flag of BUrl constructors was reset by _Init,
this lead to a zombie thread on the background under certain
conditions.
79bd3b48377d: StreamerPlugin: Add reference count
* Keep the Streamer around until everyone released it.
e3f2079964c3: AdapterIO: Remove unuseful Close()
3ff901ac7155: http_streamer: Fix different issues
* Cleanup object management.
* Remove Close() and use the destructor in place.
* Release listener sem on exit.
* Return when there's a request mismatch.
* Add some debugging.
* MediaPlayer crashes are fixed as result of the patchset.
[ Dario Casalinuovo <b.vitruvio@xxxxxxxxx> ]
----------------------------------------------------------------------------
8 files changed, 48 insertions(+), 46 deletions(-)
headers/private/media/AdapterIO.h | 1 -
headers/private/media/StreamerPlugin.h | 2 +
.../media/plugins/http_streamer/HTTPMediaIO.cpp | 46 ++++++++++----------
.../media/plugins/http_streamer/HTTPMediaIO.h | 1 -
.../plugins/http_streamer/HTTPStreamerPlugin.cpp | 7 +++
src/kits/media/AdapterIO.cpp | 12 -----
src/kits/media/MediaFile.cpp | 6 +--
src/kits/media/PluginManager.cpp | 19 +++++---
############################################################################
Commit: 95a5e62515808b415511be61fc318e627141f9b0
URL: http://cgit.haiku-os.org/haiku/commit/?id=95a5e6251580
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Wed Sep 7 16:02:34 2016 UTC
MediaFile: Correctly delete the source on exit
* The delete flag of BUrl constructors was reset by _Init,
this lead to a zombie thread on the background under certain
conditions.
----------------------------------------------------------------------------
diff --git a/src/kits/media/MediaFile.cpp b/src/kits/media/MediaFile.cpp
index 447ab3a..ec02f08 100644
--- a/src/kits/media/MediaFile.cpp
+++ b/src/kits/media/MediaFile.cpp
@@ -85,8 +85,8 @@ BMediaFile::BMediaFile(const media_file_format* mfi, int32
flags)
BMediaFile::BMediaFile(const BUrl& url)
{
CALLED();
- fDeleteSource = true;
_Init();
+ fDeleteSource = true;
_InitReader(NULL, &url);
}
@@ -94,8 +94,8 @@ BMediaFile::BMediaFile(const BUrl& url)
BMediaFile::BMediaFile(const BUrl& url, int32 flags)
{
CALLED();
- fDeleteSource = true;
_Init();
+ fDeleteSource = true;
_InitReader(NULL, &url, flags);
}
@@ -104,8 +104,8 @@ BMediaFile::BMediaFile(BUrl destination, const
media_file_format* mfi,
int32 flags)
{
CALLED();
- fDeleteSource = true;
_Init();
+ fDeleteSource = true;
_InitWriter(NULL, &destination, mfi, flags);
// TODO: Implement streaming server support, it's
// a pretty complex thing compared to client mode
############################################################################
Commit: 79bd3b48377de014f9a3c52edf57acb40a9b7a83
URL: http://cgit.haiku-os.org/haiku/commit/?id=79bd3b48377d
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Wed Sep 7 16:19:10 2016 UTC
StreamerPlugin: Add reference count
* Keep the Streamer around until everyone released it.
----------------------------------------------------------------------------
diff --git a/headers/private/media/StreamerPlugin.h
b/headers/private/media/StreamerPlugin.h
index 4fdfef5..e25290c 100644
--- a/headers/private/media/StreamerPlugin.h
+++ b/headers/private/media/StreamerPlugin.h
@@ -4,6 +4,7 @@
#include <MediaIO.h>
#include <MediaTrack.h>
+#include <Referenceable.h>
#include <Url.h>
#include "MediaPlugin.h"
@@ -27,6 +28,7 @@ private:
virtual void _ReservedStreamer5();
MediaPlugin* fMediaPlugin;
+ BReferenceable fReference;
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 c26fa3a..49cd9fe 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -25,8 +25,7 @@ PluginManager gPluginManager;
#define MAX_STREAMERS 40
-class DataIOAdapter : public BAdapterIO
-{
+class DataIOAdapter : public BAdapterIO {
public:
DataIOAdapter(BDataIO* dataIO)
:
@@ -78,8 +77,7 @@ private:
};
-class BMediaIOWrapper : public BMediaIO
-{
+class BMediaIOWrapper : public BMediaIO {
public:
BMediaIOWrapper(BDataIO* source)
:
@@ -639,6 +637,7 @@ PluginManager::CreateStreamer(Streamer** streamer, BUrl
url, BDataIO** source)
if ((*streamer)->Sniff(url, &streamSource) == B_OK) {
TRACE("PluginManager::CreateStreamer: Sniff success\n");
*source = streamSource;
+ (*streamer)->fReference.AcquireReference();
return B_OK;
}
@@ -657,12 +656,18 @@ PluginManager::DestroyStreamer(Streamer* streamer)
if (streamer != NULL) {
TRACE("PluginManager::DestroyStreamer(%p, plugin: %p)\n",
streamer,
streamer->fMediaPlugin);
- // NOTE: We have to put the plug-in after deleting the encoder,
+ // 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 streamer;
- PutPlugin(plugin);
+ streamer->fReference.ReleaseReference();
+
+ // Delete the streamer only when every reference is released
+ if (streamer->fReference.CountReferences() == 0) {
+ delete streamer;
+ PutPlugin(plugin);
+ }
}
}
############################################################################
Commit: e3f2079964c3677552fca645602e6dc464622563
URL: http://cgit.haiku-os.org/haiku/commit/?id=e3f2079964c3
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Wed Sep 7 16:21:13 2016 UTC
AdapterIO: Remove unuseful Close()
----------------------------------------------------------------------------
diff --git a/headers/private/media/AdapterIO.h
b/headers/private/media/AdapterIO.h
index bf09c16..8191006 100644
--- a/headers/private/media/AdapterIO.h
+++ b/headers/private/media/AdapterIO.h
@@ -56,7 +56,6 @@ public:
virtual status_t GetSize(off_t* size)
const;
virtual status_t Open();
- virtual void Close();
virtual bool IsRunning() const;
diff --git a/src/kits/media/AdapterIO.cpp b/src/kits/media/AdapterIO.cpp
index 8227a2f..56ccbb7 100644
--- a/src/kits/media/AdapterIO.cpp
+++ b/src/kits/media/AdapterIO.cpp
@@ -229,9 +229,6 @@ BAdapterIO::~BAdapterIO()
{
CALLED();
- if (!fOpened)
- Close();
-
delete fInputAdapter;
delete fBuffer;
}
@@ -342,15 +339,6 @@ BAdapterIO::Open()
}
-void
-BAdapterIO::Close()
-{
- CALLED();
-
- fOpened = false;
-}
-
-
bool
BAdapterIO::IsRunning() const
{
############################################################################
Revision: hrev50531
Commit: 3ff901ac715531f0c3158c6a6884506c17198425
URL: http://cgit.haiku-os.org/haiku/commit/?id=3ff901ac7155
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Wed Sep 7 16:21:52 2016 UTC
http_streamer: Fix different issues
* Cleanup object management.
* Remove Close() and use the destructor in place.
* Release listener sem on exit.
* Return when there's a request mismatch.
* Add some debugging.
* MediaPlayer crashes are fixed as result of the patchset.
----------------------------------------------------------------------------
diff --git a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp
b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp
index 7259af6..e672f9b 100644
--- a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp
+++ b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp
@@ -10,6 +10,8 @@
#include <HttpRequest.h>
#include <UrlProtocolRoster.h>
+#include "debug.h"
+
// 10 seconds timeout
#define HTTP_TIMEOUT 10000000
@@ -29,7 +31,10 @@ public:
fInitSem = create_sem(0, "http_streamer init sem");
}
- virtual ~FileListener() {};
+ virtual ~FileListener()
+ {
+ _ReleaseInit();
+ }
bool ConnectionSuccessful() const
{
@@ -47,8 +52,10 @@ public:
void DataReceived(BUrlRequest* request, const char* data,
off_t position, ssize_t size)
{
- if (request != fRequest)
+ if (request != fRequest) {
delete request;
+ return;
+ }
BHttpRequest* httpReq =
dynamic_cast<BHttpRequest*>(request);
if (httpReq != NULL) {
@@ -111,16 +118,29 @@ HTTPMediaIO::HTTPMediaIO(BUrl url)
BAdapterIO(B_MEDIA_STREAMING | B_MEDIA_SEEKABLE, HTTP_TIMEOUT),
fContext(NULL),
fReq(NULL),
- fReqThread(-1),
fListener(NULL),
+ fReqThread(-1),
fUrl(url),
fIsMutable(false)
{
+ CALLED();
+
+ // The context has the same life time of the object
+ fContext = new BUrlContext();
+ fContext->AcquireReference();
}
HTTPMediaIO::~HTTPMediaIO()
{
+ CALLED();
+
+ fReq->Stop();
+ status_t status;
+ wait_for_thread(fReqThread, &status);
+
+ fContext->ReleaseReference();
+ delete fContext;
}
@@ -150,8 +170,7 @@ HTTPMediaIO::SetSize(off_t size)
status_t
HTTPMediaIO::Open()
{
- fContext = new BUrlContext();
- fContext->AcquireReference();
+ CALLED();
fListener = new FileListener(this);
@@ -173,23 +192,6 @@ HTTPMediaIO::Open()
}
-void
-HTTPMediaIO::Close()
-{
- fReq->Stop();
- status_t status;
- wait_for_thread(fReqThread, &status);
-
- delete fReq;
- delete fListener;
-
- fContext->ReleaseReference();
- delete fContext;
-
- BAdapterIO::Close();
-}
-
-
bool
HTTPMediaIO::IsRunning() const
{
diff --git a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.h
b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.h
index f844b18..f348ef8 100644
--- a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.h
+++ b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.h
@@ -28,7 +28,6 @@ public:
virtual status_t SetSize(off_t
size);
virtual status_t Open();
- virtual void Close();
virtual bool IsRunning()
const;
diff --git a/src/add-ons/media/plugins/http_streamer/HTTPStreamerPlugin.cpp
b/src/add-ons/media/plugins/http_streamer/HTTPStreamerPlugin.cpp
index 60f5dac..c821b3d 100644
--- a/src/add-ons/media/plugins/http_streamer/HTTPStreamerPlugin.cpp
+++ b/src/add-ons/media/plugins/http_streamer/HTTPStreamerPlugin.cpp
@@ -8,21 +8,28 @@
#include "HTTPMediaIO.h"
+#include "debug.h"
+
HTTPStreamer::HTTPStreamer()
{
+ CALLED();
}
HTTPStreamer::~HTTPStreamer()
{
+ CALLED();
}
status_t
HTTPStreamer::Sniff(const BUrl& url, BDataIO** source)
{
+ CALLED();
+
HTTPMediaIO* outSource = new HTTPMediaIO(url);
+
status_t ret = outSource->Open();
if (ret == B_OK) {
*source = outSource;