diff options
author | Jeff Tinker <jtinker@google.com> | 2011-06-27 10:48:26 -0700 |
---|---|---|
committer | Jeff Tinker <jtinker@google.com> | 2011-06-27 12:42:39 -0700 |
commit | 50255a92dfb2ffd35955035ae9ac9d4b85f606b8 (patch) | |
tree | 86093d1e49f305a52d867262079493f4112c1b58 /media/libstagefright/WVMExtractor.cpp | |
parent | b1af69b8f91cf71bef79f56faf981f9a77e507b6 (diff) | |
download | frameworks_av-50255a92dfb2ffd35955035ae9ac9d4b85f606b8.zip frameworks_av-50255a92dfb2ffd35955035ae9ac9d4b85f606b8.tar.gz frameworks_av-50255a92dfb2ffd35955035ae9ac9d4b85f606b8.tar.bz2 |
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
Diffstat (limited to 'media/libstagefright/WVMExtractor.cpp')
-rw-r--r-- | media/libstagefright/WVMExtractor.cpp | 36 |
1 files changed, 23 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() { |