Fix for b/4165024: Serious Memory leak when playing a WV protected streaming video.

This change allows the WVM extractor to close and reopen when not in use which resolves
the issue with heap fragmentation between plays.

Change-Id: I160ee1e98aada2bfdd0818eeb6300ad50644fb75
This commit is contained in:
Jeff Tinker
2011-06-27 10:48:26 -07:00
parent fb61fea7ee
commit d63d947d40
2 changed files with 28 additions and 13 deletions

View File

@@ -33,26 +33,25 @@
#include <utils/Errors.h>
/* The extractor lifetime is short - just long enough to get
* the media sources constructed - so the shared lib needs to remain open
* beyond the lifetime of the extractor. So keep the handle as a global
* rather than a member of the extractor
*/
void *gVendorLibHandle = NULL;
namespace android {
static Mutex gWVMutex;
Mutex WVMExtractor::sMutex;
uint32_t WVMExtractor::sActiveExtractors = 0;
void *WVMExtractor::sVendorLibHandle = NULL;
WVMExtractor::WVMExtractor(const sp<DataSource> &source)
: mDataSource(source) {
{
Mutex::Autolock autoLock(gWVMutex);
if (gVendorLibHandle == NULL) {
gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW);
Mutex::Autolock autoLock(sMutex);
if (sVendorLibHandle == NULL) {
CHECK(sActiveExtractors == 0);
sVendorLibHandle = dlopen("libwvm.so", RTLD_NOW);
}
if (gVendorLibHandle == NULL) {
sActiveExtractors++;
if (sVendorLibHandle == NULL) {
LOGE("Failed to open libwvm.so");
return;
}
@@ -60,7 +59,7 @@ WVMExtractor::WVMExtractor(const sp<DataSource> &source)
typedef WVMLoadableExtractor *(*GetInstanceFunc)(sp<DataSource>);
GetInstanceFunc getInstanceFunc =
(GetInstanceFunc) dlsym(gVendorLibHandle,
(GetInstanceFunc) dlsym(sVendorLibHandle,
"_ZN7android11GetInstanceENS_2spINS_10DataSourceEEE");
if (getInstanceFunc) {
@@ -72,6 +71,17 @@ WVMExtractor::WVMExtractor(const sp<DataSource> &source)
}
WVMExtractor::~WVMExtractor() {
Mutex::Autolock autoLock(sMutex);
CHECK(sActiveExtractors > 0);
sActiveExtractors--;
// Close lib after last use
if (sActiveExtractors == 0) {
if (sVendorLibHandle != NULL)
dlclose(sVendorLibHandle);
sVendorLibHandle = NULL;
}
}
size_t WVMExtractor::countTracks() {

View File

@@ -18,6 +18,7 @@
#define WVM_EXTRACTOR_H_
#include <media/stagefright/DataSource.h>
#include <media/stagefright/MediaExtractor.h>
#include <utils/Errors.h>
@@ -67,6 +68,10 @@ private:
WVMExtractor(const WVMExtractor &);
WVMExtractor &operator=(const WVMExtractor &);
static Mutex sMutex;
static uint32_t sActiveExtractors;
static void *sVendorLibHandle;
};
} // namespace android