diff options
author | Jeff Tinker <jtinker@google.com> | 2011-06-28 10:12:08 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-06-28 10:12:08 -0700 |
commit | 306bafcd7cabeb9059e066296cd225b8b03968a2 (patch) | |
tree | e5a598c909be525ba8b1a6db14cbbd2abdc070c9 | |
parent | 1e06f435434681f8750cc21763868fd025e8480e (diff) | |
parent | 50255a92dfb2ffd35955035ae9ac9d4b85f606b8 (diff) | |
download | frameworks_av-306bafcd7cabeb9059e066296cd225b8b03968a2.zip frameworks_av-306bafcd7cabeb9059e066296cd225b8b03968a2.tar.gz frameworks_av-306bafcd7cabeb9059e066296cd225b8b03968a2.tar.bz2 |
Merge "Fix for b/4165024: Serious Memory leak when playing a WV protected streaming video."
-rw-r--r-- | media/libstagefright/WVMExtractor.cpp | 36 | ||||
-rw-r--r-- | media/libstagefright/include/WVMExtractor.h | 5 |
2 files changed, 28 insertions, 13 deletions
diff --git a/media/libstagefright/WVMExtractor.cpp b/media/libstagefright/WVMExtractor.cpp index 26eda0c..7072d58 100644 --- a/media/libstagefright/WVMExtractor.cpp +++ b/media/libstagefright/WVMExtractor.cpp @@ -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() { diff --git a/media/libstagefright/include/WVMExtractor.h b/media/libstagefright/include/WVMExtractor.h index deecd25..0817bab 100644 --- a/media/libstagefright/include/WVMExtractor.h +++ b/media/libstagefright/include/WVMExtractor.h @@ -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 |